Delphi 检测图片中的多个形状并计算中间值

Delphi 检测图片中的多个形状并计算中间值,delphi,image-processing,pixel,pixels,shapes,Delphi,Image Processing,Pixel,Pixels,Shapes,这个问题可以用任何类型的编程语言来回答,因为我想在算法方面得到一些帮助,但我更喜欢Delphi。我的任务是检测和计算随机图片的多个形状(介于1和N之间-大部分是圆形或省略),并计算它们的中间位置,然后将它们作为图片的坐标返回。每个形状的中间可以有填充(但这并不重要)。这些形状之间的距离至少为1+像素。所有形状都不喜欢与其他形状或图片的一角混合。 图片的背景始终具有相同的背景颜色,这实际上并不重要,因为形状的边框/边框始终与背景颜色不同。这样可以很容易地检测形状。我想一个像素一个像素地收集坐标,然

这个问题可以用任何类型的编程语言来回答,因为我想在算法方面得到一些帮助,但我更喜欢Delphi。我的任务是检测和计算随机图片的多个形状(介于1和N之间-大部分是圆形或省略),并计算它们的中间位置,然后将它们作为图片的坐标返回。每个形状的中间可以有填充(但这并不重要)。这些形状之间的距离至少为1+像素。所有形状都不喜欢与其他形状或图片的一角混合。 图片的背景始终具有相同的背景颜色,这实际上并不重要,因为形状的边框/边框始终与背景颜色不同。这样可以很容易地检测形状。我想一个像素一个像素地收集坐标,然后像一个看不见的矩形/正方形一样围绕每个形状绘制以计算中间。然后我也听说了scanline,但我认为在这种情况下它不会更快。所以我的问题是,我如何计算:

  • 图中有多少个形状
  • 我如何计算(或多或少)它们的确切中间值
  • 将任务可视化的一些图片:

    这是一张随机形状的图片(大部分是闭合圆) 正如你所看到的,他们彼此分开很好

    然后我可以很容易地在每个形状周围画/计算一个虚构的矩形/正方形,然后像这样计算它的中间:

    在我有矩形/正方形之后。我可以很容易地计算出中间值。 我怎么开始

    附言:我在绘画中画了一些圆圈。我必须补充的是,所有的形状都是封闭的,这使得它可以洪水填充图片中的每一个形状没有问题

    谢谢您的帮助。

    为图像计算MSER(最大稳定极值区域)。我不能在这里解释这个算法。有关该算法的更多信息,请参阅本文

    这也会给你质心

    该算法作为内置函数在OpenCv工具和Matlab2012b中实现


    我能想到的另一种可能比前一种方法简单的方法是应用连通分量算法并计算对象的数量。有关这方面的更多信息,请参阅冈萨雷斯和伍兹的《数字图像处理》一书。

    您想要找到的是所谓的质心。计算它不需要边界矩形,只需要属于对象外部的点。我注意到一些手绘对象没有闭合,这是有意的吗(根据你最后的评论,这纯粹是巧合——它们实际上都是闭合的)?在整体填充对象后,你只能保留边界并计算每个形状的质心。我已经编写了这样的代码,这些任务不依赖于任何库,我相信将Python转换为类似Pascal的语言不会有太多问题。如果对这个代码有任何疑问,请尽管问。我想这还不清楚你想要的是形心,而不是形状的中心。因为你想把它们绑成矩形。此外,第二行中的第二个图像不是圆形/椭圆形。你也需要找到那个形状的质心吗?@BenjaminWeiss那边有些混乱,因为你提到的链接是关于洪水填充的。不管你是否真的填充了每个像素;您执行的操作与整体填充相同,只是,正如您所说,没有填充任何像素。但如果真的用洪水填充,从消除内部孔洞的意义上说,每个组件,任务就会变得更容易。@BenjaminWeiss在代码中注释“只保留边界点”的正下方,它会像你说的那样(我认为)。它会扫描图像中的每个像素,如果它找到一个背景像素(假设那里有255个),那么什么也不做。另一方面,如果我们发现一个黑色像素,我们会环顾四周的四个邻居。如果这些邻居中有一个是白色像素,那么这个黑色像素位于边界上,我们将其保持为黑色,否则我们将其设置为白色。这必须在辅助图像中完成,它不适用于就地修改。