哈尔小波变换(英语:Haar wavelet)是由数学家哈尔·阿尔弗雷德于1909年所提出的函数变换,是小波变换中最简单的一种变换,也是最早提出的小波变换。他是多贝西小波的于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和-1)部分
- 可以分析一个信号的局部特征
- 运算速度极快,但不适合用于信号分析
- 大部分运算为0,不用计算
- 维度小,计算时需要占用的内存空间少
- 因为大部分为高频,变换较笼统
对一矩阵做哈尔小波变换的公式为,其中为一的区块且为点的哈尔小波变换。而反哈尔小波变换为。以下为在2、4及8点时的值:
- ,。
- ,。
- ,。
- 此外,当时,。其中除了第0行为(=[1 1 1 ... 1]/,共N个1),第行为且
- 。
- Matlab 代码:
- Python 代码:
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变换及哈尔小波变换的计算量见下表
运行时间 | 为使NRMSE < 所需要的项数量 | |
---|---|---|
离散傅里叶变换 | 9.5秒 | 43 |
沃尔什变换 | 2.2秒 | 65 |
哈尔小波变换 | 0.3秒 | 128 |
参考
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.