推文: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() #銷燬全部窗口
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