本文簡要介紹 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
(默認)、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()
相關用法
- Python SciPy ndimage.distance_transform_cdt用法及代碼示例
- Python SciPy ndimage.distance_transform_edt用法及代碼示例
- Python SciPy ndimage.correlate用法及代碼示例
- Python SciPy ndimage.morphological_gradient用法及代碼示例
- Python SciPy ndimage.variance用法及代碼示例
- Python SciPy ndimage.correlate1d用法及代碼示例
- Python SciPy ndimage.binary_dilation用法及代碼示例
- Python SciPy ndimage.find_objects用法及代碼示例
- Python SciPy ndimage.label用法及代碼示例
- Python SciPy ndimage.maximum_filter1d用法及代碼示例
- Python SciPy ndimage.iterate_structure用法及代碼示例
- Python SciPy ndimage.map_coordinates()用法及代碼示例
- Python SciPy ndimage.generic_laplace用法及代碼示例
- Python SciPy ndimage.generate_binary_structure用法及代碼示例
- Python SciPy ndimage.binary_opening用法及代碼示例
- Python SciPy ndimage.binary_fill_holes用法及代碼示例
- Python SciPy ndimage.maximum_filter用法及代碼示例
- Python SciPy ndimage.minimum_position用法及代碼示例
- Python SciPy ndimage.labeled_comprehension用法及代碼示例
- Python SciPy ndimage.grey_erosion用法及代碼示例
- Python SciPy ndimage.spline_filter用法及代碼示例
- Python SciPy ndimage.shift用法及代碼示例
- Python SciPy ndimage.minimum用法及代碼示例
- Python SciPy ndimage.fourier_uniform用法及代碼示例
- Python SciPy ndimage.gaussian_laplace用法及代碼示例
注:本文由純淨天空篩選整理自scipy.org大神的英文原創作品 scipy.ndimage.distance_transform_bf。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。