scipy.ndimage.

distance_transform_cdt#

scipy.ndimage.distance_transform_cdt(input, metric='chessboard', return_distances=True, return_indices=False, distances=None, indices=None)[source]#

用于 chamfer 类型变换的距离变换。

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

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

参数:
inputarray_like

输入。值为 0 的元素被视为背景。

metric{‘chessboard’, ‘taxicab’} 或 array_like,可选

metric 决定执行的 chamfering 类型。如果 metric 等于 ‘taxicab’,则使用 generate_binary_structure 生成一个结构,其平方距离等于 1。如果 metric 等于 ‘chessboard’,则使用 generate_binary_structure 生成一个 metric,其平方距离等于数组的维数。这些选择对应于二维中 ‘taxicab’ 和 ‘chessboard’ 距离度量的常见解释。可以使用自定义度量,以矩阵形式提供,其中每个维度都具有长度为 3 的矩阵。 ‘cityblock’ 和 ‘manhattan’ 也是有效的,并映射到 ‘taxicab’。默认值为 ‘chessboard’。

return_distances布尔值,可选

是否计算距离变换。默认值为 True。

return_indices布尔值,可选

是否计算特征变换。默认值为 False。

distancesint32 ndarray,可选

用于存储计算的距离变换的输出数组,而不是返回它。 return_distances 必须为 True。它必须与 input 的形状相同。

indicesint32 ndarray,可选

用于存储计算的特征变换的输出数组,而不是返回它。 return_indicies 必须为 True。它的形状必须是 (input.ndim,) + input.shape

返回值:
distancesint32 ndarray,可选

计算的距离变换。仅在 return_distances 为 True 且未提供 distances 时返回。它将与输入数组具有相同的形状。

indicesint32 ndarray,可选

计算的特征变换。它为输入的每个维度都有一个输入形状的数组。有关示例,请参阅 distance_transform_edt 文档。仅在 return_indices 为 True 且未提供 indices 时返回。

另请参阅

distance_transform_edt

用于欧几里得度量的快速距离变换

distance_transform_bf

使用较慢的蛮力算法针对不同度量的距离变换

示例

导入必要的模块。

>>> import numpy as np
>>> from scipy.ndimage import distance_transform_cdt
>>> import matplotlib.pyplot as plt
>>> from mpl_toolkits.axes_grid1 import ImageGrid

首先,我们创建一个玩具二进制图像。

>>> def add_circle(center_x, center_y, radius, image, fillvalue=1):
...     # fill circular area with 1
...     xx, yy = np.mgrid[:image.shape[0], :image.shape[1]]
...     circle = (xx - center_x) ** 2 + (yy - center_y) ** 2
...     circle_shape = np.sqrt(circle) < radius
...     image[circle_shape] = fillvalue
...     return image
>>> image = np.zeros((100, 100), dtype=np.uint8)
>>> image[35:65, 20:80] = 1
>>> image = add_circle(28, 65, 10, image)
>>> image = add_circle(37, 30, 10, image)
>>> image = add_circle(70, 45, 20, image)
>>> image = add_circle(45, 80, 10, image)

接下来,我们设置图形。

>>> fig = plt.figure(figsize=(5, 15))
>>> grid = ImageGrid(fig, 111, nrows_ncols=(3, 1), axes_pad=(0.5, 0.3),
...                  label_mode="1", share_all=True,
...                  cbar_location="right", cbar_mode="each",
...                  cbar_size="7%", cbar_pad="2%")
>>> for ax in grid:
...     ax.axis('off')
>>> top, middle, bottom = grid
>>> colorbar_ticks = [0, 10, 20]

顶部图像包含原始二进制图像。

>>> binary_image = top.imshow(image, cmap='gray')
>>> cbar_binary_image = top.cax.colorbar(binary_image)
>>> cbar_binary_image.set_ticks([0, 1])
>>> top.set_title("Binary image: foreground in white")

中间图像包含使用 taxicab 度量的距离变换。

>>> distance_taxicab = distance_transform_cdt(image, metric="taxicab")
>>> taxicab_transform = middle.imshow(distance_taxicab, cmap='gray')
>>> cbar_taxicab = middle.cax.colorbar(taxicab_transform)
>>> cbar_taxicab.set_ticks(colorbar_ticks)
>>> middle.set_title("Taxicab metric")

底部图像包含使用 chessboard 度量的距离变换。

>>> distance_chessboard = distance_transform_cdt(image,
...                                              metric="chessboard")
>>> chessboard_transform = bottom.imshow(distance_chessboard, cmap='gray')
>>> cbar_chessboard = bottom.cax.colorbar(chessboard_transform)
>>> cbar_chessboard.set_ticks(colorbar_ticks)
>>> bottom.set_title("Chessboard metric")
>>> plt.tight_layout()
>>> plt.show()
../../_images/scipy-ndimage-distance_transform_cdt-1.png