使用Hough圆变换检测圆形数组

3
我正在尝试检测数组中的所有圆。为了实现这一目标,我使用了霍夫圆变换。我能够检测到数组中的100%圆,但是有很多误报,当我去除误报时,就无法检测到100%的圆。当我将代码中的dp参数更改为1时,所有的误报都消失了;而当我将其保持为3时,就会出现许多误报,但仍然能够检测到100%的圆。我希望以0或极少数的误报来获得100%的检测结果。如何最好地实现这一目标?
import cv2
import cv2.cv as cv
import numpy as np

img = cv2.imread('test1.tiff',0)
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)

circles = cv2.HoughCircles(img, cv.CV_HOUGH_GRADIENT,3,15,
                        param1=70 ,param2=17,minRadius=1,maxRadius=10)

circles = np.uint16(np.around(circles))
for i in circles[0,:]:
# draw the outer circle
    cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)

cv2.imshow('detected circles',cimg)
cv2.imwrite("output15.jpg", cimg)
cv2.waitKey(0)
cv2.destroyAllWindows()

这里有一张示例图片:

原始图片

无误报 误报


你的代码中哪一个是“dp”,它调整了什么? - Ben
无论如何,这只是在玩弄参数。很可能你不会得到你想要的那么好。Hough算法相当有限。你应该编写一个脚本来自动运行变换,并选择你喜欢的那个。这总是可以节省很多时间的。Hough算法也对噪声非常敏感,所以你可以尝试稍微去噪一下图像,看看是否有帮助。 - Ben
cv.CV_HOUGH_GRADIENT后面的值3是dp参数。我正在尝试调整参数,但我认为我不会得到我想要的结果。我会尝试像你建议的那样对图像进行去噪。除此之外,您还能推荐其他方法让我检测圆形吗? - user3756616
为什么你要这样加载图像:img = cv2.imread('test1.tiff',0) cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR),它不是已经是彩色图像了吗? - Яois
你还没有告诉我"dp"是什么意思,现在我不得不自己去查。这可能不是你需要调整的唯一参数。正如你所知,霍夫变换首先进行边缘检测,而且有许多淡出的圆形,因此如果你想真正检测到它们,你必须将阈值设置得非常低。请发布你的误报图片。 - Ben
抱歉Ben,我不能告诉你dp的事情。我已经在问题中添加了结果图像。我一直在尝试调整所有必要的参数,但是没有得到100%的检测。 - user3756616
1个回答

5
由于这些圆形都是黑色的,为什么不用形态学运算滤掉它们,然后从过滤后的图片中减去原始图片以得到良好的响应呢?形态学并不特别快,但比Hough算法快。你可以用一个圆形来膨胀背景,直到黑色消失,然后从原始图像中减去它。然后进行阈值处理。接下来可以进行大小过滤,以消除任何可能通过的小碎片。
鉴于这个应用程序,我认为除非这是一项学校项目,否则Hough算法不是最佳选择。

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