基于梯度的霍夫圆检测原理 略
直接看代码
一、首先读取一张图片,处理成灰度图。并对其做滤波降噪,因为霍夫圆检测是对噪声敏感的。这里用到的降噪方法一般是用保留边缘的滤波。
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)