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

Que*_*ann 9 c++ algorithm geometry opencv image-processing

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

在阈值图像和找到所有对象的轮廓之后

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

我最终得到了这些对象:

在此输入图像描述

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

我当前的滤波器主要以它们的等周数为基础排除物体.然而,由于我有不同大小和噪音的物体,我并不总是对这种方法感到满意.

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

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

我考虑过如下方法:

  • 基于轮廓中连续点的所有三元组之间角度值的直方图的东西?
  • 在数学上拟合"多椭圆"(我不知道如何做到这一点)?
  • 匹配自由人链?

但我确信我错过了一些更有效,更少杂乱的东西.你有什么建议吗,谢谢:),

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

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

Pet*_*vaz 2

一种可能性是尝试:

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

您期望看到的曲率图表是一系列恒定值(如果形状是椭圆而不是圆形,则缓慢变化),并且从一个圆形变为另一个圆形时会突然不连续。

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

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