cupyx.scipy.ndimage.distance_transform_edt#

cupyx.scipy.ndimage.distance_transform_edt(image, sampling=None, return_distances=True, return_indices=False, distances=None, indices=None, *, block_params=None, float64_distances=True)[源代码]#

精确欧几里得距离变换。

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

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

参数:
  • image (array_like) – 要变换的输入数据。可以是任何类型,但将被转换为二值:图像等于 True 的地方为 1,其他地方为 0。

  • sampling (float, 或 float 序列, 可选) – 沿每个维度的元素间距。如果是一个序列,长度必须等于图像的秩;如果是一个单独的数字,则用于所有轴。如果未指定,则默认为单位网格间距。

  • return_distances (bool, 可选) – 是否计算距离变换。

  • return_indices (bool, 可选) – 是否计算特征变换。

  • distances (cupy.ndarray, 可选) – 一个输出数组,用于存储计算的距离变换,而不是返回它。return_distances 必须为 True。它必须与 image 形状相同。如果 float64_distancesFalse,则其 dtype 应为 cp.float32,否则应为 cp.float64

  • indices (cupy.ndarray, 可选) – 一个输出数组,用于存储计算的特征变换,而不是返回它。return_indicies 必须为 True。其形状必须为 (image.ndim,) + image.shape。其 dtype 必须是至少 2D 中 16 位或 3D 中 32 位的有符号或无符号整数类型。

  • block_params (3-tuple of int) – [2] 中描述的 m1, m2, m3 算法参数。如果为 None,将选择合适的默认值。注意:此参数是 cuCIM 特有的,SciPy 中不存在。

  • float64_distances (bool, 可选) – 如果为 True,在距离计算中使用双精度(以匹配 SciPy 行为)。否则,将使用单精度以提高效率。注意:此参数是 cuCIM 特有的,SciPy 中不存在。

返回:

  • distances (cupy.ndarray, optional) – 计算的距离变换。仅当 return_distancesTrue 且未提供 distances 时返回。其形状与 image 相同。如果 float64_distancesTrue,则其 dtype 将为 cp.float64,否则将为 cp.float32

  • indices (ndarray, optional) – 计算的特征变换。它为图像的每个维度包含一个图像形状的数组。参见下面的示例。仅当 return_indicesTrue 且未提供 indices 时返回。

注意

欧几里得距离变换给出欧几里得距离的值。

\[y_i = \sqrt{\sum_{i}^{n} (x[i] - b[i])^2}\]

其中 \(b[i]\) 是到输入点 \(x[i]\) 欧几里得距离最小的背景点(值为 0),\(n\) 是维度数。

请注意,如果输入像素与多个背景点等距,则 indices 输出可能与 scipy.ndimage.distance_transform_edt() 给出的输出不同。

此处实现的并行分带算法最初在 [1] 中描述。此处使用的核函数对应于作者网站 [2] 上描述的修订版 PBA+ 实现。作者的 PBA+ 实现源代码可在 [3] 获取。

参考文献

示例

>>> import cupy as cp
>>> from cucim.core.operations import morphology
>>> a = cp.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]))
>>> morphology.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 个单位

>>> morphology.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 = morphology.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]]])