为什么cv2.HoughCirles minRadius和maxRadius似乎需要半径周围的“填充”才能工作?

2024-10-01 07:48:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在用OpenCV进行实验,用cv2.HoughCircles检测文档上的循环戳记。有些邮票褪色了,而且是部分的,所以我不得不增加dp,最后发现了很多圆。谢天谢地,这些标记的半径范围很窄,所以我希望使用minRadius和maxRadius来过滤掉大多数/所有的误报。当我尝试这样做时,我发现我需要将填充添加到可接受的范围。所需的填充量似乎各不相同,有时相当大。你知道吗

当我发现这一点时,邮票是低分辨率扫描文件的radius=35。但是,我发现我必须设置minRadius=25maxRadius=75才能检测到它。你知道吗

我设置了一个jupyter notebook on Google Collaboratory来说明这一点,创建了一个250x250的白色图像,中间有一个radius=100灰色的圆。我仍然需要“填充”范围才能检测到它,但没有我的真实例子中那么多。此外,我发现改变HOUGHGRADIENT的dp值会改变所需的填充量。我还发现改变填充改变了检测到的半径!你知道吗

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.71, 10, minRadius=95, maxRadius=105)

在Colab示例中,我只需要填充大约+/-5%,这很好,但是对于实际文档,我需要填充2或更多的因子,这会导致太多误报。你知道吗

当我写这个问题的时候,我突然想到,我可以在结果中循环,抛出太小或太大的圆圈,这可以解决我眼前的问题,但不能帮助我理解发生了什么。那么,我错过了什么?你知道吗

circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1.71, 10, minRadius=95, maxRadius=105)

我希望如果该方法找到一个半径为100的圆,那么设置minRadius=maxRadius=100仍然允许它被检测到,但是我必须设置一个更宽的范围。此外,改变范围可能会改变检测到的半径,这是我无法预料的。你知道吗


Tags: 文档半径cv2opencvdp误报gradientradius