Mahotas - 距离变换
距离变换是一种计算每个像素与最近背景像素之间距离的技术。距离变换基于距离度量,距离度量定义了如何计算空间中两点之间的距离。
在图像上应用距离变换会创建距离图。在距离图中,深色阴影分配给边界附近的像素,表示距离较短,而浅色阴影分配给较远的像素,表示与最近背景像素的距离较大。
Mahotas 中的距离变换
在 Mahotas 中,我们可以使用 mahotas.distance() 函数对图像执行距离变换。它使用迭代方法创建距离图。
该函数首先初始化图像中所有像素的距离值。背景像素被分配一个无穷大的距离值,而前景像素被分配一个零距离值。
然后,该函数根据其相邻像素的距离更新每个背景像素的距离值。这种情况会一直持续到计算完所有背景像素的所有距离值为止。
mahotas.distance() 函数
mahotas.distance() 函数将图像作为输入并返回距离图作为输出。距离图是包含输入图像中每个像素与最近背景像素之间距离的图像。
语法
以下是 mahotas − 中 distance() 函数的基本语法
mahotas.distance(bw, metric='euclidean2')
其中,
bw − 是输入图像。
metric(可选) − 它指定用于确定像素和背景像素之间距离的距离类型(默认为 euclidean2)。
示例
在下面的示例中,我们使用 mh.distance() 函数对图像执行距离变换。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('nature.jpeg') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 查找距离图 distance_map = mh.distance(image) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示距离转换后的图像 axes[1].imshow(distance_map) axes[1].set_title('Distance Transformed Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
以下是上述代码的输出 −

使用带标签的图像
我们还可以使用带标签的图像执行距离变换。带标签的图像是指为不同区域分配唯一标签以将图像分割成不同区域的图像。
在 mahotas 中,我们可以对输入图像应用距离变换,首先使用 mh.gaussian_filter() 函数降低其噪声。然后,我们使用 mh.label() 函数将前景区域与背景区域分开。
然后我们可以使用 mh.distance() 函数创建距离图。这将计算前景区域像素与背景区域像素之间的距离。
示例
在下面提到的示例中,我们正在寻找经过过滤的标记图像的距离图。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用高斯滤波 gauss_image = mh.gaussian_filter(image, 3) gauss_image = (gauss_image > gauss_image.mean()) # 将其转换为带标签的图像 labeled, num_objects = mh.label(gauss_image) # 查找距离图 distance_map = mh.distance(labeled) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示转换后的距离图像 axes[1].imshow(distance_map) axes[1].set_title('距离变换图像') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
上述代码的输出如下

使用欧几里得距离
对图像执行距离变换的另一种方法是使用欧几里得距离。欧几里得距离是坐标系中两点之间的直线距离。它计算为坐标之间的平方差之和的平方根。
例如,假设有两个点 A 和 B,其坐标值分别为 (2, 3) 和 (5, 7)。那么 x 和 y 坐标的平方差将为 (5−2)2 = 9 和 (7−3)2 = 16。平方和将为 9 + 16 = 25,平方根将为 5,这是点 A 和点 B 之间的欧几里得距离。
在 mahotas 中,我们可以使用 euclidean 距离而不是默认的 euclidean2 作为距离度量。为此,我们将值"euclidean"传递给 metric 参数。
注意 −欧几里得应该写为"euclidean"(用单引号引起来),因为度量参数的数据类型是字符串。
示例
在此示例中,我们使用欧几里得距离类型对图像进行距离变换。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用高斯滤波 gauss_image = mh.gaussian_filter(image, 3) gauss_image = (gauss_image > gauss_image.mean()) # 查找距离图 distance_map = mh.distance(gauss_image, metric='euclidean') # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示转换后的距离图像 axes[1].imshow(distance_map) axes[1].set_title('距离变换图像') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −
