scipy.ndimage.label:包括误差幅度



在阅读了scipy.ndimage.label(用于识别对象的可变区域阈值 - python(上的一个有趣的主题后,我想在标签中包含"误差幅度"。

在上面的链接讨论中: 如何包含顶部的蓝点(假设它错误地与橙色,最大的对象断开连接(?

我找到了结构属性,它应该能够通过更改数组(从 np.ones(3,3,3( 更改为更多(我希望它是 3D(来包含该点。然而,不幸的是,将"结构"属性调整为更大的数组似乎不起作用。它要么给出维度错误(运行时错误:结构和输入必须具有相等的秩 (或者它不会改变任何东西。

谢谢!

这是代码:

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

其中 a 是 3D 数组。

这是一种使用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)

最新更新