霍夫变换——HoughLines、HoughLinesP和HoughCircles
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                霍夫变换——HoughLines、HoughLinesP和HoughCircles
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                一、霍夫變換
1、霍夫變換是一種在圖像中尋找直線、圓形及其他簡單形狀的方法。
 2、笛卡爾空間與霍夫空間映射關系
- 笛卡爾空間內的一條直線確定了霍夫空間內的一個點。
- 霍夫空間內的一個點確定了笛卡爾空間內的一條直線。
3、霍夫變換選擇直線的基本思路:選擇由盡可能多條線匯成的點。
二、直線檢測
1、繪制直線方法
- 垂直方向的直線,計算它與圖像水平邊界的交叉點,在兩個交叉點之間畫線。
- 水平方向的直線,在圖像的第一列和最后一列之間畫線。
2、cv.line優點
沒有必要檢查交叉點是否位于圖像內部,即使點的坐標超出了圖像的范圍,也能正確畫出線來。
3、基本霍夫變換——HoughLines函數
 (1)要求:所操作的原圖像是一個二值圖像,變換之前先將原圖像進行二值化或進行canny邊緣檢測。
 (2)HoughLines檢測到的是圖像中的直線而不是線段,即檢測到的直線是沒有端點的。
 (3)代碼
 
 2、概率霍夫變換——HoughLinesP函數
概率霍夫變換沒有考慮所有的點,只需要一個足以進行檢測的隨機點子集即可。
def line_detect_possible_demo(image):gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)edges = cv.Canny(gray, 50, 150, apertureSize=3)"""HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None)minLineLength:用來控制“接受直線的最小長度”的值,默認0maxLineGap:用來控制接受共線線段之間的最小間隔,如果兩點之間的最大間隔大于maxLineGap,認為這兩點不在一條線上,默認0"""lines = cv.HoughLinesP(edges, 1, np.pi / 180, 100, minLineLength=50, maxLineGap=10)for line in lines:x1, y1, x2, y2 = line[0]cv.line(image, (x1, y1), (x2, y2), (0, 255, 0), 2)cv.imshow('line_detect_possible_demo', image)
 
三、圓檢測
在霍夫圓變換中,需要考慮圓半徑和圓心(x坐標,y坐標)共3個系數,采用的策略是兩輪篩選。第1輪篩選找出可能存在圓的位置(圓心),第2輪再根據第1輪的結果篩選出半徑大小。
def Mdetect_circles_demo(image):""":param image: pyrMeanShiftFiltering(src, sp, sr, dst=None, maxLevel=None, termcrit=None):return: src:輸入圖像,8位,三通道的彩色圖像sp:定義的漂移物理空間半徑大小sr:定義的漂移色彩空間半徑大小dst:輸出圖像,跟輸入src有同樣的大小和數據格式maxLevel:定義金字塔的最大層數termcrit:定義的漂移迭代終止條件,可以設置為迭代次數滿足終止,迭代目標與中心點偏差滿足終止,或者兩者的結合"""# pyrMeanShiftFiltering:漂移圓檢測dst = cv.pyrMeanShiftFiltering(image, 50, 30)circles = np.uint16(np.around(dst))for i in circles[0, :]:cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)cv.imshow('Mdetect_circles_demo', image)def circles_demo(image):# 消除噪聲cimage = cv.cvtColor(image, cv.COLOR_BGR2GRAY)circle = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)circles = np.uint16(np.around(circle))for i in circles[0, :]:# 取圓心cv.circle(image, (i[0], i[1]), 2, (255, 0, 0), 2)cv.imshow('circles_demo', image)def detect_circles_demo(image):# 消除噪聲cimage = cv.cvtColor(image, cv.COLOR_BGR2GRAY)"""HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)image:8位單通道灰度圖像method:檢測方法,HOUGH_GRADIENT:基于梯度做比較快且是唯一可用的參數值dp:累加器分辨率,用來指定圖像分辨率與圓心累加器分辨率的比率。1表示輸入圖像和累加器具有相同的分辨率。minDist:圓心間的最小間距。如果存在圓心間距離小于該值的圓,僅有一個會被檢測出來。如20:把小于20最近的多個合并成一個圓。circles:返回值,由圓心坐標和半徑構成的numpy.ndarryparam1:缺省,默認100.對應是canny邊緣檢測器的高閾值(底閾值是高閾值的二分之一)param2:圓心位置必須收到的投票數。值越大,檢測到的圓越少;越小,檢測到的圓越多。缺省,默認100.minRadius:圓半徑的最小值,小于該值的圓不會被檢測出來。缺省,默認0,不起作用。maxRadius:圓半徑的最大值,大于該值的圓不會被檢測出來。缺省,默認0,不起作用。"""circle = cv.HoughCircles(cimage, cv.HOUGH_GRADIENT, 1, 20, param1=50, param2=30, minRadius=0, maxRadius=0)"""around(a, decimals=0, out=None)a:輸入列表或矩陣decimals:為n對輸入近似后保留小數點后n位,默認為0,若值為-n,則對小數點左邊第n位近似out:保存近似返回結果"""circles = np.uint16(np.around(circle))for i in circles[0, :]:# 圖像,中心點位置,半徑,顏色"""circle(img, center, radius, color, thickness=None, lineType=None, shift=None)img:單通道或多通道的圖像center:圓心坐標radius:半徑,數值為整數類型color:圓線條的顏色thickness:圓線條的粗細,值越大則線條越粗。lineType:線條的類型。CV_AA(采用了高斯濾波)三個值,分別代表8鄰接連接線,4鄰接連接線和反鋸齒連接線,默認值為8鄰接。shift:圓心坐標點和半徑值的小數點位數,數值為整數類型。"""# 圓變換cv.circle(image, (i[0], i[1]), i[2], (0, 0, 255), 2)cv.imshow('detect_circles_demo', image)總結
以上是生活随笔為你收集整理的霍夫变换——HoughLines、HoughLinesP和HoughCircles的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 怎么使用CAM350检查Gerber?
- 下一篇: KMP算法学习
