如何删除错误检测?

时间:2013-04-16 08:36:22

标签: opencv image-processing

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

enter image description here enter image description here

4 个答案:

答案 0 :(得分:7)

在这种特定情况下,Hough Circle Transform可能是最简单的解决方案。

复制教程中的代码并将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()

答案 1 :(得分:6)

一个选择是有点hacky: 在findContours之上使用minEnclosingCircle并按分钟过滤轮廓。基于阈值包围半径(移除小于半径A(移除微小的斑点)并且大于半径B(移除巨大的斑点))。您也可以尝试minAreaRect并检查宽度/高度比,以查找均匀的斑点,而不是高/宽斑点。

较少hacky的解决方案是使用Hough变换。看看hough circle和教程

答案 2 :(得分:1)

现在我想我已经用自己的算法成功地解决了这个问题。只需发布以供将来参考。

如下图所示,可以准确定位所有椭圆。并且成功删除了错误检测。另一方面,算法非常节省时间:在我的普通桌面上进行所有图像处理的时间为0.03秒。图像大小:448x336像素

算法的程序:

  1. 使用函数findContours
  2. 从二进制图像中检测轮廓
  3. 通过设置轮廓最小尺寸的阈值来移除太小的
  4. 使用fitEllipse [/ li>函数检测椭圆
  5. 将轮廓与相应的椭圆进行比较。具体而言,将所有轮廓点替换为一般椭圆方程(参见http://www.maa.org/joma/volume8/kalman/general.html)。然后计算代数误差。如果误差小于阈值,则排除该轮廓。
  6. enter image description here

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

答案 3 :(得分:1)

虽然之前已经接受了另一个答案,但有几个选项需要探讨,所以我将添加另一个答案。假设Hough方法对于您的应用来说足够快,这里有一些有趣的选择:

  1. Ellipse detection with 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
  5. 我可能还会补充说,Hough可能是继续可靠地检测省略号的“正确”方法,但您可能遇到其他挑战。您表明Hough圈在桌面上足够快,但桌面性能与嵌入式系统的匹配程度如何?嵌入式系统是否有浮点单元?如果没有,请不要对软件模拟浮点所表现出的性能过于担心。您仍然可以使用定点数学,查找表等令人满意地实现Hough算法。