一、獲取圓形檢測原理
原圖如下:
選取一個圓的任意點設定為圓形進行繪制圓形,交與一點
再將平面直角坐標系上的各點,通過公式轉到極坐標上
很明顯的看出較亮的點為圓心,然后通過半徑進行繪制出圓。
二、實現步驟
由于霍夫圓檢測對噪聲比較明顯,故需要首先對圖像進行濾波操作(中值濾波等)
霍夫圓形檢測是基于圖像梯度實現的,分為兩步:
1,檢測邊緣,發現可能是圓的圓形
2,基于第一步從候選的圓心中開始計算,求出最佳的半徑大小
三、代碼實現
cv2.HoughCircles(cimage,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)
cv2.HOUGH_GRADIENT:基于梯度計算
1:步長
20:最小距離即檢測出來的兩個圓形之間的最小距離,超過這個最小距離才會認定是兩個圓
param1=50,param2=30:高低閾值的設定
minRadius=0,maxRadius=0:當不確定圓的半徑時,可以這樣設定
import cv2
import numpy as np
from matplotlib import pyplot as pltdef detect_circles(image):dst = cv2.pyrMeanShiftFiltering(image,10,100)#消除噪聲!!!!必不可少cimage = cv2.cvtColor(dst,cv2.COLOR_BGR2GRAY)circles = cv2.HoughCircles(cimage,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=30,minRadius=0,maxRadius=0)circles = np.uint16(np.around(circles))for i in circles[0,:]:cv2.circle(image,(i[0],i[1]),i[2],(0,0,255),2)cv2.circle(image,(i[0],i[1]),2,(255,0,0),2)#圓心cv2.imshow("circles",image)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\circles.jpg")
cv2.imshow("image",src)
cv2.namedWindow("image",cv2.WINDOW_AUTOSIZE)
detect_circles(src)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果圖如下: