检测(边缘)图像中的所有几何对象

计算科学 计算机视觉
2021-11-26 16:59:55

编辑:在下面添加了另一个更合适的示例。

免责声明:边缘图是指以位图形式给出的图像,仅由黑白像素组成。

简短描述:
简而言之,我正在寻找快速、实用的算法(或者,甚至更好的工作实现)来从图像中提取(完整的、可能旋转的)几何对象的参数,如下所示,以查找对象它们是“特殊的”(例如,完全包含在另一个像右边的小椭圆中)。霍夫变换或继任者是要走的路吗? (部分)示例图像

更多细节
特别是,我正在搜索已经(完美)提取边缘的三角形、矩形和椭圆形图像。由于大多数(可能是旋转的)椭圆出现,这似乎是最难的物体,我想从这些开始。如示例所示,某些对象仅部分位于图像中,应丢弃(即可以看作是一种失真或噪声。这种噪声可以看作是具有相对较大轴的椭圆)。但是,应该检测重叠的对象。我对轴的参数有粗略的限制。找到参数后,我想选择特定对象,例如完全包含在另一个对象中的那些。也许为了实现这一点而检测所有对象太过分了?

到目前为止我的研究:
到目前为止,我偶然发现了几种算法和实现。最值得注意的是基于霍夫变换,它使用投票方案解决了(双)参数空间中的问题。然而,一般的霍夫变换相当慢。3、4、56实现_ _ _应该更快,但不适合手头的图像,或者我太笨而无法正确应用它们(绝对是这种情况)。至少对我来说,实现要么被扭曲的、不完整的对象(可能有数百个)“混淆”,要么没有找到所有对象。由于我只关心具有完整边缘的完整对象,也许某种边缘跟踪也可以工作?

我的问题:
由于我在图像/对象检测方面完全没有经验,因此在考虑解决我的问题时,我不知道我是否走在正确的轨道上。这是要走的路,还是您知道解决手头任务的其他算法或现有实现?

编辑: 由于椭圆是主要问题,它的表现不够好,我将添加另一个图像。同样,这只是作为由黑白像素组成的位图提供的图像的一部分。我以蓝色突出显示省略号内的省略号,而另一个完整的省略号以棕色突出显示。一般来说,可能有多达 30 个感兴趣的对象,但很少有数百个令人不安的对象(不是总是这样吗?!:/)。另一个迄今为止缺失的信息是,“嘈杂”的不完整椭圆的不同之处在于与相当小的想要的对象相比具有更大的轴!(我还将添加上面的信息)。如果我能为小椭圆找到合适的参数范围,也许霍夫变换会变得实用。

第二个示例,突出显示想要的对象并增加噪音

2个回答

我提出了一个简单的解决方案,但它是否有效取决于线跟踪可以将组分开的程度以及椭圆拟合的工作速度。

步骤 1,按照线将边缘点分成组,每组对应一个对象。

第二步,判断对象是否完整。一个简单的修剪是查看是否有任何点位于边缘上。如果有这样的点,请检查对象中是否存在间隙。

第 3 步,将对象拟合到点(这应该比霍夫变换更快,因为您已经知道这些点)。为了提高速度,您可以在多级方案中进行椭圆拟合。

第 4 步,使用这些表示来识别所需的对象。

免责声明:这可能需要一些手动编码。所以不确定这是否会比高度优化的霍夫变换更快。

A. 凸多边形内的凸多边形

由于所有对象都是凸的,如果线段的两个端点在对象内部,则整条线都在线段中,如果凸多边形的所有边都在对象内部,则整个多边形都在该对象内部。通过这种方式,您可以检测三角形是否在三角形、矩形或椭圆的内部。如果矩形在三角形、矩形或省略号内。

B. 多边形内的省略号

为了检测省略号是否在多边形内,我将转换空间以使省略号变成一个圆,然后使用比较一个段中与圆心最近的点(垂直线从该点撞击圆心或最接近的端点)圆心),如果从该点到圆心的距离小于半径,则省略号不是完全封闭的。如果圆心不在多边形内,则省略号不在多边形内。

省略号内的省略号

这个问题已经在这里问过了,那里的所有答案都使用某种数值方法。我认为这是要走的路,我不得不承认,最初我认为不等式系统可以简化为一个单一的二次曲线,但它给出了一个四次方程。