【问题标题】:Merging image regions (bboxes) in linear time在线性时间内合并图像区域(bbox)
【发布时间】:2014-01-22 09:44:21
【问题描述】:

我有一些图像的一组区域(边界框),例如 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(n2) 复杂度。我可以写一些更聪明的东西,但我的印象是这种算法已经存在,我不想重新发明轮子。任何帮助表示赞赏。

【问题讨论】:

  • 你如何测量边界框之间的“距离”?您的意思是“边界框中的每个边缘最多距离 X”还是“边缘之间的总距离为 X”?另外,您究竟想如何将它们合并在一起?有多种方法可以做到这一点,但有些方法可能会导致“级联”效果,即在合并两个框后,新框需要与第三个框合并。
  • @templatetypedef 距离定义为两个不同框的任意两条边之间的最短距离。合并是在要合并的边界框周围创建边界框。
  • 如果你简单地把所有的盒子都扩大(距离/2),距离问题就容易多了。这至少减少了“框是否重叠”的问题。

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


【解决方案1】:

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

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

  1. 给每个盒子一个 id,也为每个边,标记它属于盒子
  2. 使用sweeping line algorithm 查找所有交叉点
  3. 在扫线算法中,一旦报告了一个交点,你就知道哪两个框是重叠的,使用 disjoint-set 之类的东西对它们进行分组。
  4. 最后线性扫描不相交集,对于每个集合,不断更新最左边、最右边、最顶部、最底部的点,以制作一个更大的框来绑定它们 (此处合并完成,注意如果一个框与其他框没有重叠,则该集合将只包含它自己)

我希望这个方法能行得通,它应该比 O(n^2) 快,但即使它行得通,它在第 4 步仍然存在一些问题,其中较大的合并框必须是 // 到 xy 轴,这不是必须的。

编辑:对不起,我只是再次通过OP,并理解上述解决方案不能解决“距离

此外,合并框的过程不是 1-pass 的工作,它是一种递归,例如框 A 和框 B 合并成为框 C,然后框 C 可能与框 D 重叠/距离

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

【讨论】:

    猜你喜欢
    • 2016-07-07
    • 1970-01-01
    • 2013-12-20
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2017-12-24
    • 1970-01-01
    相关资源
    最近更新 更多