Mahotas 简明教程

Mahotas - Distance Transform

距离变换是一种计算每个像素与其最近背景像素之间距离的技术。距离变换采用距离度量,确定如何计算空间中两点之间的距离。

在图像上应用距离变换会创建距离图。在距离图中,深色阴影分配给边界附近的像素,表示较短的距离,浅色阴影分配给较远处的像素,表示到最近背景像素的较大距离。

Distance Transform in Mahotas

在 Mahotas 中,我们可以使用 mahotas.distance() 函数对图像执行距离变换。它采用迭代方法来创建一个距离图。

该函数首先初始化图像中所有像素的距离值。将距离值无穷大分配给背景像素,将距离值零分配给前景像素。

然后,该函数根据相邻像素的距离更新每个背景像素的距离值。这会一直持续到计算出所有背景像素的所有距离值为止。

The mahotas.distance() function

mahotas.distance() 函数以图像作为输入,并以距离图作为输出进行返回。距离图是一幅图像,其中包含输入图像中每个像素与最近背景像素之间的距离。

以下是 Mahotas 中 distance() 函数的基本语法-

mahotas.distance(bw, metric='euclidean2')

其中,

  1. bw - 它就是输入图像。

  2. metric (optional) - 指定用于确定像素与背景像素之间距离的距离类型(默认值为 euclidean2)。

在以下示例中,我们正在使用 mh.distance() 函数对图像执行距离变换。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('nature.jpeg')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Finding distance map
distance_map = mh.distance(image)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the distance transformed image
axes[1].imshow(distance_map)
axes[1].set_title('Distance Transformed Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

以下是上面代码的输出: -

distance transform

Using Labeled Image

我们也可以使用标签图像执行距离变换。标签图像是指将不同的标签分配给不同区域以将图像分割成不同区域的图像。

在 Mahotas 中,我们可以通过首先使用 mh.gaussian_filter() 函数降低其噪音,对输入图像应用距离变换。然后,我们使用 mh.label() 函数将前景区域与背景区域分离开来。

然后,我们可以使用 mh.distance() 函数创建距离图。这会计算前景区域像素与背景区域像素之间的距离。

Example

在下面提到的示例中,我们正在查找经过滤的标签图像的距离图。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('tree.tiff')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Applying gaussian filtering
gauss_image = mh.gaussian_filter(image, 3)
gauss_image = (gauss_image > gauss_image.mean())
# Converting it to a labeled image
labeled, num_objects = mh.label(gauss_image)
# Finding distance map
distance_map = mh.distance(labeled)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the distance transformed image
axes[1].imshow(distance_map)
axes[1].set_title('Distance Transformed Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

上述代码的输出如下:

labeled image

Using Euclidean Distance

在图像上执行距离变换的另一种方法是使用欧几里得距离。欧几里得距离是坐标系中两点之间的直线距离。它是通过计算坐标之间的平方差之和的平方根来计算的。

例如,假设有两个点 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 参数。

Note − 由于度量参数的数据类型是字符串,因此应将欧几里得写为“euclidean”(用单引号引起来)。

Example

在此示例中,我们对图像的距离变换使用欧几里得距离类型。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sun.png')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Applying gaussian filtering
gauss_image = mh.gaussian_filter(image, 3)
gauss_image = (gauss_image > gauss_image.mean())
# Finding distance map
distance_map = mh.distance(gauss_image, metric='euclidean')
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image)
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the distance transformed image
axes[1].imshow(distance_map)
axes[1].set_title('Distance Transformed Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

执行上面的代码后,我们得到以下输出: -

euclidean distance