用 scipy.ndimage.label 标记 3d numpy 数组

label 3d numpy array with scipy.ndimage.label

我有一个由 1 和 0 组成的大型 3d numpy 数组。我想使用 scipy.ndimage.label 工具来标记每个子数组 (2d) 中的特征。

3 维数组的子集如下所示:

import numpy as np
from scipy.ndimage import label

subset = np.array([[[1, 0, 0],
                    [1, 0, 1],
                    [0, 0, 0]],

                   [[0, 0, 0],
                    [1, 0, 1],
                    [0, 0, 1]],

                   [[0, 0, 0],
                    [1, 0, 0],
                    [0, 1, 1]],

                   [[0, 0, 0],
                    [1, 0, 0],
                    [1, 1, 1]]], dtype=uint8)

当我在这个子集的一小部分上使用标签工具时,它工作正常:

>>>label(subset[0:3])    
(array([[[1, 0, 0],
         [1, 0, 2],
         [0, 0, 0]],

        [[0, 0, 0],
         [1, 0, 2],
         [0, 0, 2]],

        [[0, 0, 0],
         [1, 0, 0],
         [0, 2, 2]]]), 2)

但是,当我使用整个子集时,标签工具无法正常工作:

>>>label(subset)
(array([[[1, 0, 0],
         [1, 0, 1],
         [0, 0, 0]],

        [[0, 0, 0],
         [1, 0, 1],
         [0, 0, 1]],

        [[0, 0, 0],
         [1, 0, 0],
         [0, 1, 1]],

        [[0, 0, 0],
         [1, 0, 0],
         [1, 1, 1]]]), 1)

知道如何解决这个问题吗?

ps。 我要标记的完整数组由 350219 个二维数组组成。

我在丹漫的帮助下回答了这个问题

我必须为标签工具定义一个新的 3D 结构:

import numpy as np
from scipy.dimage import label

str_3D = np.array([[[0, 0, 0],
                    [0, 0, 0],
                    [0, 0, 0]],

                   [[0, 1, 0],
                    [1, 1, 1],
                    [0, 1, 0]],

                   [[0, 0, 0],
                    [0, 0, 0],
                    [0, 0, 0]]], dtype='uint8')

现在我的子集的标签 returns 如下:

>>> label(subset, structure=str_3D)
# outputs:
(array([[[1, 0, 0],
         [1, 0, 2],
         [0, 0, 0]],

        [[0, 0, 0],
         [3, 0, 4],
         [0, 0, 4]],

        [[0, 0, 0],
         [5, 0, 0],
         [0, 6, 6]],

        [[0, 0, 0],
         [7, 0, 0],
         [7, 7, 7]]]), 7)