scipy.ndimage.label:包含错误边距

时间:2017-07-18 10:06:55

标签: python arrays scipy ndimage

在阅读了有关scipy.ndimage.label(Variable area threshold for identifying objects - python)的有趣主题后,我想在标签中加入'错误边距'。

在上面的链接讨论中: 如何也可以包括顶部的蓝点(假设它与橙色,最大的物体错误地断开连接)?

我找到了结构属性,它应该能够通过更改数组(从np.ones(3,3,3)到更多的数据来包含该点(我希望它是3D)。但是不幸的是,将'structure'属性调整为更大的数组似乎不起作用。它或者给出了维度的错误(RuntimeError:结构和输入必须具有相同的等级) )或者它没有改变任何东西..

谢谢!

这是代码:

labels, nshapes = ndimage.label(a, structure=np.ones((3,3,3)))

其中a是3D数组。

1 个答案:

答案 0 :(得分:0)

这是一种使用scipy.ndimage.binary_dilation的可行方法。在2D示例中更容易看到发生了什么,但我将展示如何在最后推广到3D。

In [103]: a
Out[103]: 
array([[0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [1, 1, 0, 0, 1, 0, 0],
       [1, 1, 0, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1],
       [1, 1, 1, 0, 0, 0, 0]])

In [104]: from scipy.ndimage import label, binary_dilation

扩展每个"形状"向下和向右一个像素:

In [105]: b = binary_dilation(a, structure=np.array([[0, 0, 0], [0, 1, 1], [0, 1, 1]])).astype(int)

In [106]: b
Out[106]: 
array([[0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 0, 0],
       [1, 1, 1, 0, 1, 1, 0],
       [1, 1, 1, 0, 1, 1, 1],
       [1, 1, 1, 0, 0, 1, 1],
       [1, 1, 1, 1, 0, 1, 1]])

label应用于填充数组:

In [107]: labels, numlabels = label(b)

In [108]: numlabels
Out[108]: 2

In [109]: labels
Out[109]: 
array([[0, 0, 0, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 0, 0],
       [2, 2, 2, 0, 1, 1, 0],
       [2, 2, 2, 0, 1, 1, 1],
       [2, 2, 2, 0, 0, 1, 1],
       [2, 2, 2, 2, 0, 1, 1]], dtype=int32)

通过将a乘以labels,我们可以获得所需的a标签数组:

In [110]: alab = labels*a

In [111]: alab
Out[111]: 
array([[0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0],
       [2, 2, 0, 0, 1, 0, 0],
       [2, 2, 0, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1],
       [2, 2, 2, 0, 0, 0, 0]])

(这假设a中的值为0或1.如果不是,则可以使用alab = labels * (a > 0)。)

对于3D输入,您必须将structure参数更改为binary_dilation

struct = np.zeros((3, 3, 3), dtype=int)
struct[1:, 1:, 1:] = 1
b = binary_dilation(a, structure=struct).astype(int)