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

**注意** - 由於輸入影像在轉換過程中被覆蓋,因此輸出螢幕將僅包含上面顯示的單個影像。

廣告