如何消除虚假检测?

7
我正在使用OpenCV在二进制图像中检测椭圆,如下所示。在图像中,有八个椭圆需要被检测出来。我可以使用findContours获取许多轮廓,包括这八个椭圆。问题是:如何判断哪一个是椭圆,哪一个不是?如何去除所有其他的错误检测?

1
如果您有某种圆形,可以检查轴的比例和轴的大小,并过滤噪声。 - mrgloom
1
以下是有关编程的内容,翻译为中文:如何检查轮廓是否为椭圆?请仅提供翻译后的文本。 - Quentin Geissmann
4个回答

8
在这种情况下,霍夫圆变换可能是最简单的解决方案。从教程中复制代码,并更改cv::HoughCircles()的参数为:
/// Apply the Hough Transform to find the circles
HoughCircles( src_gray, circles, CV_HOUGH_GRADIENT, 1, 10, 40, 30, 0, 0 );

输出:

enter image description here

但是我喜欢 @George 的想法,跟随它,比指定硬编码常量更加强大。我的方法对于这张图片非常有效,但如果你有不同尺寸的圆形和其他图像,则应使用cv::minEnclosingCircle()


7

一种可行的方法有些hacky:在findContours上方使用minEnclosingCircle,并根据阈值过滤最小包围半径的轮廓(删除小于半径A的轮廓(删除微小斑点)和大于半径B的轮廓(删除巨大斑点))。您还可以尝试minAreaRect并检查宽度/高度比以寻找均匀斑点而不是高/宽斑点。

更少hacky的解决方案是使用霍夫变换。请查看hough circle和教程。


谢谢。我认为去除太大或太小的轮廓是有用的。事实上,我有一个想法,可以使用胡氏矩来消除虚假检测。也就是说:首先计算一些训练椭圆的胡氏矩。然后对于每个轮廓,计算它的胡氏矩,如果它们与训练数据非常不同,那么我们可以排除该轮廓。你觉得这个想法有用吗? - Shiyu
我自己没有使用过霍夫矩,所以无法从经验上提供建议。霍夫圆似乎可以满足您的需求。很抱歉我不能提供更多帮助。 - George Profenza
@George Profenza:无论如何,谢谢你。 - Shiyu

1
现在我认为我已经成功地使用自己的算法解决了问题。只是为了将来参考而发布。如下所示,所有椭圆都可以准确地定位。并且成功地消除了错误检测。另一方面,该算法非常高效:在我的普通桌面上进行所有图像处理的时间为0.03秒。图像大小:448x336像素。
算法的步骤:
1. 使用函数findContours从二进制图像中检测轮廓。 2. 通过设置轮廓的最小大小阈值来删除太小的轮廓。 3. 使用函数fitEllipse检测椭圆。 4. 将所有轮廓点替换为通用椭圆方程(见http://www.maa.org/joma/volume8/kalman/general.html),然后计算代数误差与相应的椭圆进行比较。如果误差小于阈值,则排除该轮廓。

enter image description here

编辑:对George Profenza和karlphillip的回答进行评论。感谢George Profenza和karlphillip的回答。然而,他们的答案无法很好地解决问题。George Profenza提出的第一个想法是为轮廓的大小设置阈值。实际上,我在我的算法中使用了这个想法。但显然这只是算法的初步步骤。有许多“好”的大小的误检测。George Profenza的第二个想法是使用HoughCircles,这也是karlphillip提出的。HoughCircles的问题是:(a)它很慢,而我需要在嵌入式系统中实时实现算法。(b)它只能检测圆形而不能检测椭圆形。当椭圆接近圆形时,它也可以工作。但对于一般情况,它不行。此外,我上面的方法不能检测“8字形”。这是一个大问题,我仍在努力解决。

似乎你的算法错过了右下角的两个椭圆(“8”形)。这是一个问题吗?请注意,Hough方法找到了它们。 - Throwback1986
1
是的。我想知道你是否使用了霍夫圆变换。正如George和Karl所建议的那样,这个问题似乎很适合使用它。总的来说,像霍夫变换这样的方法往往比简单的启发式方法更加健壮。 - lightalchemist
@Throwback1986:谢谢你的评论。首先,我不使用HoughCircles的原因是:(a) 它很慢(对吧?),而我需要在嵌入式系统中进行实时实现。(b) 它只能找到圆形而不能找到椭圆(对吧?)。当然,当椭圆接近圆形时,它也能找到椭圆。其次,“figure 8”确实是一个大问题。事实上,我仍在解决这个问题。对此有什么想法吗? - Shiyu
@lightalchemist:感谢您的评论。请查看我上面的回复。 - Shiyu
1
@Shiyu:你确认了霍夫圆技术对你的应用来说太慢了吗? - Throwback1986
显示剩余3条评论

1

虽然之前已经有另一个答案被接受,但还有几个选项需要探索,所以我会添加另一个答案。假设Hough方法对您的应用程序足够快,这里有一些有趣的替代方案:

  1. 使用OpenCV进行椭圆检测
  2. http://toyhouse.cc/profiles/blogs/modified-hough-ellipse-transform-detecting-ellipse-in-an-accurate
  3. http://www.codeforge.com/article/131943
  4. 我在上面的评论中添加的论文:http://www.bmva.org/bmvc/1988/avc-88-041.pdf
我还想补充的是,Hough算法可能是可靠检测椭圆的“正确”方法,但您可能会遇到额外的挑战。您表明Hough圆在您的台式机上足够快,但是台式机的性能如何与嵌入式系统匹配?嵌入式系统是否具有浮点单元?如果没有,不要对软件模拟浮点所展示的性能过于担心。您仍然可以使用定点数学、查找表等方式满意地实现Hough算法。

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