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