scipy.ndimage.

label#

scipy.ndimage.label(input, structure=None, output=None)[source]#

标记数组中的特征。

参数:
inputarray_like

要标记的数组类对象。 input 中的任何非零值都被视为特征,而零值被视为背景。

structurearray_like, 可选

定义特征连接的结构元素。 structure 必须是中心对称的(参见说明)。如果未提供结构元素,则会自动生成一个连接性等于 1 的方形连接元素。也就是说,对于 2 维 input 数组,默认结构元素是

[[0,1,0],
 [1,1,1],
 [0,1,0]]
output(None, data-type, array_like), 可选

如果 output 是数据类型,则它指定生成的标记特征数组的类型。如果 output 是数组类对象,则 output 将使用此函数的标记特征更新。此函数可以通过传递 output=input 来进行就地操作。请注意,输出必须能够存储最大的标签,否则此函数将引发异常。

返回值:
labelndarray 或 int

一个整数 ndarray,其中 input 中的每个唯一特征在返回的数组中都有一个唯一的标签。

num_featuresint

找到的对象数量。

如果 output 为 None,则此函数返回一个包含 (labeled_array, num_features) 的元组。

如果 output 是 ndarray,则它将使用 labeled_array 中的值进行更新,并且此函数只返回 num_features

另请参见

find_objects

生成标记特征(或对象)的切片列表;对于查找特征的位置或尺寸很有用

说明

中心对称矩阵是关于中心对称的矩阵。有关更多信息,请参阅 [1]

为了确保双向连接,structure 矩阵必须是中心对称的。例如,如果 structure 矩阵不是中心对称的,并且定义为

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

并且 input

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

则结构矩阵将表明输入中的条目 2 与 1 相连,但 1 未与 2 相连。

参考

[1]

James R. Weaver,“中心对称(交叉对称)矩阵,它们的基本性质、特征值和特征向量。”《美国数学月刊》92.10 (1985): 711-717。

示例

创建一个包含一些特征的图像,然后使用默认(十字形)结构元素对其进行标记

>>> from scipy.ndimage import label, generate_binary_structure
>>> import numpy as np
>>> a = np.array([[0,0,1,1,0,0],
...               [0,0,0,1,0,0],
...               [1,1,0,0,1,0],
...               [0,0,0,1,0,0]])
>>> labeled_array, num_features = label(a)

每个 4 个特征都用不同的整数进行标记

>>> num_features
4
>>> labeled_array
array([[0, 0, 1, 1, 0, 0],
       [0, 0, 0, 1, 0, 0],
       [2, 2, 0, 0, 3, 0],
       [0, 0, 0, 4, 0, 0]])

生成一个结构元素,即使特征对角接触,也会将它们视为连接

>>> s = generate_binary_structure(2,2)

或者,

>>> s = [[1,1,1],
...      [1,1,1],
...      [1,1,1]]

使用新的结构元素标记图像

>>> labeled_array, num_features = label(a, structure=s)

显示 2 个标记的特征(注意,上面特征 1、3 和 4 现在被视为单个特征)

>>> num_features
2
>>> labeled_array
array([[0, 0, 1, 1, 0, 0],
       [0, 0, 0, 1, 0, 0],
       [2, 2, 0, 0, 1, 0],
       [0, 0, 0, 1, 0, 0]])