以线性时间合并图像区域(bbox)

时间:2014-01-04 19:02:47

标签: python algorithm image-processing bounding-box scikits

我有一组区域(边界框)用于某些图像,例如python代码:

im = Image.open("single.png")
pix = np.array(im)
gray = rgb2grey(pix)
thresh = threshold_otsu(gray)
bw = closing(gray > thresh, square(1))

cleared = bw.copy()
clear_border(cleared)
borders = np.logical_xor(bw, cleared)
label_image = label(borders)

for region in regionprops(label_image, ['Area', 'BoundingBox']):
    #now i have bounding boxes in hand

我想要做的是合并重叠的区域或bbox边缘之间的距离小于X。天真的方法是检查所有区域之间的距离,其具有O(n 2 )复杂度。我可以写一些更聪明的东西,但我觉得这种算法已经存在,我不想重新发明轮子。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

这是你的问题“有n个盒子(不一定是//到x-y轴),你想找到所有重叠的盒子并合并它们(如果它们存在的话)?”

我想不出一个线性算法,但我有一个比O(n ^ 2)更快的概念,也许O(n lg n)描述如下:

  1. 为每个框添加一个id,也为每个边标记,标记它的所属框
  2. 使用sweeping line algorithm 查找所有路口
  3. 在扫描线算法中,一旦报告了交叉点,您就知道哪两个框重叠,使用像disjoint-set这样的东西来对它们进行分组。
  4. 最后线性扫描不相交集,对于每个集合,不断更新最左边,最右边,最顶部,最下面的点,以便制作一个更大的框来绑定它们 (在此处合并,请注意,如果某个框与其他框没有重叠,则该集合仅包含其自身)
  5. 我希望这个方法可以工作,它应该比O(n ^ 2)快,但即使它确实有效,它仍然有一些问题在步骤4,其中较大的合并框必须是//到xy轴,这不是必须的。

    编辑:对不起我只是再次通过OP,并且理解上面的解决方案并没有解决“距离< x”的合并框,它甚至只解决了重叠框问题。

    此外,合并框程序不是1遍作业,它是递归的,例如框A和框B合并成框C,则框C可以重叠/距离< x带框D ......依此类推。

    在线性时间内解决这个任务对我来说是不可能的,因为预先计算所有成对方框之间的距离已经很难在O(n)中完成......