在图片中检测多种形状并计算它们的中心点。

6
这个问题可以用任何类型的编程语言来回答,因为我需要一些有关算法的帮助,但我更喜欢 Delphi。我的任务是检测和计算随机图片中的多个形状(1到N之间,大多数是圆形或椭圆形),并计算它们的中心点并将其作为图片的坐标返回。每个形状的中心点可能会有填充(但这不重要)。这些形状至少相距1个像素。没有一个形状会与另一个形状或图片的角落混合在一起。
图片的背景始终具有相同的背景颜色,实际上这并不重要,因为形状的边框/框架始终与背景颜色不同。这使得检测形状变得容易。我考虑逐像素进行处理,并收集坐标,然后在每个形状周围绘制一个看不见的矩形/正方形以计算中心点。然后我也听说过扫描线,但我不认为在这种情况下它会更快。所以我的问题是,如何计算:
  1. 图片中有多少形状。
  2. 如何计算它们的确切中心点(或者说是更或少地计算)。
以下是一些图片以可视化任务:
这是一张带有随机形状(大多数是接近圆形)的图片,如下图所示,它们之间相距很好。 Shapes in a picture 然后我可以轻松地绘制/计算每个形状周围的想象矩形/正方形,并像这样计算它的中心点: Shapes in a picture with rectangles/squares around them 有了矩形/正方形之后,我可以轻松地计算中心点。我该怎么开始呢?
PS:我在 mspaint 中画了一些圆。我必须补充说明,所有形状都是封闭的,这使得可以毫无问题地填充每个形状!感谢您的帮助。

2
你想要找的是被称为质心。你不需要一个边界矩形来计算它,只需要外部物体上的点。我注意到你手绘的一些物体没有闭合,这是有意为之吗?(根据你最后的评论,这只是巧合--实际上它们都是闭合的)? - mmgp
1
在填充完对象之后,您可以仅保留边界并计算每个形状的质心。我已经在 https://dev59.com/nm3Xa4cB1Zd3GeqPaQ21#14264095 上放置了这样的代码,它不依赖于任何库来完成这些任务,我相信您不会有太多麻烦将Python转换为类似Pascal的语言。如果对该代码有任何疑问,请随时提出。 - mmgp
1
在下面的代码中,紧接着注释“# 仅保留边界点”,它做了你所说的事情(我想)。 它扫描图像中的每个像素,如果找到背景像素(假定为255),则不执行任何操作。 另一方面,如果我们发现黑色像素,则查看四个相邻像素。 如果这些邻居中有一个白色像素,则此黑色像素位于边界上,我们将其保持为黑色,否则将其设置为白色。 这必须在辅助图像中完成,对于原地修改无效。 - mmgp
1
在http://i.imgur.com/uyuEb.png上,您可以看到质心(蓝色点)和边界框中心(鲑鱼色点)之间的差异。 - mmgp
1
@BenjaminWeiss 因为我正好用你提供的测试图像,所以我使用了更健壮一些的东西来关闭组件,但其余部分也可以用它完成。生成代码实际上是在Mathematica中完成的,在其完整性方面相当简短:ComponentMeasurements[FillingTransform[Closing[Import["http://i.stack.imgur.com/m1pjE.jpg"], DiskMatrix[3]]], {"Centroid", "BoundingBox"}],而最终结果只是将这些结果与原始图像叠加而成。 - mmgp
显示剩余7条评论
1个回答

0

计算图像的MSER(最大稳定极值区域)。我无法在此处解释该算法。您可以参考最大稳定极值区域文章了解更多有关该算法的信息。

这将为您提供质心。

该算法已作为OpenCv工具和Matlab 2012b中的内置函数实现。

我能想到的另一种方法可能比先前的方法简单,即应用连接组件算法并计算对象数量。有关此更多信息,请参阅Gonzalez和Woods的数字图像处理书籍。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接