基於梯度的霍夫圓檢測原理 略
直接看代碼
一、首先讀取一張圖片,處理成灰度圖。並對其做濾波降噪,因爲霍夫圓檢測是對噪聲敏感的。這裏用到的降噪方法一般是用保留邊緣的濾波。
src = cv.imread("D:/pythonTest/img/11.jpg")
gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)
gray = cv.fastNlMeansDenoising(gray,None,15,10,30)
cv.imshow("input",src)
我用的是這張圖:
二、然後就可以用霍夫圓檢測啦。
rows,cols = gray.shape
circles=cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,rows/8,None,param1=100,param2=30,minRadius=20,maxRadius=90)
if circles is not None:
for i in circles[0,:]:
centers = (i[0],i[1])
raidus = i[2]
cv.circle(src,centers,2,(0,0,255),-1,8,0) #繪出中心
cv.circle(src, centers, raidus, (0, 0, 255), 3, 8, 0) #繪出輪廓
cv.imshow("circles",src)
於是得到:
挺完美的是不是 ~ ~
這裏劃出重點:
cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,rows/8,None,param1=100,param2=30,minRadius=20,maxRadius=90)
這裏的參數調整是關鍵,要根據不同的圖片來調節參數,纔能有好的效果。
參數:
(灰度圖,
方法選擇霍夫梯度法,
與原圖的比例分辨率 [ 1表示與原圖一致 ] ,
區分兩個不同圓的最小距離 [ 如果最小距離太小,就會有很多重複的圓 ],
param1 Canny的閾值上限,
param2 累加器的閾值,
minRadius 能檢測到的圓的最小半徑,
maxRadius 能檢測到的圓的最大半徑)
一般會去調整最小距離和半徑。按需求收縮半徑範圍可以有效的加快檢測速度。
下面是另外兩張圖的應用:
(1):
circles=cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,rows/8,None,param1=100,param2=30,minRadius=20,maxRadius=110)
(2):
circles=cv.HoughCircles(gray,cv.HOUGH_GRADIENT,1,rows/8,None,param1=100,param2=30,minRadius=50,maxRadius=80)