Mahotas - Haar 变换



Haar 变换是一种用于将图像从像素强度值转换为小波系数的技术。小波系数是表示不同频率对图像贡献的数值。

在 Haar 变换中,图像被分解成一组称为 Haar 小波的正交基函数。

正交基函数指的是满足两个重要属性的数学函数:它与其他基函数垂直(或正交),并且其系数长度为 1。

基函数是由单个小波通过缩放和平移生成的。缩放是指改变小波函数的持续时间,而平移则涉及沿 x 轴移动小波函数。

Mahotas 中的 Haar 变换

在 Mahotas 中,我们可以使用 **mahotas.haar()** 函数对图像执行 Haar 变换。以下是执行图像 Haar 变换的基本方法:

  • **图像分割** - 第一步涉及将输入图像划分为大小相同的非重叠块。

  • **平均和差分** - 接下来,在每个块内计算低频系数和高频系数。低频系数表示图像的平滑全局特征,并计算为像素强度的平均值。高频系数表示图像的锐利局部特征,并通过查找相邻像素之间的差异来计算。

  • **下采样** - 然后对生成的低频系数和高频系数进行下采样(降级),方法是丢弃每一行和每一列中的交替值。

步骤 2 和 3 重复,直到整个图像都被转换。

mahotas.haar() 函数

mahotas.haar() 函数以灰度图像作为输入,并将小波系数作为图像返回。小波系数是数组的元组。

第一个数组包含低频系数,第二个数组包含高频系数。

语法

以下是 mahotas 中 haar() 函数的基本语法:

mahotas.haar(f, preserve_energy=True, inline=False)

其中,

  • **f** - 它表示输入图像。

  • **preserve_energy(可选)** - 它指定是否保留输出图像的能量(默认值为 True)。

  • **inline(可选)** - 它指定是返回新图像还是修改输入图像(默认值为 False)。

示例

在以下示例中,我们使用 mh.haar() 函数对图像应用 Haar 变换。

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
# Loading the image
image = mh.imread('sea.bmp')
# Converting it to grayscale
image = mh.colors.rgb2gray(image)
# Applying Haar transformation
haar_transform = mh.haar(image)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the Haar transformed image
axes[1].imshow(haar_transform, cmap='gray')
axes[1].set_title('Haar Transformed Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

Haar Transform

不保留能量

我们还可以对图像执行 Haar 变换而不保留能量。图像的能量指的是其亮度,当图像从一个域转换到另一个域时,它可能会发生变化。

在 mahotas 中,mh.haar() 函数的 **preserve_energy** 参数决定是否保留输出图像的能量。如果我们不想保留能量,可以将此参数设置为 False。

因此,输出图像的亮度将与输入图像的亮度不同。

如果此参数设置为 True,则输出图像和输入图像将具有相同的亮度。

示例

在下面提到的示例中,我们正在对图像执行 Haar 变换而不保留其能量。

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 Haar transformation
haar_transform = mh.haar(image, preserve_energy=False)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 2)
# Displaying the original image
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].set_axis_off()
# Displaying the Haar transformed image
axes[1].imshow(haar_transform, cmap='gray')
axes[1].set_title('Haar Transformed Image')
axes[1].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

Preserving Energy

内联 Haar 变换

我们还可以对输入图像执行内联 Haar 变换。内联指的是在原始图像本身上应用变换,而无需创建新图像。

这使我们能够在对图像应用变换时节省空间。

在 mahotas 中,可以通过在 mh.haar() 函数中将 **inline** 参数设置为布尔值 True 来实现内联 Haar 变换。这样,就不需要创建新图像来存储输出。

示例

在这里,我们正在对输入图像执行内联 Haar 变换。

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 Haar transformation
mh.haar(image, preserve_energy=False, inline=True)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 1)
# Displaying the transformed image
axes.imshow(image, cmap='gray')
axes.set_title('Haar Transformed Image')
axes.set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

执行上述代码后,我们将获得以下输出:

Inline Haar Transformation

**注意** - 由于输入图像在转换过程中被覆盖,因此输出屏幕将仅包含上面显示的单个图像。

广告