【问题标题】:How to filter contours made of overlapping circles in OpenCV如何在OpenCV中过滤由重叠圆构成的轮廓
【发布时间】:2012-07-27 12:17:01
【问题描述】:

我正在使用 OpenCV/C++ 框架,在一个基本上计算可以重叠的椭圆对象的程序上工作。

对图像进行阈值处理并找到所有对象的轮廓

我的下一步是排除不是由重叠椭圆组成的对象(我稍后会分割其余的)。

我最终得到了这些对象:

在此示例图像中,右侧的所有对象都是负数,而左侧的所有对象都是有效的。

我当前的过滤器主要排除对象isoperimetric quotient。 但是,由于我的对象具有不同的大小和噪声,我并不总是对这种方法感到满意。

理想情况下,我希望有一个额外的指标来提高我当前过滤器的效率。

由于我必须在许多轮廓上重复此分析,因此成本不应该很高。

我考虑过以下方法:

  • 基于轮廓中连续点的所有三元组之间角度值的直方图?
  • 在数学上拟合“多边形椭圆”(我不知道该怎么做)?
  • 匹配freeman链?

但我确信我错过了一些更有效、更简洁的显而易见的东西。 你有什么建议吗, 谢谢你:),

编辑: 正如雷吉斯正确地建议的那样,任何形状实际上都可以由足够数量的圆圈组成。 因此,为了使我的问题可解决,我将添加以下假设:

  1. 不超过 16 个椭圆/对象。
  2. 椭圆不能太平:长轴/短轴
  3. 在一个对象中,最大椭圆的面积与最小椭圆的面积必须小于 10。

【问题讨论】:

    标签: c++ algorithm image-processing opencv geometry


    【解决方案1】:

    一种可能性是尝试:

    1. 提取对象的轮廓
    2. 沿轮廓等间距的采样点
    3. 使用这些点来确定规则间距的方向(最好使用复数来表示该方向以避免环绕问题)
    4. 使用这些方向计算规则间距的曲率
    5. 基于此曲率的度量,例如寻找曲率样本超过 80% 在正确范围内的对象。

    您期望看到的曲率图是一系列常数值(或者,如果形状是椭圆而不是圆形,则变化缓慢),从一个圆形变为另一个圆形时会突然间断。

    如果您的图像有噪点,您可能希望先对曲率值进行低通滤波。

    由圆形/椭圆形构成的形状大多在周边具有明显的曲率,而由直边构成的形状将具有低曲率的部分。

    【讨论】:

    • 比你,我会努力解决这个问题。你有任何我可以开始的链接吗?
    【解决方案2】:

    我怀疑任何形状都可以从足够大的重叠椭圆集合中创建出来,并且您的手上有一个定义不明确的问题。除非我误解了你的问题陈述。

    【讨论】:

    • 谢谢你,你是对的,足够数量的小圆圈/椭圆确实可以定义任何形状。我应该陈述额外的假设(这对我的问题来说是公平的),例如:1)不太可能观察到超过 10 个重叠的圆圈。 2)在同一形状内,最小椭圆的面积不会小于最大椭圆面积的十分之一。
    【解决方案3】:

    您是否查看过Hough-Transformations 中的圆形和椭圆?甚至还有一个OpenCV implementation 可供圈子使用。这些转换必须应用于对象的轮廓。

    【讨论】:

    • 谢谢,我确实试过了,谢谢 :D。对我来说,它在夹住的物体上效果不佳......我现在正在研究以下方法:1)制作一个正负样本库。 2) 从二值图像计算特征。 3) 使用机器学习技术训练分类器...
    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 2021-09-07
    • 2020-09-22
    相关资源
    最近更新 更多