distance_transform_bf#
- scipy.ndimage.distance_transform_bf(входные данные, метрика='euclidean', выборка=None, return_distances=True, return_indices=False, расстояния=None, индексы=None)[источник]#
Функция преобразования расстояния алгоритмом грубой силы.
Эта функция вычисляет преобразование расстояния входные данные, путём замены каждого элемента переднего плана (ненулевого) на его кратчайшее расстояние до фона (любого элемента с нулевым значением).
В дополнение к преобразованию расстояния можно вычислить преобразование признаков. В этом случае индекс ближайшего фонового элемента к каждому переднему элементу возвращается в отдельном массиве.
- Параметры:
- входные данныеarray_like
Вход
- метрика{‘euclidean’, ‘taxicab’, ‘chessboard’}, опционально
‘cityblock’ и ‘manhattan’ также допустимы и соответствуют ‘taxicab’. По умолчанию используется ‘euclidean’.
- выборкаfloat, или последовательность float, опционально
Этот параметр используется только когда метрика является 'euclidean'. Расстояние между элементами вдоль каждого измерения. Если последовательность, должна иметь длину, равную рангу входных данных; если одно число, оно используется для всех осей. Если не указано, подразумевается расстояние сетки, равное единице.
- return_distancesbool, необязательно
Вычислять ли преобразование расстояния. По умолчанию True.
- return_indicesbool, необязательно
Следует ли вычислять преобразование признаков. По умолчанию: False.
- расстоянияndarray, необязательно
Выходной массив для хранения вычисленного преобразования расстояния, вместо возврата его. return_distances должно быть True. Оно должно иметь ту же форму, что и входные данные, и типа float64, если метрика равно ‘euclidean’, uint32 в противном случае.
- индексыint32 ndarray, опционально
Выходной массив для хранения вычисленного преобразования признаков вместо его возврата. return_indicies должно быть True. Его форма должна быть
(input.ndim,) + input.shape.
- Возвращает:
- расстоянияndarray, необязательно
Рассчитанное преобразование расстояния. Возвращается только когда return_distances равно True и расстояния не предоставлен. Он будет иметь ту же форму, что и входной массив.
- индексыint32 ndarray, опционально
Вычисленное преобразование признаков. Имеет массив формы входных данных для каждого измерения входных данных. См. документацию distance_transform_edt для примера. Возвращается только когда return_indices равно True и индексы не предоставлен.
Смотрите также
distance_transform_cdtБолее быстрое преобразование расстояния для таксиметрических и шахматных метрик
distance_transform_edtБолее быстрое преобразование расстояния для евклидовой метрики
Примечания
Эта функция использует медленный алгоритм полного перебора. См. также функцию
distance_transform_cdtдля более эффективного такси [1] и алгоритмы шахматной доски [2].Ссылки
[1]Манхэттенское расстояние. Википедия, 2023. https://en.wikipedia.org/wiki/Taxicab_geometry
[2]Расстояние шахматной доски. Wikipedia, 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()