scipy.ndimage.

label#

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

標記陣列中的特徵。

參數:
input類陣列

要標記的類陣列物件。 *input* 中的任何非零值都會被視為特徵,而零值則被視為背景。

structure類陣列,選用性

一個定義特徵連接的結構元素。 *structure* 必須是中心對稱的(請參閱「註釋」)。如果沒有提供結構元素,則會自動產生一個平方連通性等於 1 的結構元素。也就是說,對於 2 維的 *input* 陣列,預設的結構元素是

[[0,1,0],
 [1,1,1],
 [0,1,0]]
output(None、資料類型、類陣列),選用性

如果 *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]]

那麼結構矩陣會指示 *input* 中的條目 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]], dtype=int32)

產生一個結構元素,即使特徵對角線接觸,也會將特徵視為已連接

>>> 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]], dtype=int32)