哈爾小波轉換

哈爾小波轉換（Haar wavelet）是由數學家哈爾·阿爾弗雷德於1909年所提出的函數變換，是小波轉換中最簡單的一種轉換，也是最早提出的小波轉換。他是多貝西小波的於N=2的特例，可稱之為D2或db1。
哈爾小波的母小波（mother wavelet）可表示為：
對應的尺度函數（scaling function）可表示為：
其濾波器（filter）被定義為 當時，濾波器係數非零，此時可以用哈爾小波的濾波器係數及其尺度函數，將母小波函數表示為：
在所有正交（orthonormal）小波轉換中，哈爾小波轉換是最簡單的一種轉換，但它並不適合用於較為平滑的函數，因為它只有一個消失矩（Vanishing Moment）。

**小波母函數**
參與變換的小波函數（wavelet function）也叫母小波（mother wavelet）。
小波母函數可以用尺度函數表示：
對小波的母函數可以進行伸縮和平移，例如、。
當尺度離散方式選取時，依據哈爾小波函數的定義，我們可以推出：
（1）不同尺度的小波函數相互正交（即），例如： 
（證明同上） 
（2）同一尺度及不同尺度下，小波函數的整數位移之間相互正交（即），例如： 


**尺度函數**
尺度函數（scaling function），以下為尺度函數的簡易圖示：
(1):  
(2): 
(3): 

**優點**
（1）簡單（Simple） 
（2）快速算法（Fast algorithm）
（3）正交（Orthogonal）→可逆（reversible）
（4）結構緊湊（Compact），實（real），奇（odd）
（5）具有一階消失矩（Vanish moment）

**特性**
哈爾小波具有如下的特性：
（1）任一函數都可以由以及它們的位移函數所組成
（2）任一函數都可以由常函數，以及它們的位移函數所組成
（3）正交性（Orthogonal） 


（4）不同寬度的（不同m）的小波函數和尺度函數之間會有一個關係- 小尺度的尺度函數可以表示大尺度的尺度函數- 小尺度的尺度函數可以表示大尺度的小波函數
（5）可以用m+1的 係數來計算m的係數
若
若
圖示如下：

**快速演算法**
上圖為哈爾小波轉換的快速演算簡易圖示，此為多重解析結構（multiresolution analysis）。

**哈爾轉換**
哈爾變換最早是由哈爾在1910年的論文《論正交函數系理論》（Zur Theorie der Orthogonalen Funktionensysteme）中所提出，是一種最簡單又可以反應出時變頻譜（time-variant spectrum）的表示方法。其觀念與傅里葉變換相近。傅里葉變換的原理是利用正弦波與餘弦波來對訊號進行調變；而哈爾變換則是利用哈爾函數來對訊號進行調變。哈爾函數也含有正弦函數系和餘弦函數系所擁有的正交性，也就是說不同的哈爾函數是互相正交的，其內積為零。
以下面的哈爾轉換矩陣為例，我們取第1行和第2行來做內積，得到的結果為零；取第二行和第三行來做內積，得到的結果也是零。依序下去，我們可以發現在哈爾轉換矩陣任取兩行來進行內積的運算，所得到的內積皆為零。
，。
，。
，。
在此前提下，利用傅里葉變換的觀念，假設所要分析的訊號可以使用多個頻率與位移不同的哈爾函數來組合而成。進行哈爾變換時，因為哈爾函數的正交性，便可求出訊號在不同哈爾函數（不同頻率）的情況下所佔有的比例。
哈爾變換有以下幾點特性：
# 不需要乘法（只有相加或加減）
# 輸入與輸出個數相同
# 頻率只分為低頻（直流值）與高頻（1和-1）部分
# 可以分析一個訊號的局部特徵
# 運算速度極快，但不適合用於訊號分析
# 大部分運算為0，不用計算
# 維度小，計算時需要佔用的內存空間少
# 因為大部分為高頻，轉換較籠統
對一矩陣做哈爾小波轉換的公式為，其中為一的區塊且為點的哈爾小波轉換。而反哈爾小波轉換為。以下為在2、4及8點時的值：
，。
，。
，。
此外，當時，。其中除了第0行為（=1 1 1 ... 1/，共N個1），第行為且
。

