霍夫圓檢測對噪聲比較敏感,所有進行霍夫圓檢測的時候要先進行中值濾波。
在OpenCV中是通過圖像梯度來實現霍夫變換圓檢測的,因此要選用cv2.HOUGH_GRADIENT這個參數。
其實現分爲兩步:
- 檢測圖像邊緣,發現可能的圓心
- 從候選圓心中計算最佳半徑大小
import cv2
import numpy as np
smarties = cv2.imread(r"F:\Python\picture\smarties.png")
gray_img= cv2.cvtColor(smarties,cv2.COLOR_BGR2GRAY)
#進行中值濾波
img = cv2.medianBlur(gray_img,5)
circles = cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,20,param1=50,param2=35,minRadius=0,maxRadius=0)
#對數據進行四捨五入變爲整數
circles = np.uint16(np.around(circles))
for i in circles[0,:]:
#畫出來圓的邊界
cv2.circle(smarties,(i[0],i[1]),i[2],(0,0,0),2)
#畫出來圓心
cv2.circle(smarties,(i[0],i[1]),2,(0,255,255),3)
cv2.imshow("Circle",smarties)
cv2.waitKey()
cv2.destroyAllWindows()
實現效果:
cv2.HoughCircles(gray_img, method, dp, min_dist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
- gray_img 輸入圖像(灰度圖)
- method 這裏應選用cv2.HOUGH_GRADIENT
- dp 累加器精度,一般默認爲1
- min_dist 檢測到圓心的最短距離,這個值如果大了,就會多個圓被認爲是一個圓
- circles 找到圓的輸出矢量,默認爲None即可
- param1 Canny函數的高閾值
- param2 圓心檢測閾值。根據你的圖像中的圓大小設置,當這張圖片中的圓越小,那麼此值就設置應該被設置越小。當設置的越小,那麼檢測出的圓越多,在檢測較大的圓時則會產生很多噪聲。所以要根據檢測圓的大小變化。
- minRadius 能檢測到最小圓的半徑,默認爲0
- maxRadius 能檢測到最大圓的半徑,默認爲0
- 最小圓半徑和最大圓半徑可以輔助我們更好選則圓,如果沒有特殊需要就都默認爲0即可