如何从列表中找到并删除图像的重叠部分切片?

3

我已经使用unutbu和Joe Kington在这个问题中提供的方法将图像分成了对象(切片):在python中使用矩形边界框围绕单色图像中的斑点,并且有一个列表包含这些对象,其格式如下:

the_blobs = [(slice(dy.start, dy.stop, None), slice(dx.start, dx.stop, None))]

dy.start表示y轴起始像素值,dy.stop表示y轴终止像素值,dx也是同理。

在列表中,有一些对象会重叠,比如一个小正方形在一个大圆内。当出现这种情况时,我想要从列表中删除“被包含”的对象(因为圆已经包含了它),例如:

当前列表

the_blobs = [(slice(100L, 1000L, None), slice(100L, 1000L, None)), 
(slice(150L, 220L, None), slice(150L, 220L, None)), 
(slice(1001L, 2000L, None), slice(1500L, 1700L, None)),
(slice(2001L, 2200L, None), slice(1800L, 1890L, None))] 

理想清单(去掉对象)

the_blobs = [(slice(100L, 1000L, None), slice(100L, 1000L, None)), 
(slice(1001L, 2000L, None), slice(1500L, 1700L, None)),
(slice(2001L, 2200L, None), slice(1800L, 1890L, None))] 

我应该指出,在上述问题的一部分中,有人建议使用以下代码:

data_slices = ndimage.find_objects(coded_paws)
for s in data_slices:
    filled[s] = True
coded_paws, num_paws = ndimage.label(filled)
data_slices = ndimage.find_objects(coded_paws)  

然而,这个方法在某些时候似乎并不起作用,而且它实际上是超出了原始问题的范围,所以我正在将其重新开放作为一个单独、具体的问题。
有没有任何想法,可以让我达成这个目标?
这里有一个实际的图像示例,使用上述代码无法运行。
处理后返回:
理想情况下,我想要从片段列表中删除最后一张图片。
1个回答

1

显然,您可以采用O(n^2)的方法,检查每个blob与所有其他blob,并通过检查blob1.dx.start > blob2.dx.start and blob1.dy.start > blob2.dy.start and blob1.dx.stop < blob2.dx.stop and blob1.dy.stop < blob2.dy.stop来确定是否应该删除它(如果此条件为真,则可以从列表中删除blob1)。如果您的总blob计数相当低,除非我漏掉了什么,否则这应该有效。

如果您正在寻找优化的解决方案,了解有多少个blob以及该条件有多常见将会很有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接