Matlab 代碼:

function Hr=haar_matrix(N, normalized)
    % Input :
    %     N : size of matrix, N must be power of 2.
    % Output:
    %    Hr : Haar matrix of size NxN
    p=0 0;
    q=0 1;
    n=nextpow2(N);
    for i=1:n-1
        p=p i*ones(1,2^i);
        t=1:(2^i);
        q=q t;
    end
    Hr=zeros(N,N);
    Hr(1,:)=1;
    for i=2:N
        P=p(1,i); Q=q(1,i);
        for j= (N*(Q-1)/(2^P)):(N*((Q-0.5)/(2^P))-1)
            Hr(i,j+1)=2^(P/2);
        end
        for j= (N*((Q-0.5)/(2^P))):(N*(Q/(2^P))-1)
            Hr(i,j+1)=-(2^(P/2));
        end
    end
    if normalized
        Hr=Hr*(1/sqrt(N));
    end
end
Python 代碼:  
def haarMatrix(n, normalized=False):
# Allow only size n of power 2
n = 2**np.ceil(np.log2(n))
if n > 2:
h = haarMatrix(n / 2)
else:
return np.array(1, 1, 1, -1)
# calculate upper haar part
h_n = np.kron(h, 1, 1)
# calculate lower haar part 
if normalized:
h_i = np.sqrt(n/2)*np.kron(np.eye(len(h)), 1, -1)
else:
h_i = np.kron(np.eye(len(h)), 1, -1)
# combine parts
h = np.vstack((h_n, h_i))
return h

**哈爾小波轉換應用於圖像壓縮**

**說明**
由於數位圖片檔案過大，因此我們往往會對圖片做圖像壓縮，壓縮過後的檔案大小不僅存放於電腦中不會佔到過大容量，也方便我們於網路上傳送。哈爾小波轉換其中一種應用便是用來壓縮圖像。壓縮圖像的基本概念為將圖像存成到一矩陣，例如256x256大小的圖片會存成256x256大小的矩陣，矩陣中的每一元素則代表是每一圖像的某畫素值，介於0到255間。JPEG影像壓縮的概念為先將圖像切成8x8大小的區塊，每一區塊為一8x8的矩陣。示意圖可見右圖。
在處理8x8二維矩陣前，先試著對一維矩陣作哈爾小波轉換，
公式為。

**範例**
對8x8的二維矩陣A作哈爾小波轉換，由於是對的每一列作哈爾小波轉換，作完後還要對的每一行作哈爾小波轉換，因此公式為。以下為一簡單的例子：
。
列哈爾小波轉換（row Haar wavelet transform）
。
行哈爾小波轉換（column Haar wavelet transform）
。
由以上例子可以看出哈爾小波轉換的效果，原本矩陣中變化量不大的元素經過轉換後會趨近零，再配合適當量化便可以達到壓縮的效果了。此外若一矩陣作完哈爾小波轉換後所含的零元素非常多的話，稱此矩陣為稀疏矩陣，若一矩陣越稀疏壓縮效果越好。因此可對定一臨界值，若矩陣中元素的絕對值小於此臨界值，將該元素置零，可得到更大的壓縮率。然而取過大的話會造成圖像嚴重失真，因此如何取適當的也是值得討論的議題。

**哈爾小波轉換運算量比沃爾什轉換更少**
若應用於區域的頻譜分析及偵測邊緣的話，離散傅立葉變換、Walsh-Hadamard變換及哈爾小波轉換的計算量見下表

**參考**
Jian-Jiun Ding, Time frequency analysis and wavelet transform class note,the Department of Electrical Engineering, National Taiwan University (NTU), Taipei, Taiwan, 2007.- Joseph Khoury, Application to image compression, http://aix1.uottawa.ca/~jkhoury/haar.htmdate=20080113190642 
*Lokenath Debnath, Wavelet Transforms and Their Application,Birkhauser, Boston,USA, 2002.
*Charles K. Chui, Wavelets：A Tutorial in Theory and Applications,ACADEMIC PRESS,San Diego,USA, 1992.
*Wavelets and subbands : fundamentals and applications/Agostino Abbate, Casimer M. DeCusatis, Pankaj K. Das.