scipy.ndimage.

distance_transform_edt#

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

精确的欧几里得距离变换。

此函数计算input的距离变换,方法是将每个前景(非零)元素替换为它到背景(任何零值元素)的最短距离。

除了距离变换之外,还可以计算特征变换。在这种情况下,会将每个前景元素最近的背景元素的索引返回到一个单独的数组中。

参数:
inputarray_like

要转换的输入数据。可以是任何类型,但会被转换为二进制:输入等于 True 的地方为 1,其他地方为 0。

samplingfloat, 或 float 序列, 可选

沿每个维度的元素的间距。如果是一个序列,则必须与输入秩的长度相等;如果是一个数字,则用于所有轴。如果未指定,则暗示网格间距为 1。

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)