基於梯度的霍夫圓檢測

基於梯度的霍夫圓檢測原理 略

直接看代碼

一、首先讀取一張圖片,處理成灰度圖。並對其做濾波降噪,因爲霍夫圓檢測是對噪聲敏感的。這裏用到的降噪方法一般是用保留邊緣的濾波。

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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章