我正在尝试使用具有以下参数的HoughCircle在图像上建立可靠的硬币检测:
blured_roi = cv2.GaussianBlur(region_of_interest, (23, 23), cv2.BORDER_DEFAULT)
rows = blured_roi.shape[0]
circles = cv2.HoughCircles(blured_roi, cv2.HOUGH_GRADIENT, 0.9, rows/8,
param1=30, param2=50, minRadius=30, maxRadius=90)
关注区域可以是(300x300)或(1080x1920)。因此minRadius
和maxRadius
在这里并没有帮助。但是在每种图像形状中,它们的大小大约都相当于我的硬币大小。
为此,我尝试了很多事情。首先,使用带有GaussianBlur
滤镜的简单灰色图像。
可以在大多数情况下使用,但是如果我的硬币边框与背景色类似,则灰度图将无法真正帮助检测圆的半径,请看以下示例:
第二次,我尝试使用硬币的边缘来检测Canny Transform的圆圈,但是正如您所见,Canny滤镜无法按我希望的那样工作。所以我将GaussianBlur
设为(13,13)。
我也知道HoughCircle
方法中还有另一个canny transform调用,但是我想确保我会得到硬币的边缘,因为在{ {1}}。
最后,我尝试使用经过脱粒处理的图像,但我不明白为什么它不如预期的那样好用,因为在此图像上,我们希望不会有任何噪音,因为它只是黑白(?),并且这个圆圈几乎是完美的。并应用(9,9)的GaussianBlur
。
在这里您可以看到它未能检测到脱粒图像上的硬币,但是它可以与Canny边缘图像一起使用。但是在许多其他情况下,边缘检测中的霍夫变换无法得到完美的结果,而且我对脱粒图像感到一致,如您所见,脱粒图像显示出一个漂亮的圆圈。
我想了解为什么它在脱粒后的图像上不起作用(如上面的示例),以及如何使它起作用。
编辑1:因此,我发现了GaussianBlur
方法中要指定的另一种BORDER类型。我认为改进“脱粒”图像上的哈夫圆检测确实很有用,但效果不如预期。