当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Python SciPy ndimage.distance_transform_bf用法及代码示例


本文简要介绍 python 语言中 scipy.ndimage.distance_transform_bf 的用法。

用法:

scipy.ndimage.distance_transform_bf(input, metric='euclidean', sampling=None, return_distances=True, return_indices=False, distances=None, indices=None)#

通过暴力算法实现距离变换函数。

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

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

参数

input array_like

输入

metric {‘euclidean’, ‘taxicab’, ‘chessboard’},可选

‘cityblock’ 和‘manhattan’ 也有效,并映射到‘taxicab’。默认为‘euclidean’。

sampling 浮点数,或浮点数序列,可选

仅当指标为‘euclidean’时使用此参数。元素沿每个维度的间距。如果是序列,长度必须等于输入秩;如果是单个数字,则用于所有轴。如果未指定,则暗示统一的网格间距。

return_distances 布尔型,可选

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

return_indices 布尔型,可选

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

distances ndarray,可选

用于存储计算的距离变换而不是返回它的输出数组。 return_distances 必须为 True。它必须与输入具有相同的形状,如果度量为 ‘euclidean’,则其类型为 float64,否则为 uint32。

indices int32 ndarray,可选

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

返回

distances ndarray,可选

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

indices int32 ndarray,可选

计算出的特征变换。对于输入的每个维度,它都有一个 input-shaped 数组。有关示例,请参阅distance_transform_edt 文档。仅当 return_indices 为 True 并且未提供索引时返回。

注意

该函数采用缓慢的强力算法。另请参阅函数 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 (默认)、taxicabchessboard 。右上图像包含基于 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()
scipy-ndimage-distance_transform_bf-1.png

相关用法


注:本文由纯净天空筛选整理自scipy.org大神的英文原创作品 scipy.ndimage.distance_transform_bf。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。