如何在OpenCV中过滤由重叠圆圈组成的轮廓

时间:2012-07-29 17:05:30

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

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

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

我的下一步是排除不是由重叠椭圆组成的对象(稍后我将对剩余的对象进行分段)。

我最终得到了这些对象:

enter image description here

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

我当前的过滤器主要以isoperimetric quotient为基础排除对象。 然而,由于我有不同大小和噪音的物体,我并不总是对这种方法感到满意。

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

由于我必须在许多轮廓上重复这种分析,因此不应该付出昂贵的代价。

我考虑过以下方法:

  • 基于轮廓中连续点的所有三连体之间角度值的直方图的东西?
  • 以数学方式拟合“多椭圆”(我不知道该怎么做)?
  • 匹配自由人链?

但我确信我错过了一些更有效,更少杂乱的明显事物。 你有什么建议吗, 谢谢:),

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

  1. 不超过16个椭圆/对象。
  2. 椭圆不能平坦:长轴/短轴< 3。
  3. 在一个物体内,最小椭圆面积上最大椭圆的面积必须小于10.

3 个答案:

答案 0 :(得分:2)

一种可能性是尝试:

  1. 提取物体的轮廓
  2. 沿轮廓以规则间距采样点
  3. 使用这些点来确定常规间距的方向(最好使用复数表示此方向以避免环绕问题)
  4. 使用这些指示以常规间距计算曲率
  5. 根据此曲率确定指标,例如寻找在正确范围内有超过80%曲率样本的物体。
  6. 您期望看到的曲线图是一系列常数值(如果形状是椭圆形而不是圆形,则会缓慢变化),突然不连续,从一个圆变为另一个圆。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是否查看了Hough-Transformations的圆圈和椭圆?可用的圈子甚至有OpenCV implementation个。这些变换必须应用于对象的轮廓。