我想实现一种算法,该算法将找到轮廓的边界矩形(已由另一算法确定)。我唯一拥有的是二值化图像(如下图所示)。基本想法是:
采取类似的方式 - 预处理的二值化图像
并制作这样的东西
答案 0 :(得分:3)
查看已连接的组件标签:http://en.wikipedia.org/wiki/Connected-component_labeling。在这种情况下,您可以找到白色像素或黑色像素的连接组件(由于图像中的白点较少,白色在计算上更容易)。
答案 1 :(得分:1)
我建议一个天真的方法来开始:
在图像中,对图像中的中间点(x,y)进行二维二分法搜索。 从那时起,执行洪水填充。
如果填充图形的边界不是图像的边界,那么您找到了一个封闭的图形,因此找到了它的边界框。
如果它填满整个图像,那么你什么都没有,所以将图像分成四个cuadrants并递归地执行相同的操作。 (您无需检查落在先前找到的边界框图内的点,在此过程中切断搜索空间。)
答案 2 :(得分: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.
注意最高我的意思是最靠近屏幕顶部而不是最大值。
答案 3 :(得分:0)
看起来OpenCV有一些算法可以找到已经实现的轮廓的边界框。因此,研究他们的功能如何运作可能是一个很好的开始。 http://opencv.itseez.com/doc/tutorials/imgproc/shapedescriptors/bounding_rects_circles/bounding_rects_circles.html
答案 4 :(得分:-1)
您可以计算最小生成树并删除最长边。然后你可以计算k均值。删除另一条长边并计算k均值。冲洗并重复,直到N = 10。我相信这个算法被称为单链路k-means,集群类似于voronoi图:
“单链路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.
注意最高我的意思是最靠近屏幕顶部而不是最大值。