推文:Opencv2.4.9源碼分析——HoughCircles
霍夫圓檢測
加載一幅圖像並對其模糊化以降噪
對模糊化后的圖像執行霍夫圓變換 .
在窗體中顯示檢測到的圓.
def detect_circle_demo(image): # dst = cv.bilateralFilter(image, 0, 150, 5) #高斯雙邊模糊,不太好調節,霍夫噪聲敏感,所以要先消除噪聲 # cv.imshow("1",dst) # dst = cv.pyrMeanShiftFiltering(image,5,100) #均值遷移,EPT邊緣保留濾波,霍夫噪聲敏感,所以要先消除噪聲 # cv.imshow("2", dst) dst = cv.GaussianBlur(image,(13,15),15) #使用高斯模糊,修改卷積核ksize也可以檢測出來 # cv.imshow("3", dst) gray = cv.cvtColor(dst,cv.COLOR_BGR2GRAY) circles = cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0) circles = np.uint16(np.around(circles)) #around對數據四舍五入,為整數 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("detect_circle_demo",image) src = cv.imread("./c.png") #讀取圖片 cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #創建GUI窗口,形式為自適應 cv.imshow("input image",src) #通過名字將圖像和窗口聯系 detect_circle_demo(src) cv.waitKey(0) #等待用戶操作,里面等待參數是毫秒,我們填寫0,代表是永遠,等待用戶操作 cv.destroyAllWindows() #銷毀所有窗口
相關知識補充:
(一)HoughCircles方法
1.加載一幅圖像 2.執行高斯模糊以降低噪聲:GaussianBlur 3.轉成灰度圖:cvtColor 4.執行霍夫圓變換:HoughCircles
def HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None): # real signature unknown; restored from __doc__
cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
1.image:輸入圖像 (灰度圖) 2.method:指定檢測方法. 現在OpenCV中只有霍夫梯度法 3.dp:累加器圖像的反比分辨=1即可默認 4.minDist = src_gray.rows/8: 檢測到圓心之間的最小距離,這是一個經驗值。這個大了,那么多個圓就是被認為一個圓。 5.param_1 = 200: Canny邊緣函數的高閾值 6.param_2 = 100: 圓心檢測閾值.根據你的圖像中的圓大小設置,當這張圖片中的圓越小,那么此值就設置應該被設置越小。當設置的越小,那么檢測出的圓越多,在檢測較大的圓時則會產生很多噪聲。所以要根據檢測圓的大小變化。 7.min_radius = 0: 能檢測到的最小圓半徑, 默認為0. 8.max_radius = 0: 能檢測到的最大圓半徑, 默認為0