我使用unutbu和Joe Kington在这个问题上提供的方法将图像划分为对象(切片):Rectangular bounding box around blobs in a monochrome image using 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)
然而,这似乎并不是100%的时间都有效,而且它确实是一个稍微超出原始问题范围的贡献所以我将这一部分作为一个单独的具体问题重新开放。
关于如何实现这一目标的任何想法?
编辑:这是一个实际的图片示例,不适用于上面的代码
处理此返回
和
理想情况下,我想从切片列表中删除最后一张图片
答案 0 :(得分: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以及这种情况有多常见会很有帮助。