Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在线性时间内合并图像区域(bboxes)_Python_Algorithm_Image Processing_Bounding Box_Scikits - Fatal编程技术网

Python 在线性时间内合并图像区域(bboxes)

Python 在线性时间内合并图像区域(bboxes),python,algorithm,image-processing,bounding-box,scikits,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, clear

我有一组用于某些图像的区域(边界框),例如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)复杂性。我可以写一些更聪明的东西,但我的印象是这种算法已经存在,我不想重新发明轮子。非常感谢您的帮助。

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

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

  • 给每个盒子一个id,也为每个边标记它属于盒子
  • 用于查找所有交点
  • 在扫描线算法中,一旦报告了一个交点,您就知道哪两个框是重叠的,请使用类似“不相交集”的方法对它们进行分组
  • 最后线性扫描不相交的集合,对于每个集合,不断更新最左边、最右边、最上面、最下面的点,以制作一个更大的框来绑定它们 (此处完成合并,请注意,如果一个框与其他框没有重叠,则集合将仅包含自身)
  • 我希望这种方法能起作用,并且应该比O(n^2)快,但即使它能起作用,在步骤4中仍然存在一些问题,其中较大的合并框必须//到x-y轴,这不是必须的

    编辑:很抱歉,我只是再次通过OP,并且理解上述解决方案并不能解决“距离 此外,合并框程序不是一次通过作业,它是一种递归作业,例如,将框a和框B合并为框C,则框C可能与框D重叠/距离
    在线性时间内解决这项任务对我来说是不可能的,因为在O(n)中几乎无法预先计算所有成对框之间的距离。

    如何测量边界框之间的“距离”?您的意思是“边界框中的每条边的最大距离为X”还是“边之间的总距离为X?”此外,您希望如何将它们合并在一起?有不同的方法可以做到这一点,但有些方法可能会导致“级联”效果,在合并两个框后,新框需要与第三个框合并。@templatetypedef Distance定义为两个不同框的任意两条边之间的最短距离。合并是在要合并的边界框周围创建边界框。如果您只需将所有框按(距离/2)增长,距离问题就会容易得多。这至少减少了“盒子重叠”的问题。