【问题标题】:How to determine bounding rectangles of multiple elements?如何确定多个元素的边界矩形?
【发布时间】:2012-02-10 05:12:04
【问题描述】:

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

  • 采取这样的方式 - 预处理二值化图像

  • 并产生类似这样的东西

【问题讨论】:

标签: algorithm graphics geometry bounding-box


【解决方案1】:

查看连接组件标签:http://en.wikipedia.org/wiki/Connected-component_labeling。在这种情况下,您可以找到白色像素或黑色像素的连通分量(白色在计算上更容易,因为图像中的白点较少)。

【讨论】:

  • 我知道它必须有一个名字,我花了两天时间才找到它。
【解决方案2】:

我可以建议一个幼稚的方法作为开始:

在图像中,对图像中的中间点 (x,y) 进行 2D 二进制搜索。 从那时起,执行洪水填充。

  • 如果填充图形的边界不是图像的边界,那么您找到了一个闭合图形,因此找到了它的边界框。

  • 如果它填满了整个图像,那么你什么也没打,所以把图像分成四个 cuadrants 并递归地做同样的事情。 (您无需检查位于先前找到的边界框图形内的点,从而在此过程中减少您的搜索空间)。

【讨论】:

  • 二维二进制是指kd-tree吗?
  • 我的意思是像四叉树一样将空间分成 4 个 cuadrants。
  • 我认为 kd-tree 也可以。但是有一个四叉树是很好的。
【解决方案3】:

对于每个元素:

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 的矩阵),我想找到这些矩形 - 它们的坐标。
【解决方案4】:

看起来 OpenCV 有一些算法可以找到已经实现的轮廓的边界框。因此,研究它们的功能如何工作可能是一个很好的开始。 http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html

【讨论】:

  • 好的,这是个好主意,但我想从头开始。我不能使用 OpenCV 的实现。
  • 在您的轮廓创建功能的实现中是否可以将每个轮廓分组为一组点?如果你能做到这一点,那么找到边界框几乎是微不足道的,因为你只需要找到每个集合中的最高点、最低点、最左边和最右边的点。
  • 我只有一个二值化图像 - 仅此而已。我必须以某种方式整理边界矩形。
  • 那么您可以做的是实现一些轮廓跟踪算法,例如 Moore-Neighbor 或 Radial Sweep,这将相当简单,但允许您在找到白色像素后对其进行分组。所以基本上开始浏览图像,直到找到一个白色像素。将其设置为起始像素并应用轮廓跟踪算法。算法完成跟踪后,使用它找到的像素集来确定边界框。然后找到不在先前找到的轮廓集中的下一个白色像素,并再次开始应用算法。
  • 感谢您的回答。我会尽量在网上找一些资料。如果您发现了什么,请在评论中发布。
【解决方案5】:

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

“单链k-clustering算法......正是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.

注意最高是指最接近屏幕顶部的值,而不是最大值。

【讨论】:

    猜你喜欢
    • 2011-03-29
    • 2013-02-24
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-09-22
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多