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)