哈爾小波轉換

哈爾小波轉換(英語:Haar wavelet)是由数学家哈尔·阿尔弗雷德於1909年所提出的函数变换英语Transform theory,是小波轉換中最簡單的一種轉換,也是最早提出的小波轉換。他是多贝西小波的於N=2的特例,可稱之為D2或db1。

哈爾小波的母小波(mother wavelet)可表示為:

對應的尺度函数(scaling function)可表示為:

其濾波器(filter)被定義為

時,滤波器系数非零,此时可以用哈尔小波的滤波器系数及其尺度函数,将母小波函数表示为:

在所有正交(orthonormal)小波轉換中,哈爾小波轉換是最簡單的一種轉換,但它並不適合用於較為平滑的函數,因為它只有一個消失矩(Vanishing Moment)。

小波母函數

参与变换的小波函数(wavelet function)也叫母小波(mother wavelet)。

小波母函數可以用尺度函数表示: 

对小波的母函数可以进行伸缩和平移,例如  

当尺度离散方式选取 时,依据哈尔小波函数的定义,我们可以推出[1]

(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. 不需要乘法(只有相加或加減)
  2. 輸入與輸出個數相同
  3. 頻率只分為低頻(直流值)與高頻(1和-1)部分
  4. 可以分析一個訊號的局部特征
  5. 運算速度極快,但不適合用於訊號分析
  6. 大部分運算為0,不用計算
  7. 維度小,计算时需要占用的内存空间少
  8. 因為大部分為高頻,轉換較籠統

對一矩陣 做哈爾小波轉換的公式為 ,其中 為一 的區塊且  點的哈爾小波轉換。而反哈爾小波轉換為 。以下為 在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变换及哈爾小波轉換的計算量見下表
运行时间 为使NRMSE <  所需要的项数量
離散傅立葉變換 9.5秒 43
沃爾什轉換 2.2秒 65
哈爾小波轉換 0.3秒 128

參考

  1. ^ 胡广书. 现代信号处理教程 第二版. 北京. 2015-03. ISBN 978-7-302-38934-7. OCLC 1101305618.