scipy.ndimage.

distance_transform_edt#

scipy.ndimage.distance_transform_edt(input, sampling=None, return_distances=True, return_indices=False, distances=None, indices=None)[source]#

精確歐幾里得距離轉換。

此函數計算 input 的距離轉換,方法是將每個前景(非零)元素替換為其到背景(任何零值元素)的最短距離。

除了距離轉換之外,還可以計算特徵轉換。在這種情況下,最接近每個前景元素的背景元素的索引將在單獨的陣列中返回。

參數:
inputarray_like

要轉換的輸入資料。可以是任何類型,但將轉換為二進制:輸入等於 True 的地方為 1,其他地方為 0。

samplingfloat,或 float 序列,選填

沿每個維度的元素間距。如果是一個序列,則長度必須等於輸入的秩;如果是單個數字,則用於所有軸。如果未指定,則表示單位網格間距。

return_distancesbool,選填

是否計算距離轉換。預設值為 True。

return_indicesbool,選填

是否計算特徵轉換。預設值為 False。

distancesfloat64 ndarray,選填

用於儲存計算出的距離轉換的輸出陣列,而不是返回它。return_distances 必須為 True。它必須與 input 具有相同的形狀。

indicesint32 ndarray,選填

用於儲存計算出的特徵轉換的輸出陣列,而不是返回它。return_indicies 必須為 True。其形狀必須為 (input.ndim,) + input.shape

返回:
distancesfloat64 ndarray,選填

計算出的距離轉換。僅當 return_distances 為 True 且未提供 distances 時返回。它將具有與輸入陣列相同的形狀。

indicesint32 ndarray,選填

計算出的特徵轉換。它為輸入的每個維度都有一個輸入形狀的陣列。請參閱下面的範例。僅當 return_indices 為 True 且未提供 indices 時返回。

註解

歐幾里得距離轉換給出歐幾里得距離的值

              n
y_i = sqrt(sum (x[i]-b[i])**2)
              i

其中 b[i] 是背景點(值為 0),其到輸入點 x[i] 的歐幾里得距離最小,而 n 是維度數。

範例

>>> from scipy import ndimage
>>> import numpy as np
>>> a = np.array(([0,1,1,1,1],
...               [0,0,1,1,1],
...               [0,1,1,1,1],
...               [0,1,1,1,0],
...               [0,1,1,0,0]))
>>> ndimage.distance_transform_edt(a)
array([[ 0.    ,  1.    ,  1.4142,  2.2361,  3.    ],
       [ 0.    ,  0.    ,  1.    ,  2.    ,  2.    ],
       [ 0.    ,  1.    ,  1.4142,  1.4142,  1.    ],
       [ 0.    ,  1.    ,  1.4142,  1.    ,  0.    ],
       [ 0.    ,  1.    ,  1.    ,  0.    ,  0.    ]])

沿 x 軸採樣 2 個單位,沿 y 軸採樣 1 個單位

>>> ndimage.distance_transform_edt(a, sampling=[2,1])
array([[ 0.    ,  1.    ,  2.    ,  2.8284,  3.6056],
       [ 0.    ,  0.    ,  1.    ,  2.    ,  3.    ],
       [ 0.    ,  1.    ,  2.    ,  2.2361,  2.    ],
       [ 0.    ,  1.    ,  2.    ,  1.    ,  0.    ],
       [ 0.    ,  1.    ,  1.    ,  0.    ,  0.    ]])

同時要求索引

>>> edt, inds = ndimage.distance_transform_edt(a, return_indices=True)
>>> inds
array([[[0, 0, 1, 1, 3],
        [1, 1, 1, 1, 3],
        [2, 2, 1, 3, 3],
        [3, 3, 4, 4, 3],
        [4, 4, 4, 4, 4]],
       [[0, 0, 1, 1, 4],
        [0, 1, 1, 1, 4],
        [0, 0, 1, 4, 4],
        [0, 0, 3, 3, 4],
        [0, 0, 3, 3, 4]]], dtype=int32)

使用提供的陣列進行原地輸出

>>> indices = np.zeros(((np.ndim(a),) + a.shape), dtype=np.int32)
>>> ndimage.distance_transform_edt(a, return_indices=True, indices=indices)
array([[ 0.    ,  1.    ,  1.4142,  2.2361,  3.    ],
       [ 0.    ,  0.    ,  1.    ,  2.    ,  2.    ],
       [ 0.    ,  1.    ,  1.4142,  1.4142,  1.    ],
       [ 0.    ,  1.    ,  1.4142,  1.    ,  0.    ],
       [ 0.    ,  1.    ,  1.    ,  0.    ,  0.    ]])
>>> indices
array([[[0, 0, 1, 1, 3],
        [1, 1, 1, 1, 3],
        [2, 2, 1, 3, 3],
        [3, 3, 4, 4, 3],
        [4, 4, 4, 4, 4]],
       [[0, 0, 1, 1, 4],
        [0, 1, 1, 1, 4],
        [0, 0, 1, 4, 4],
        [0, 0, 3, 3, 4],
        [0, 0, 3, 3, 4]]], dtype=int32)