OpenCV Python,为什么霍夫圆变换不能找到所有的圆?

4

我花了很长时间去寻找问题所在,但我并没有真正理解参数和预处理的影响。我无法发布图片,但在一张非常清晰的欧元照片上,程序可以识别一些圆形而不是另外一些,即使它们与其他圆形完全一样清晰。

以下是我的代码:

'$'

 import cv2
 import numpy as np

 filename = r'C:\Users\roseline\Desktop\piecefacile.jpg'
 img = cv2.imread(filename)
 output = img.copy()
 gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #BGR donnant GRAY


 circles = cv2.HoughCircles(gray, cv2.cv.CV_HOUGH_GRADIENT,1, 70, 200, 100)  


 if circles is not None:
 circles = np.round(circles[0,:]).astype("int") #convertit en entier les données

for (x,y,r) in circles:
    cv2.circle(output, (x,y), r, (0,255,0), 4)
    cv2.rectangle(output, (x-2,y-2), (x+2,y+2), (0,128, 255), -1)

cv2.imshow("2015_TIPE_LE_DEM", np.hstack([img, output]))

cv2.waitKey(0)

非常抱歉给您带来了麻烦,我希望能有人帮助我并分享他所拥有的知识,让我也能受益。


请将您检测到的圆形用轮廓线标记的图像发布在此处,或者更好的方法是将您的图片发布在其他地方,例如Picasa。 - Moritz
感谢您的快速回复!该网站没有给我上传图片的权限,但是我制作了这个链接 http://imageshack.com/a/img540/2425/Hy5rB3.jpg - Betty LD
阅读一些文档,向大学的同事询问。Matlab文档非常好(imfindcircles)。除非您将带有识别出的圆圈高亮显示的图像发布,否则我无法确定问题所在。 - Moritz
http://imageshack.com/a/img538/6857/BNemFA.png - Betty LD
我制作了这个版本以使其更加清晰。 - Betty LD
显示剩余2条评论
1个回答

1

看起来你设置硬币的最小和最大半径有误。算法没有检测到更小的硬币,因为它没有寻找它们,并且由于你将阈值设置得太低,最大半径设置得太高,它也会找到错误的正面命中。

查看这个教程文档,并尝试调整min_radius和max_radius参数(同时将它们都减小)。你可以预先测量硬币的半径(以像素为单位)。

如果仍然出现正面命中,请尝试调整param1和param2参数。如果您想自动化这个过程,可以使用互相关。

看到你的灰度图像将非常有趣。如果你的实际数据与硬币图像一样简单,那么你真的很幸运。在许多情况下,最难的部分是消除噪声。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接