如何确定多个元素的边界矩形?

4
我希望实现一个算法,该算法将找到轮廓的边界矩形(已由另一个算法确定)。我只有一张二值化图像(如下所示)。基本思路是:
  • 取这样的东西 - 预处理的二值化图像 enter image description here

  • 并生成这样的东西 enter image description here

请注意,保留HTML标记。

请查看我们的姊妹网站 [DSP.SE]。 - Adam Lear
5个回答

4

我知道这个东西一定有一个名称,只是我花了两天时间搜索才找到它。 - Synexis

1

我可以建议一个简单的方法来开始:

在图像中,进行二维二分搜索以找到图像中间点(x,y)。 从该点开始执行泛洪填充。

  • 如果填充图形的边界不是图像的边界,则找到了一个封闭图形,因此找到了其边界框。

  • 如果它填充整个图像,则表示未找到任何内容,因此将图像分成四个象限并递归执行相同操作。(您无需检查落在先前找到的边界框图形内的点,从而缩小搜索空间)。


你的“2D二进制”是指kd树吗? - Micromega
我的意思是将空间分成四个象限,就像四叉树一样。 - Gabriel Belingueres
我觉得kd树也可以,但四叉树是个很好的选择。 - Micromega

0

好的,那是个不错的想法,但我想从头开始。我不能使用OpenCV的实现。 - Patryk
在您的轮廓创建函数实现中,是否可以将每个轮廓分组为一组点?如果可以这样做,那么查找边界框几乎变得微不足道,因为您只需要在每个集合中找到最高、最低、最左和最右的点即可。 - aoi222
我只有一个二值化图像 - 就这样。我必须想办法整理出边界矩形。 - Patryk
1
那么你可以实现一些轮廓跟踪算法,如Moore-Neighbor或Radial Sweep,这将非常简单,但允许您在找到它们后对白色像素进行分组。因此,基本上从图像开始,直到找到白色像素为止。将其设置为起始像素并应用轮廓跟踪算法。一旦算法完成跟踪,使用它找到的像素集来确定边界框。然后找到下一个不在先前找到的轮廓集合中的白色像素,并再次开始应用该算法。 - aoi222
谢谢回答。我会尝试在互联网上寻找一些材料。如果你找到了什么,请在评论中发布。 - Patryk

0

对于每个元素:

They highest y - 1 is the top of the rectangle. 
The leftmost x - 1 is the left of the rectangle. 
The lowest y + 1 is the bottom of the rectangle. 
The rightmost x + 1 is the right of the rectangle.

请注意,我所说的“最高”是指靠近屏幕顶部的位置,而不是最大值。


你有一张图片(由0和1组成的矩阵),我想找到这些矩形的坐标,你误解了我的意思。 - Patryk

-1
您可以计算最小生成树并删除最长的边缘。然后,您可以计算k-means。 删除另一个长边并计算k-means。 反复洗涤,直到N = 10. 我相信这个算法被命名为单链接k-means, 聚类类似于沃罗诺伊图:

“单链接k聚类算法…正是Kruskal算法…等同于找到MST并删除k-1条最昂贵的边缘。”

例如在此处查看:https://stats.stackexchange.com/questions/1475/visualization-software-for-clustering

然后,对于每个聚类,应用此规则:

They highest y - 1 is the top of the rectangle. 
The leftmost x - 1 is the left of the rectangle. 
The lowest y + 1 is the bottom of the rectangle. 
The rightmost x + 1 is the right of the rectangle.

注意,我所说的“最高”是指靠近屏幕顶部而不是最大值。


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