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, retain_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 # 加载图像 image = mh.imread('sea.bmp') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用 Haar 变换 haar_transform = mh.haar(image) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示 Haar 变换后的图像 axes[1].imshow(haar_transform, cmap='gray') axes[1].set_title('Haar Transformed Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图 mtplt.show()
输出
以下是上述代码的输出 −

不保留能量
我们也可以对图像执行不保留能量的 Haar 变换。图像的能量是指其亮度,当图像从一个域转换到另一个域时,它可以发生变化。
在 mahotas 中,mh.haar() 函数的 preserve_energy 参数决定是否保留输出图像的能量。如果我们不想保留能量,可以将此参数设置为 False。
因此,输出图像的亮度将不同于输入图像的亮度。
如果将此参数设置为 True,则输出图像和输入图像将具有相同的亮度。
示例
在下面提到的例子中,我们对图像执行 Haar 变换而不保留其能量。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('tree.tiff') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用 Haar 变换 haar_transform = mh.haar(image, retain_energy=False) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 2) # 显示原始图像 axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].set_axis_off() # 显示 Haar 变换后的图像 axes[1].imshow(haar_transform, cmap='gray') axes[1].set_title('Haar Transformed Image') axes[1].set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图中 mtplt.show()
输出
上述代码的输出如下 −

内联 Haar 变换
我们还可以对输入图像执行内联 Haar 变换。内联是指在不创建新图像的情况下对原始图像本身应用变换。
这使我们能够在对图像应用变换时节省空间。
在 mahotas 中,可以通过在 mh.haar() 函数中将 inline 参数设置为布尔值 True 来实现内联 Haar 变换。这样,就不需要创建新图像来存储输出。
示例
在这里,我们对输入图像执行内联 Haar 变换。
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = mh.imread('sun.png') # 将其转换为灰度 image = mh.colors.rgb2gray(image) # 应用 Haar 变换 mh.haar(image, retain_energy=False, inline=True) # 为子图创建图形和轴 fig, axis = mtplt.subplots(1, 1) # 显示转换后的图像 axes.imshow(image, cmap='gray') axes.set_title('Haar Transformed Image') axes.set_axis_off() # 调整子图之间的间距 mtplt.tight_layout() # 显示图形 mtplt.show()
输出
执行上述代码后,我们得到以下输出 −

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