distance_transform_bf#
- scipy.ndimage.distance_transform_bf(input, metric='euclidean', sampling=None, return_distances=True, return_indices=False, distances=None, indices=None)[源代码][源代码]#
通过暴力算法实现的距离变换函数。
此函数通过将每个前景(非零)元素替换为其到背景(任意零值元素)的最短距离,来计算 input 的距离变换。
除了距离变换外,还可以计算特征变换。在这种情况下,每个前景元素到最近背景元素的索引将在一个单独的数组中返回。
- 参数:
- 输入array_like
toctree
是一个 reStructuredText 指令 ,这是一个非常多功能的标记。指令可以有参数、选项和内容。- 指标{‘欧几里得’, ‘出租车’, ‘棋盘’}, 可选
‘cityblock’ 和 ‘manhattan’ 也是有效的,它们映射到 ‘taxicab’。默认值是 ‘euclidean’。
- 采样float, 或 float 序列, 可选
此参数仅在 metric 为 ‘euclidean’ 时使用。沿每个维度的元素间距。如果是一个序列,则长度必须等于输入的秩;如果是一个单一数字,则此数字将用于所有轴。如果未指定,则隐含的网格间距为单位间距。
- return_distancesbool, 可选
是否计算距离变换。默认值为 True。
- 返回索引bool, 可选
是否计算特征变换。默认是 False。
- 距离ndarray,可选
一个用于存储计算出的距离变换的输出数组,而不是返回它。return_distances 必须为 True。它必须与 input 具有相同的形状,并且如果 metric 是 ‘euclidean’,则为 float64 类型,否则为 uint32 类型。
- 索引int32 ndarray,可选
一个用于存储计算特征变换的输出数组,而不是返回它。return_indicies 必须为 True。其形状必须为 (input.ndim,) + input.shape。
- 返回:
- 距离ndarray,可选
计算得到的距离变换。仅当 return_distances 为 True 且 distances 未提供时返回。其形状将与输入数组相同。
- 索引int32 ndarray,可选
计算的特征变换。它为输入的每个维度提供了一个输入形状的数组。请参阅 distance_transform_edt 文档以获取示例。仅当 return_indices 为 True 且 indices 未提供时返回。
参见
distance_transform_cdt
更快的距离变换,适用于出租车和棋盘度量
distance_transform_edt
欧几里得度量的更快距离变换
注释
此函数使用了一个缓慢的暴力算法。另请参阅函数
distance_transform_cdt
以获取更高效的出租车 [1] 和棋盘算法 [2]。参考文献
[1]出租车距离。维基百科,2023。https://en.wikipedia.org/wiki/Taxicab_geometry
[2]棋盘距离。维基百科,2023。https://en.wikipedia.org/wiki/Chebyshev_distance
示例
导入必要的模块。
>>> import numpy as np >>> from scipy.ndimage import distance_transform_bf >>> 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=(8, 8)) # set up the figure structure >>> grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=(0.4, 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') # remove axes from images
左上角的图像是原始的二值图像。
>>> binary_image = grid[0].imshow(image, cmap='gray') >>> cbar_binary_image = grid.cbar_axes[0].colorbar(binary_image) >>> cbar_binary_image.set_ticks([0, 1]) >>> grid[0].set_title("Binary image: foreground in white")
距离变换根据距离度量计算前景像素与图像背景之间的距离。
distance_transform_bf
中可用的度量包括:euclidean``(默认)、``taxicab
和chessboard
。右上角的图像包含了基于euclidean
度量的距离变换。>>> distance_transform_euclidean = distance_transform_bf(image) >>> euclidean_transform = grid[1].imshow(distance_transform_euclidean, ... cmap='gray') >>> cbar_euclidean = grid.cbar_axes[1].colorbar(euclidean_transform) >>> colorbar_ticks = [0, 10, 20] >>> cbar_euclidean.set_ticks(colorbar_ticks) >>> grid[1].set_title("Euclidean distance")
左下角的图像包含了使用
taxicab
度量的距离变换。>>> distance_transform_taxicab = distance_transform_bf(image, ... metric='taxicab') >>> taxicab_transformation = grid[2].imshow(distance_transform_taxicab, ... cmap='gray') >>> cbar_taxicab = grid.cbar_axes[2].colorbar(taxicab_transformation) >>> cbar_taxicab.set_ticks(colorbar_ticks) >>> grid[2].set_title("Taxicab distance")
最后,右下角的图像包含了使用
chessboard
度量的距离变换。>>> distance_transform_cb = distance_transform_bf(image, ... metric='chessboard') >>> chessboard_transformation = grid[3].imshow(distance_transform_cb, ... cmap='gray') >>> cbar_taxicab = grid.cbar_axes[3].colorbar(chessboard_transformation) >>> cbar_taxicab.set_ticks(colorbar_ticks) >>> grid[3].set_title("Chessboard distance") >>> plt.show()