Mahotas - Haar 逆变换



Haar 逆变换是指从 Haar 变换后的图像重建原始图像的技术。在了解 Haar 逆变换之前,让我们先了解一下 Haar 变换

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

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

Haar 逆变换通过以特定方式(如下所述)组合 Haar 小波,将小波系数转换为像素强度值。

在 Mahotas 中进行 Haar 逆变换

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

  • 首先,从 Haar 变换中获取 Haar 小波系数。

  • 接下来,将每个系数乘以一个缩放因子和 Haar 小波。对于 Haar 小波,近似系数的缩放因子通常为 $\mathrm{1/\sqrt{2}}$,细节系数的缩放因子为 1。

  • 然后,将这些缩放后的系数对于高频(细节)和低频(近似)系数求和。

  • 最后,组合重建的系数,如果像素值不在 0 到 255 的范围内,则执行归一化。

完成这些步骤后,原始图像将从 Haar 变换后的图像中重建。

mahotas.ihaar() 函数

mahotas.ihaar() 函数以 Haar 变换后的图像作为输入,并返回原始灰度图像作为输出。

由于 Haar 变换是一个可逆过程,因此逆变换后的图像是对原始图像的完美重建。

语法

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

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

其中,

  • **f** - 输入图像。

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

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

示例

在以下示例中,我们使用 mh.ihaar() 函数来反转 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
haar_transform = mh.haar(image)
# Reversing Haar transformation
reverse_haar = mh.ihaar(haar_transform)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 3)
# 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()
# Displaying the reversed image
axes[2].imshow(reverse_haar, cmap='gray')
axes[2].set_title('Reverse Haar Image')
axes[2].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()
输出

以下是上述代码的输出:

Reversing Haar Transform

不保留能量

我们还可以反转 Haar 变换对图像的影响,而不保留其能量。图像的能量指的是其亮度,在图像变换时可能会发生变化。

在 mahotas 中,我们可以将 mh.ihaar() 函数中的 **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)
# Reversing Haar transformation
reverse_haar = mh.ihaar(haar_transform, preserve_energy=False)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 3)
# 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()
# Displaying the reversed image
axes[2].imshow(reverse_haar, cmap='gray')
axes[2].set_title('Reverse Haar Image')
axes[2].set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

上述代码的输出如下:

Preserving Energy Mahotas

内联 Haar 逆变换

另一种执行 Haar 逆变换的方法是执行内联 Haar 逆变换。内联是指在原始图像本身上应用变换,而无需创建新图像,从而节省了变换过程中的空间。

在 mahotas 中,可以通过在 mh.ihaar() 函数中将 **inline** 参数设置为布尔值 'True' 来实现内联 Haar 逆变换。

示例

在这里,我们对 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)
# Reversing Haar transformation
mh.ihaar(mh.haar(image), inline=True)
# Creating a figure and axes for subplots
fig, axes = mtplt.subplots(1, 1)
# Displaying the reversed image
axes.imshow(image, cmap='gray')
axes.set_title('Reverse Haar Image')
axes.set_axis_off()
# Adjusting spacing between subplots
mtplt.tight_layout()
# Showing the figures
mtplt.show()

输出

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

Preserving Energy Mahotas1
广告