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

Algorithm 如何确定多个元素的边界矩形?,algorithm,graphics,geometry,bounding-box,Algorithm,Graphics,Geometry,Bounding Box,我想实现一个算法,它将找到轮廓的边界矩形(已经由另一个算法确定)。我只有一个二值化图像(如下所示)。其基本思想是: 采取类似的方式-预处理的二值化图像 生产这样的东西 我可以建议一个简单的开始方法吗: 在图像中,对图像中的中点(x,y)执行二维二进制搜索。 从该点开始,执行洪水填充 如果填充图形的边界与图像的边界不同,则会找到一个闭合图形,从而找到其边界框 如果它填充了整个图像,那么您什么也没有命中,所以将图像划分为四个cuadrant并递归执行相同的操作。(您不需要检查以前找到的边界框

我想实现一个算法,它将找到轮廓的边界矩形(已经由另一个算法确定)。我只有一个二值化图像(如下所示)。其基本思想是:

  • 采取类似的方式-预处理的二值化图像

  • 生产这样的东西


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

在图像中,对图像中的中点(x,y)执行二维二进制搜索。 从该点开始,执行洪水填充

  • 如果填充图形的边界与图像的边界不同,则会找到一个闭合图形,从而找到其边界框

  • 如果它填充了整个图像,那么您什么也没有命中,所以将图像划分为四个cuadrant并递归执行相同的操作。(您不需要检查以前找到的边界框图形中的点,从而在搜索过程中减少搜索空间)

对于每个元素:

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.

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

看起来OpenCV已经实现了一些算法来查找轮廓的边界框。因此,研究它们的功能如何工作可能是一个很好的开始。

检查连接的组件标签:。在这种情况下,您可以找到白色像素或黑色像素的连接组件(白色更容易计算,因为图像中的白点更少)。

您可以计算最小生成树并删除最长的边。然后你可以计算k-均值。移除另一条长边并计算k-均值。冲洗并重复,直到N=10。我相信该算法被命名为单链路k-means,集群类似于voronoi图:

“单链路k-聚类算法……正是Kruskal的算法……相当于找到MST并删除k-1最昂贵的边。”

请参见此处的示例:

然后对每个集群应用此规则:

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的矩阵),我想找到这些矩形——它们的坐标。好吧,这是个好主意,但我想从头开始。我不能使用OpenCV的实现。在实现轮廓创建功能时,是否可以将每个轮廓分组为一组点?如果你能做到这一点,那么找到边界框就变得很简单了,因为你只需要在每个集合中找到最高点、最低点、最左边点和最右边点。我只得到了一张二值化图像-仅此而已。我必须以某种方式整理出边界矩形,然后你可以做的是实现一些轮廓跟踪算法,比如Moore Neighbor或Radial Sweep,这将是相当简单的,但允许你在找到白色像素后对它们进行分组。因此,基本上,开始浏览图像,直到找到一个白色像素。将其设置为起始像素并应用轮廓跟踪算法。算法完成跟踪后,使用找到的像素集确定边界框。然后找到下一个不在先前找到的轮廓集中的白色像素,并再次开始应用该算法。谢谢您的回答。我会在网上找一些资料。如果你发现了什么,请在评论中发表。2D二进制是指kd树吗?我的意思是像四叉树一样将空间分成4个单元。我认为kd树也可以。但是四叉树是很好的选择。看看我们的姐妹网站。我知道它必须有一个名字,我花了两天的时间才找到它。