哈尔小波变换
哈尔小波变换(英语:Haar wavelet)是由数学家哈尔·阿尔弗雷德于1909年所提出的函数变换,也是小波变换中最简单的一种变换,也是最早提出的小波变换。他是多贝西小波的于N=2的特例,可称之为D2。
哈尔小波的母小波(mother wavelet)可表示为:
且对应的尺度函数(scaling function)可表示为:
其滤波器(filter)被定义为
:
当n = 0与n = 1时,有两个非零系数,因此,我们可以将它写成
在所有正交性(orthonormal)小波变换中哈尔小波(Haar wavelet)变换是最简单的一种变换,但它并不适合用于较为平滑的函数,因为它只有一个消失矩(Vanishing Moment)。
小波母函数
参与变换的小波函数(wavelet function)也叫母小波(mother wavelet)。小波母函数可表示为:
(1):
(2) :
(3):
因此,由上式我们可以归纳出几个重点:
(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)的wavelet/scaling functions之间会有一个关系
(5)可以用m+1的 系数来计算m的系数
若
若
图示如下:
快速算法
上图为哈尔小波变换的快速演算简易图示,此为多重解析结构(multiresolution analysis)。
哈尔变换
哈尔变换最早是由哈尔在1910年的论文《论正交函数系理论》(德语:Zur Theorie der Orthogonalen Funktionensysteme)中所提出,是一种最简单又可以反应出时变频谱(time-variant spectrum)的表示方法。其观念与傅里叶变换相近。傅里叶变换的原理是利用正弦波与余弦波来对信号进行调变;而哈尔变换则是利用哈尔函数来对信号进行调变。哈尔函数也含有正弦函数系和余弦函数系所拥有的正交性,也就是说不同的哈尔函数是互相正交的,其内积为零。
以下面的哈尔变换矩阵为例,我们取第1行和第2行来做内积,得到的结果为零;取第二行和第三行来做内积,得到的结果也是零。依序下去,我们可以发现在哈尔变换矩阵任取两行来进行内积的运算,所得到的内积皆为零。
- , 。
- , 。
- , 。
在此前提下,利用傅里叶变换的观念,假设所要分析的信号可以使用多个频率与位移不同的哈尔函数来组合而成。进行哈尔变换时,因为哈尔函数的正交性,便可求出信号在不同哈尔函数(不同频率)的情况下所占有的比例。
哈尔变换有以下几点特性:
- 不需要乘法(只有相加或加减)
- 输入与输出个数相同
- 频率只分为低频(直流值)与高频(1和-1)部分
- 可以分析一个信号的局部特征
- 运算速度极快,但不适合用于信号分析
- 大部分运算为0,不用计算
- 维度小,计算时需要占用的内存空间少
- 因为大部分为高频,变换较笼统
对一矩阵 做哈尔小波变换的公式为 ,其中 为一 的区块且 为 点的哈尔小波变换。而反哈尔小波变换为 。以下为 在2、4及8点时的值:
- , 。
- , 。
- , 。
- 此外,当 时, 。其中 除了第0个row为 ( =[1 1 1 ... 1]/ ,共N个1),第 个row为 且
- 。
- Matlab Code:Python Code:
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
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变换及哈尔小波变换的计算量见下表
Running Time | terms required for NRMSE < | |
---|---|---|
离散傅里叶变换 | 9.5秒 | 43 |
沃尔什变换 | 2.2秒 | 65 |
哈尔小波变换 | 0.3秒 | 128 |
参考
- 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.htm(页面存档备份,存于互联网档案馆)
- 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.