1.哈尔基函数
最简单的基函数是哈尔基函数(Haar basis function)。哈尔基函数在1909年提出,它是由一组分段常值函数组成的函数集。这个函数集定义在半开区间[0,1)上,每一个分段常值函数的数值在一个小范围里是1,其他地方为0,现以图像为例并使用线性代数中的矢量空间来说明哈尔基函数。
如果一幅图像仅由2^0=1个像素组成,这幅图像在整个[0,1) 区间中就是一个常值函数。用q_00(x)表示这个常值函数,用V0表示由这个常值函数生成的矢量空间,即V0:q_00(x)=1(0<=x<1)或0(其它),它是构成矢量空间V0的基。
如果一幅图像由2^1=2个像素组成,这幅图像在[0,1) 区间中有两个等间隔的子区间:[0,1/2) 和[1/2,1) ,每一个区间中各有1个常值函数,分别用q_10(x) q_11(x)表示。用V1表示由2个子区间中的常值函数生成的矢量空间,即V1: q_10(x) =1(0<=x<1/2)或0(其它); q_11(x)=1(1/2<=x<1)或0(其它).这2个常值函数就是构成矢量空间V1的基。
如果一幅图像由2^2= 4个像素组成,这幅图像在[0,1)区间中被分成4个等间隔的子区间:[0,1/4),[1/4,1/2),[1/2,3/4)和[3/4,1),它们的常值函数分别用q_20(x) q_21(x) q_22(x) q_23(x)表示,用V2表示由4个子区间中的常值函数生成的矢量空间,即V2:q_20(x)=1(0<=x<1/4)或0(其它); q_21(x)=1(1/4<=x<1/2)或0(其它); q_22(x) =1(1/2<=x<3/4)或0(其它); q_23(x)=1(3/4<=x<1)或0(其它).这4个常值函数就是构成矢量空间V2的基。
我们可以按照这种方法继续定义基函数和由它生成的矢量空间。总而言之,为了表示矢量空间中的矢量,每一个矢量空间V_i都需要定义一个基(basis)。为生成矢量空间V_i而定义的基函数也叫做尺度函数,这种函数通常用符号q_ij(x)表示。哈尔基函数定义为q(x)=1(0<=x<1)或0(其它),哈尔尺度函数q_ij(x)定义为q_ij(x)=q(2^i·x-j),j=0,1,…, 2^i-1其中,i为尺度因子,改变i使函数图形缩小或者放大,j为平移参数,改变j使函数沿x轴方向平移。
空间矢量V_i定义为V_i=span{ q_ij(x)},j=0,1,…, 2^i-1.由于定义了基和矢量空间,我们就可以把由2^i个像素组成的一维图像看成为矢量空间V_i中的矢量。由于这些矢量都是在单位区间[0,1)上定义的函数,所以在V_i矢量空间中的每一个矢量也被包含在V_i+1矢量空间中,即V0∈V1∈...∈V_i∈V_i+1.
2.哈尔小波函数
小波函数通常用Ψ_ij(x)表示。与哈尔基函数相对应的小波称为基本哈尔小波函数,并由下式定义:Ψ(x)=1(0<=x<1/2)或-1(1/2<=x<1)或0(其它); 哈尔小波尺度函数Ψ_ij(x)定义为Ψ_ij(x)= Ψ(2^i·x-j),j=0,1,…, 2^i-1.用小波函数构成的矢量空间Wi表示,Wi=span{Ψ_ij(x)}, j=0,1,…, 2^i-1
根据哈尔小波函数的定义,可以写出生成W0,W1和W2等矢量空间的小波函数。
生成矢量空间W0的哈尔小波:Ψ_00(x)=1(0<=x<1/2)或-1(1/2<=x<1)或0(其它)
生成矢量空间W1的哈尔小波:Ψ_10(x)=1(0<=x<1/4)或-1(1/4<=x<1/2)或0(其它);
Ψ_11(x)=1(1/2<=x<3/4)或-1(3/4<=x<1/2)或0(其它).
生成矢量空间W2的哈尔小波:Ψ_00(x)=1(0<=x<1/2)或-1(1/2<=x<1)或0(其它)
Ψ_20(x)=1(0<=x<1/8)或-1(1/8<=x<2/8)或0(其它);
Ψ_21(x)=1(2/8<=x<3/8)或-1(3/8<=x<4/8)或0(其它);
Ψ_22(x)=1(4/8<=x<5/8)或-1(5/8<=x<6/8)或0(其它);
Ψ_00(x)=1(6/8<=x<7/8)或-1(7/8<=x<1)或0(其它).
哈尔基和哈尔小波分别使用下面两个式子进行规范化
q_ij(x)=2^(i/2)·q(2^i·x-j),
Ψ_ij(x)= 2^(i/2)·Ψ(2^i·x-j),
3.哈尔基的结构
使用哈尔基函数 q_ij(x)和哈尔小波函数Ψ_ij(x)生成的矢量空间Vi和Wi具有下面的性质,V_i+1=V_i⊕W_i。这就是说,在矢量空间V_i+1中,矢量空间W_i中的小波可用来表示一个函数在矢量空间V_i 中不能表示的部分。因此,小波可定义为生成矢量空间W_i的一组线性无关的函数Ψ_ij(x)的集合。
4.哈尔小波变换
小波变换的基本思想是用一组小波函数或者基函数表示一个函数或者信号,例如图像信号。为了理解什么是小波变换,下面用一个具体的例子来说明小波变换的过程。假设有一幅分辨率只有4个像素的一维图像,对应的像素值分别为[9 7 3 5]
计算它的哈尔小波变换系数:
(1).求均值(averaging)。计算相邻像素对的平均值,得到一幅分辨率比较低的新图像,它的像素数目变成了2个,即新的图像的分辨率是原来的1/2,相应的像素值为:[8 4]
(2).求差值(diqqerencing)。很明显,用2个像素表示这幅图像时,图像的信息已经部分丢失。为了能够从由2个像素组成的图像重构出由4个像素组成的原始图像,就需要存储一些图像的细节系数,以便在重构时找回丢失的信息。方法是把像素对的第一个像素值减去这个像素对的平均值,或者使用这个像素对的差值除以2。在这个例子中,第一个细节系数是(9-8)=1,因为计算得到的平均值是8,它比9小1而比7大1,存储这个细节系数就可以恢复原始图像的前两个像素值。使用同样的方法,第二个细节系数是(3-4)=-1,存储这个细节系数就可以恢复后2个像素值。因此,原始图像就可以用下面的两个平均值和两个细节系数表示[8 4 1 -1]
(3).重复第1,2步,把由第一步分解得到的图像进一步分解成分辨率更低的图像[6 2 1 -1].
由此可见,通过上述分解就把由4像素组成的一幅图像用一个平均像素值和三个细节系数表示,这个过程就叫做哈尔小波变换,也称哈尔小波分解(Haar wavelet decomposition)。这个概念可以推广到使用其他小波基的变换。在这个例子中我们可以看到,①变换过程中没有丢失信息,因为能够从所记录的数据中重构出原始图像。②对这个给定的变换,我们可以从所记录的数据中重构出各种分辨率的图像。例如,在分辨率为1的图像基础上重构出分辨率为2的图像,在分辨率为2的图像基础上重构出分辨率为4的图像。③通过变换之后产生的细节系数的幅度值比较小,这就为图像压缩提供了一种途径,例如去掉一些微不足道的细节系数而不影响对重构图像的理解。
求均值和差值的过程实际上就是一维小波变换的过程,现在用数学方法重新描述小波变换的过程。
(1) 用V2中的哈尔基表示
图像I(x)=[9 7 3 5]有2^j =2^2=4像素,因此可以用生成矢量空间V2中的基函数的线性组合表示,I(x) =9 q_20(x)+ 7q_21(x)+3q_22(x)+5q_23(x)
(2)用V1和W1中的函数表示
根据V2=V1⊕W1,I(x)可表示成I(x)=8q_10(x)+4q_11(x)+Ψ_10(x)-Ψ_11(x)
(3)用V0,W0和W1中的函数表示
V2=V0⊕W0⊕W1,I(x)可表示成I(x) =6 q_00(x)+2Ψ_00(x)+Ψ_10(x)-Ψ_11(x)
5.规范化算法
规范化的小波变换与非规范化的小波变换相比,唯一的差别是在规范化的小波变换中需要乘一个规范化的系数。下面用一个例子说明。对函数f(x)=[2,5,8,9,7,4, -1, 1]作哈尔小波变换。哈尔小波变换实际上是使用求均值和差值的方法进行分解。我们把f(x)看成是矢量空间V3中的一个向量,尺度因子i= 3,因此最多可分解为3层.分解过程如下。
步骤1:c=(2 5,8 9,7,4,-1,1)/√2=(7,17,11,0, -3, -1,3, -2)/√2
步骤2:c=[(7+17)/√2,(11+0)/√2,(7-17)/√2,(11-0)/√2,-3,-1,3,-2]/√2
=(24/√2,11/√2,-10/√2,11/√2,-3,-1,3,-2)/√2
步骤3:c=[(24+11)/2,(24-11)/2 ,-10/√2,11/√2,-3,-1,3,-2]/√2
=(35/2,13/2,-10/√2,11/√2,-3,-1,3,-2)/√2
6.二维哈尔小波变换
前面已经介绍了一维小波变换的基本原理和变换方法。这节将结合具体的图像数据系统地介绍如何使用小波对图像进行变换。一幅图像可看成是由许多像素组成的一个矩阵,在进行图像压缩时,为降低对存储器的要求,人们通常把它分成许多小块,例如以8×8 个像素为一块,并用矩阵表示,然后分别对每一个图像块进行处理。在小波变换中,由于小波变换中使用的基函数的长度是可变的,虽然无须像以离散余弦变换(DCT)为基础的JPEG标准算法那样把输入图像进行分块以避免产生JPEG图像那样的“块效应”,但为便于理解小波变换,还是从一个小的图像块入手,并且继续使用哈尔小波对图像进行变换。
假设有一幅灰度图像,其中的一个图像块用矩阵 A表示为,
[64 2 3 61 60 6 7 57
9 55 54 12 13 51 50 16
17 47 46 20 21 43 42 24
40 26 27 37 36 30 31 33
32 34 35 29 28 38 39 25
41 23 22 44 45 19 18 48
49 15 14 52 53 11 10 56
8 58 59 5 4 62 63 1]
一个图像块是一个二维的数据阵列,进行小波变换时可以对阵列的每一行进行变换,然后对行变换之后的阵列的每一列进行变换,最后对经过变换之后的图像数据阵列进行编码。
从求均值(averaging)与求差值(differencing)开始。在图像块矩阵A中,第一行的像素值为[64 2 3 61 60 6 7 57]
步骤1:在第一行上取每一对像素的平均值,并将结果放到第一行的前4个位置,其余的4个数是R0行每一对像素的第一个数与其相应的平均值之差,并将结果放到第一行的后4个位置
步骤2:对第一行前4个数使用与第一步相同的方法,得到两个平均值和两个差(系数),并依次放在第一行的前4个位置,其余的4个细节系数位置不动。
步骤3:用与第1和2 步相同的方法,对剩余的一对平均值求平均值和差值。
使用求均值和求差值的方法,对矩阵的每一行进行计算,得到A’
[32.5 0 0.5 0.5 31 -29 27 -25
32.5 0 -0.5 -0.5 -23 21 -19 17
32.5 0 -0.5 -0.5 -15 13 -11 9
32.5 0 0.5 0.5 7 -5 3 -1
32.5 0 0.5 0.5 -1 3 -5 7
32.5 0 -0.5 -0.5 9 -11 13 -15
32.5 0 -0.5 -0.5 17 -19 21 -23
32.5 0 0.5 0.5 -25 27 -29 31]
其中,每一行的第一个元素是该行像素值的平均值,其余的是这行的细节系数。使用同样的方法,对A’的每一列进行计算,得到A’’
[32.5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 4 -4 4 -4
0 0 0 0 4 -4 4 -4
0 0 0.5 0.5 27 -25 23 -21
0 0 -0.5 -0.5 -11 9 -7 5
0 0 0.5 0.5 -5 7 -9 11
0 0 -0.5 -0.5 21 -23 25 -27]
其中,左上角的元素表示整个图像块的像素值的平均值,其余是该图像块的细节系数。根据这个事实,如果从矩阵中去掉表示图像的某些细节系数,事实证明重构的图像质量仍然可以接受。具体做法是设置一个阈值d,例如d>=5的细节系数就把它当作“0”看待,这样经过变换之后的矩阵就变成A’’’
[32.5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 27 -25 23 -21
0 0 0 0 -11 9 -7 0
0 0 0 0 0 7 -9 11
0 0 0 0 21 -23 25 -27]
“0”的数目增加了18个,也就是去掉了18个细节系数。这样做的好处是可提高编码的效率。对A’’’矩阵进行逆变换,得到了重构的近似矩阵AA
[59.5 5.5 7.5 57.5 55.5 9.5 11.5 53.5
5.5 59.5 57.5 7.5 9.5 55.5 53.5 11.5
21.5 43.5 41.5 23.5 25.5 39.5 32.5 32.5
43.5 21.5 23.5 41.5 39.5 25.5 32.5 32.5
32.5 32.5 39.5 25.5 23.5 41.5 43.5 21.5
32.5 32.5 25.5 39.5 41.5 23.5 21.5 43.5
53.5 11.5 9.5 55.5 57.5 7.5 5.5 59.5
11.5 53.5 55.5 9.5 7.5 57.5 59.5 5.5]
如果矩阵A的数据与矩阵AA的数据用图表示,原图和重构图差别不是很大