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,或浮点数序列,可选
沿每个维度的元素间距。如果是一个序列,其长度必须等于输入秩;如果是一个单独的数字,则用于所有轴。如果未指定,则默认为单位网格间距。
- 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] 是与输入点 x[i] 欧几里得距离最小的背景点(值为 0),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)