Haar小波變換是小波變換中最簡單的一種,也是最早被廣泛使用的一種小波變換方法。它能夠將任何信號分解成數個均勻的子信號,將高頻和低頻分開,被廣泛應用於圖像和信號處理、壓縮等領域。
一、小波變換基本概念
小波變換有點類似於傅里葉變換,但又與之有所不同。前者可以將信號分解成一組基函數,而這些基函數只在有限區間內存在,因此它可以更好地處理時變信號。而後者則將信號分解成一組不同頻率的正弦和餘弦函數,因此適用於處理穩定的信號。
小波變換可以用於信號的時頻分析,同時也可用於信號的壓縮和去噪。小波分解後的低頻信號表示信號的大致趨勢,高頻信號則表示細節信息。在實際應用中,選擇合適的小波基函數非常重要。因為各種小波基函數的分解效果不同,其優勢各有千秋,Haar小波變換是其中之一。
二、Haar小波基函數
Haar小波變換的基本思想是將一個長度為$2^k$的序列分解成長度為$2^{k-1}$的兩個子序列,這兩個子序列可以表示成均值和差值的形式,前者稱為低頻分量,後者稱為高頻分量。
Haar小波有兩個基函數:$h(x)$和$g(x)$,分別對應於低頻分量和高頻分量。具體定義如下:
h(x) = 1, 0<=x<1/2 -1, 1/2<=x<1 0, 其他情況 g(x) = 1, 0<=x<1/2 1, 1/2<=x<1 0, 其他情況
在Haar小波基函數的定義中,$h(x)$表示均值函數或低頻部分,$g(x)$表示差值函數或高頻部分。我們可以通過將它們進行重複和調整,構造出一組哈爾小波基函數:
φ(x)=h(x), 0<=x<1 φ_{j,k}(x)={ 2^{j/2}h(2^jx-k) , 2^{j-1}<=k<2^j -2^{j/2}h(2^jx-k) , 2^{j-1}<=k<2^j 0, otherwise } ψ_{j,k}(x)={ 2^{j/2}g(2^jx-k) , 2^{j-1}<=k<2^j -2^{j/2}g(2^jx-k) , 2^{j-1}<=k<2^j 0, otherwise }
其中,$j$表示小波變換的尺度或層數,$k$表示小波的平移因子,$x$是時間索引。$φ(x)$和$ψ(x)$分別對應於Haar小波的低頻部分和高頻部分,也叫做近似分量和細節分量。
三、Haar小波變換演算法
Haar小波變換的演算法包含兩個步驟:分解和重構。分解將信號分解成低頻部分和高頻部分,重構則將兩部分重組為原始信號。
(一)分解演算法
假設輸入的信號為$f(x)$,其長度為$N=2^k$,這裡以4位數據為例子:$f(x)=[a_0,a_1,a_2,a_3]$。根據Haar小波變換的基本思想,我們需要將這個信號分解為長度為2的子序列,然後進行處理。
首先,將輸入信號的長度減半,得到長度為2的子序列$[a_0,a_2]$和$[a_1,a_3]$,將它們分別處理成平均值和差值,得到:
d_1 = (a_0-a_2)/\sqrt{2} d_2 = (a_1-a_3)/\sqrt{2} a_1 = (a_0+a_2)/\sqrt{2} a_2 = (a_1+a_3)/\sqrt{2}
其中,$d_1$和$d_2$表示高頻分量,$a_1$和$a_2$表示低頻分量。最終,我們將處理好的高頻分量和低頻分量合併起來,得到長度為4的信號$[a_1,d_1,a_2,d_2]$。
對於長度為$2^k$的序列,我們可以通過遞歸地多次進行上述操作,最終得到小波變換的所有係數。下面是Haar小波變換的分解演算法示例代碼:
def haarWaveletTransform(signal): N = len(signal) if N == 1: return signal else: signal1 = signal[0:N:2] signal2 = signal[1:N:2] mean = [(signal1[i] + signal2[i])/np.sqrt(2) for i in range(N//2)] diff = [(signal1[i] - signal2[i])/np.sqrt(2) for i in range(N//2)] cA = haarWaveletTransform(mean) cD = haarWaveletTransform(diff) return np.concatenate((cA, cD))
(二)重構演算法
通過Haar小波變換,我們可以將信號分解成多個低頻分量和高頻分量。接下來,我們需要將這些分量合併起來,重構成原始信號。
假設我們已知原始信號的細節分量和近似分量,那麼可以通過一系列的加減操作來反向計算原始信號:
N = len(coef) a = [0]*N for i in range(N//2): a[2*i] = (coef[i]+coef[N//2+i])/np.sqrt(2) a[2*i+1] = (coef[i]-coef[N//2+i])/np.sqrt(2)
上述代碼中,$coef$數組保存著小波變換的係數,其中前一半表示近似分量,後一半表示細節分量。通過迭代地進行平均和差分運算,我們可以逐步還原出原始的信號。最終,變換後的信號並原信號是相同的。
四、應用實例
Haar小波變換在圖像處理、信號壓縮等領域有著廣泛的應用。下面我們以圖像壓縮為例,介紹Haar小波變換的具體應用。
(一)圖像壓縮
圖像壓縮是指將原始圖像壓縮成更小的尺寸,以便於存儲和傳輸。Haar小波變換可以將圖像分解成多個小波係數,然後根據數據的特徵選取部分高頻小波係數並捨棄部分低頻小波係數,從而實現圖像壓縮。
具體來說,我們可以將原始圖像分解成多個小波係數,在這些係數中選擇部分高頻係數並將其捨棄。捨棄後再通過逆變換來重建圖像。
下面是Haar小波變換在圖像壓縮方面的實現:
import cv2 def haarWaveletTransform2D(image): rows, cols = image.shape temp = np.zeros((rows,cols), dtype=float) for i in range(rows): temp[i,:] = haarWaveletTransform(image[i,:]) for j in range(cols): temp[:,j] = haarWaveletTransform(temp[:,j]) return temp def haarWaveletTransform2DInv(coef): rows, cols = coef.shape temp = np.zeros((rows,cols), dtype=float) for j in range(cols): temp[:,j] = haarWaveletTransformInv(coef[:,j]) for i in range(rows): temp[i,:] = haarWaveletTransformInv(temp[i,:]) return temp def compressImage(image, alpha=0.5): coef = haarWaveletTransform2D(image) threshold = np.percentile(abs(coef), alpha*100) coef_abs = abs(coef) # 只保留係數的絕對值 coef[coef_abs < threshold] = 0 # 軟閾值 image_inv = haarWaveletTransform2DInv(coef) return image_inv
上述代碼中,我們實現了二維Haar小波變換和相應的逆變換,然後使用軟閾值法對小波係數進行篩選,保留一部分高頻係數。
(二)示例
下面我們給出一個圖像壓縮的示例:
這是一張尺寸為512×512的彩色圖像,我們可以將其轉化為灰度圖像,然後進行壓縮。以下是Python代碼:
import cv2 # 載入圖像 img = cv2.imread("lena.png") gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # 壓縮 alpha = 0.5 compressed = compressImage(gray, alpha) # 顯示原始圖像和壓縮後的圖像 cv2.imshow("Original Image", gray) cv2.imshow("Compressed Image", compressed.astype(np.uint8)) cv2.waitKey(0) cv2.destroyAllWindows()
其中,$alpha$參數表示保留係數的比例,這裡我們選擇了50%。運行代碼後,可以得到以下結果:
可以看到,壓縮後的圖像失去了一些細節信息,但基本上保留了原始圖像的特徵,體積縮小了約4倍。
五、小結
Haar小波變換是最基礎的小波變換之一,它通過將信號分解成低頻分量和高頻分量,將信號在時域和頻域上分解開,具有良好的時頻定位特性。Haar小波變換具有計算簡單、可逆性強等優點,被廣泛應用於圖像和信號處理、壓縮等領域。
本文介紹了Haar小波變換的基本概念、Haar小波基函數、Haar小波變換演算法以及其應用實例。通過使用Haar小波變換和軟閾值法,我們可以將圖像壓縮到較小的尺寸,同時基本保留了圖像的特徵信息。
原創文章,作者:YVII,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/132269.html