小波分析-第八部分-mallat金字塔算法小波变换
- 格式:ppt
- 大小:977.50 KB
- 文档页数:19
⼩波学习之⼀(单层⼀维离散⼩波变换DWT的Mallat算法C++和MATLAB实现)1 Mallat算法离散序列的Mallat算法分解公式如下:其中,H(n)、G(n)分别表⽰所选取的⼩波函数对应的低通和⾼通滤波器的抽头系数序列。
从Mallat算法的分解原理可知,分解后的序列就是原序列与滤波器序列的卷积再进⾏隔点抽取⽽来。
离散序列的Mallat算法重构公式如下:其中,h(n)、g(n)分别表⽰所选取的⼩波函数对应的低通和⾼通滤波器的抽头系数序列。
2 ⼩波变换实现过程(C/C++)2.1 ⼩波变换结果序列长度⼩波的Mallat算法分解后的序列长度由原序列长SoureLen和滤波器长FilterLen决定。
从Mallat算法的分解原理可知,分解后的序列就是原序列与滤波器序列的卷积再进⾏隔点抽取⽽来。
即分解抽取的结果长度为(SoureLen+FilterLen-1)/2。
2.2 获取滤波器组对于⼀些通⽤的⼩波函数,简单起见,可以通过Matlab的wfilters(‘wavename’)获取4个滤波器;特殊的⼩波函数需要⾃⾏构造获得。
下⾯以db1⼩波函数(Haar⼩波)为例,其变换与重构滤波器组的结果如下://matlab输⼊获取命令>> [Lo_D,Hi_D,Lo_R,Hi_R] = wfilters('db1')//获取的结果Lo_D =0.7071 0.7071Hi_D =-0.7071 0.7071Lo_R =0.7071 0.7071Hi_R =0.7071 -0.70712.3 信号边界延拓在Mallat算法中,假定输⼊序列是⽆限长的,⽽实际应⽤中输⼊的信号是有限的采样序列,这就会出现信号边界处理问题。
对于边界信号的延拓⼀般有3种⽅法,即零延拓、对称延拓和周期延拓。
3种延拓⽅法⽐较情况如下:对于正交⼩波变换来说,前两种延拓⽅法实现起来⽐较简单,但重建时会产⽣边界效应,⽽且分解的层数越多,产⽣的边界效应越显著。
第8章 小波分析及其MATLAB 实现本文档节选自:Matlab 在数学建模中的应用,卓金武等编著, 北航出版社,2011年4月出版8.1小波分析基本理论8.1.1 Fourier 变换的局限性8.1.1.1变换的含义我们把那些定义域和因变域都不是数值或常量的函数称为变换或算子,它们是定义域和值域本身为函数集的函数,如傅里叶变换(Fourier Transform )和拉普拉斯变换(Laplace Transform ),其定义域是时间的函数,而因变域是频率的函数。
简单地说,变换的基本思想仍然是映射,变换是函数的函数。
8.1.1.2 Fourier 变换的局限性信号分析的主要目的是寻找一种简单有效的信号变换方法,使信号包含的重要特征能显示出来。
在小波变换兴起之前,Fourier 级数展开和Fourier 分析是刻画函数空间、求解微分方程、进行数学计算的有效方法和有效的数学工具。
从物理直观上看,一个周期性振动的量可以看成是具有简单频率的简谐振动的叠加。
Fourier 级数展开则是这一物理过程的数学描述,Fourier 变化和Fourier 逆变换公式如下:函数)()(1R L t f ∈的连续Fourier 变换定义为t t f ft d e )()(ˆi -⎰+∞∞-=ωω)(ˆωf 的Fourier 逆变换定义为 ωωωd e )(ˆπ21)(i ⎰+∞∞-=t f t f 从公式上看,Fourier 变换是域变换,它把时间域和频率域联系起来,在时间域上难以观察到的现象和规律,在频域往往能十分清楚地显示出来。
频谱分析的本质就是对)(ˆωf的加工、分析和滤波等处理。
Fourier 变换是平稳信号分析的最重要的工具。
然而在实际运用中,所遇到的信号大多数并不平稳,而是时变频率信号,这时人们需要知道信号在突变时刻所对应的频率成分,显然Fourier 变换的积分作用平滑了非平稳过程的突变部分,作为积分核tω-i e的幅值在任何情况下均为1,因此,在频谱)(ˆωf的任一频点值是由时间过程)(t f 在整个时间域上)(∞+-∞,上的贡献决定的;反之,时间过程)(t f 在某一时刻的状态也是由)(ˆωf在整个频率域)(∞+-∞,上贡献决定的。
一个多分辨率信号分解理论:小波表示摘要:多分辨率表示对于分析图像信号内容十分有效,我们研究了在一给定分辨率下逼近信号算子的性能。
显示出在分辨率12+j 和j 2下逼近信号的信息不同,通过在小波标准正交基2L 上分解这一信号可以将其提取。
小波标准正交基是一系列函数,它由扩大和转化唯一函数)(x ψ来构建。
这一分解定义了一个正交多尺度表示叫做小波表示。
它由金字塔算法来计算,其基于正交镜像滤波器的卷积。
对于图像,小波表示区分了几种空间定位。
我们研究这一表示在数据压缩,图像编码,结构辨别及分形分析上的应用。
关键词-编码,分形,多分辨率金字塔,正交镜像滤波器,结构辨别,小波变换 1. 引言在计算机视觉方面,很难由图像像素的灰度强度来直接分析一个图像的信息内容。
的确,这一数值依赖于照明条件。
更为重要的是图像强度的局部变化。
邻居的大小即对比计算处必须被采用于我们要分析的物体大小。
这一尺寸为测量图像局部变化定义了参考分辨率。
总的来说,我们想要识别的结构具有差异很大的尺寸。
因此,定义分析图像的优先或最优分辨率是不可能的。
一些研究人员发明了图像比对算法用来处理不同分辨率下的图像。
为这一目的,一种算法可以识别图像信息至一系列在不同分辨率下显现的细节。
给定一个提高分辨率的序列j r ,在分辨率j r 下的图像细节被定义为它的分辨率j r 下逼近与低分辨率1-j r 下逼近之间的信息差别。
多分辨率分解使得我们可以获得图像的尺度不变性演绎。
图像尺度随着场景与相机光学中心间的距离而变化。
当图像尺寸修改时,我们对于图像的演绎不应该变化。
多分辨率分解可以满足局部尺度不变性如果分辨率参量j r 的序列以指数形式变化。
我们假设存在分辨率一步R ∈α对于所有整数j ,j j r α=。
如果相机靠近场景时间为α,则每一物体被投影到一个2α的区域比相机焦平面更大。
即每一物体以α倍大的分辨率度量。
因此,新图片在分辨率j α下细节与先前在分辨率1+j α下图像细节相一致。
第4章 小波变换的实现技术4.1 Mallat 算法双正交小波变换的Mallat 算法:设{}n h h =、{}n g g =、{}n h h =、{}n g g =为实系数双正交小波滤波器。
h ,g 是小波分析滤波器,h ,g 是小波综合滤波器。
h 表示h 的逆序,即n n h h -=。
若输入信号为n a ,它的低频部分和高频部分以此为1n a -和1n d -,小波分解与重构的卷积算法:11()()n n n na D a h d D a g --⎧⎪=*⎨=*⎪⎩ n11()()n n a Uah Ud g --=*+*先进行输入信号和分析滤波器的巻积,再隔点采样,以形成低频和高频信号。
对于有限的数据量,经过多次小波变化后数据量大减,因此需对输入数据进行处理。
4.1.1 边界延拓方法下面给出几种经验方法。
1. 补零延拓是假定边界以外的信号全部为零,这种延拓方式的缺点是,如果输入信号在边界点的值与零相差很大,则零延拓意味着在边界处加入了高频成分,造成很大误差。
实际应用中很少采用。
0121,0,,,,...,,0,0,......n s s s s -2.简单周期延拓将信号看作一个周期信号,即k n k s s +=。
简单周期延拓后的信号变为这种延拓方式的不足之处在于,当信号两端边界值相差很大时,延拓后的信号将存在周期性的突变,也就是说简单周期延拓可在边界引入大量高频成分,从而产生较大误差。
3. 周期对称延拓这种方法是将原信号在边界上作对称折叠,一般分二1)当与之做卷积的滤波器为奇数时,周期延拓信号为2)当与之做卷积的滤波器为偶数时,周期延拓信号为4. 光滑常数延拓在原信号两端添加与端点数据相同的常数。
0121,,,...,,n s s s s -0121,,,...,,n s s s s -0121,,,...,,n s s s s -0,...s 1,...,n s -01221,,,...,,,n n s s s s s --0121,,,...,,n s s s s -21012,...,,,,,...n s s s s s -321212,,,...,,,,...n n n s s s s s s ---10012,,...,,,,...n n s s s s s --10112,,,...,,,n n n s s s s s ---5. 平滑延拓在原信号两端用线性外插法补充采样值,即沿着信号两端包络线的一阶导数方向增加采样值。
⼩波mallat算法算法要求:输⼊序列是⼤于滤波器长度的偶数列确实可以通过编程的⼿段使算法适合所有的情况,但本⽂章的⽬的是展⽰mallat算法的过程,所以就⼀切从简了// Mallat.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "stdio.h"/*mallat算法分解* dSIn 输⼊的序列s,dH0尺度函数展开系数,dH1⼩波函数展开系数,dSOut输出低频部分,dDOut输出⾼频部分,* nSIn_Len 输⼊序列的长度,nH_Len 滤波器的长度。
*/int DwtFun(double *pdSIn,double *pdH0,double *pdH1,double *pdSOut,double *pdDOut,int nSIn_Len,int nH_Len) {int i,j,k;//延拓后的Len是⼀个本体长度加⼀个滤波器长度int nLen=nSIn_Len+2*nH_Len;//建⽴滤波前的序列pdSArray,滤波后的序列pdSAOut低频部分,pdDAOut⾼频部分double *pdSArray=new double[nLen];double *pdSAOut=new double[nLen];double *pdDAOut=new double[nLen];//对称延拓for(i=0;i<nLen;i++){if(i<nH_Len){pdSArray[i]=pdSIn[nH_Len-i-1];}else if(i>=nH_Len+nSIn_Len){pdSArray[i]=pdSIn[nH_Len+2*nSIn_Len-1-i];}else{pdSArray[i]=pdSIn[i-nH_Len];}}//求输出序列低频部分dSOut,⾼频部分dDOut.i->nLen,k->nH_Lendouble dSTemp,dDTemp;for(i=0;i<nLen;i++){dSTemp=0.0;dDTemp=0.0;for(k=0;k<nH_Len;k++){if((i-k)<0)continue;else{//低频部分dSTemp+=pdH0[nH_Len-k-1]*pdSArray[i-k];//⾼频部分dDTemp+=pdH1[nH_Len-k-1]*pdSArray[i-k];}}pdSAOut[i]=dSTemp;pdDAOut[i]=dDTemp;}//⼆抽取.先将pdSAOut前nH_Len长的⼀段舍弃,抽取偶数列for(i=nH_Len,j=0;i<nLen;i+=2,j++){pdSOut[j]=pdSAOut[i+1];pdDOut[j]=pdDAOut[i+1];}//返回输出序列的长度return j;delete pdSArray;pdSArray=NULL;delete pdSAOut;pdSAOut=NULL;delete pdDAOut;pdDAOut=NULL;}/*mallat 算法重构* psSIn 输⼊的低频序列,pdDIn输⼊的⾼频序列,g0,g1重构滤波器,pdOut输出序列,nSInLen输⼊序列的长度* nG_Len 滤波器长度*/int IDwtFun(double *pdSIn,double *pdDIn,double *pdG0,double *pdG1,double *pdOut,int nSInLen,int nG_Len) {int i,j,k;//建⽴⼀个数列存放插⼊后的数列int nTemp=2*nSInLen;double *pdInSertS=new double[nTemp];double *pdInSertD=new double[nTemp];//⼆插⼊j=0;for(i=0;i<nTemp;i++){if(i%2==0){pdInSertS[i]=0;pdInSertD[i]=0;}else{pdInSertS[i]=pdSIn[j];pdInSertD[i]=pdDIn[j];j++;}}//对称拓延//创建⼀个nTemp+nG_Len长的数列int nLen=nTemp+2*nG_Len;double *pdSAIn=new double[nLen];double *pdDAIn=new double[nLen];for(i=0;i<nLen;i++){if(i<nG_Len){pdSAIn[i]=pdInSertS[nG_Len-i-1];pdDAIn[i]=pdInSertD[nG_Len-i-1];}else if(i==nTemp+nG_Len){pdSAIn[i]=0.0;pdDAIn[i]=0.0;}else if(i>nTemp+nG_Len){pdSAIn[i]=pdInSertS[nG_Len+2*nTemp-i-1];pdDAIn[i]=pdInSertD[nG_Len+2*nTemp-i-1];}else{pdSAIn[i]=pdInSertS[i-nG_Len];pdDAIn[i]=pdInSertD[i-nG_Len];}}//⽤滤波器G0和G1对数列进⾏滤波double *pdSAOut=new double[nLen];double *pdDAOut=new double[nLen];double dSTemp,dDTemp;for(i=0;i<nLen;i++){dSTemp=0.0;dDTemp=0.0;for(k=0;k<nG_Len;k++){if((i-k)<0)continue;else{//低频部分dSTemp+=pdG0[nG_Len-k-1]*pdSAIn[i-k];//⾼频部分dDTemp+=pdG1[nG_Len-k-1]*pdDAIn[i-k];}}pdSAOut[i]=dSTemp;pdDAOut[i]=dDTemp;}//合并低频,⾼频for(i=2*nG_Len-1,j=0;i<nLen;i++,j++){pdOut[j]=pdSAOut[i]+pdDAOut[i];}return j;delete pdInSertS;pdInSertS=NULL;delete pdInSertD;pdInSertD=NULL;delete pdSAIn;pdSAIn=NULL;delete pdDAIn;pdDAIn=NULL;delete pdSAOut;pdSAOut=NULL;delete pdDAOut;pdDAOut=NULL;}int main(int argc, char* argv[]){int i;//db4⼩波,已经取反 h0,h1是分解滤波器,g0,g1是重构滤波器double dDb4h0[] = { 0.2303778133088964, 0.7148465705529154,0.6308807679398587, -0.0279837694168599,-0.1870348117190931, 0.0308413818355607,0.0328830116668852, -0.0105974017850690 };double dDb4h1[] = { -0.0105974017850690 , -0.0328830116668852, 0.0308413818355607 , 0.1870348117190931,-0.0279837694168599 , -0.6308807679398587,0.7148465705529154 , -0.2303778133088964};double dDb4g0[] = { -0.0105974017850690 , 0.0328830116668852,0.0308413818355607 , -0.1870348117190931,-0.0279837694168599 , 0.6308807679398587,0.7148465705529154 , 0.2303778133088964};double dDb4g1[] = { -0.2303778133088964 , 0.7148465705529154,-0.6308807679398587 , -0.0279837694168599,0.1870348117190931 , 0.0308413818355607,-0.0328830116668852 , -0.0105974017850690};//⽣成⼀个数列,本算法要求输⼊的数列是⽐滤波器长的偶数列double a[]={1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0,10.0,11.0,12.0,13.0,14.0,15.0,16.0}; //double a[]={1.0,4.0,5.5,8.2,2.7,5.2,2.0,2.0,2.0,3.0,3.0,4.0,4.0,14.0,17.0,11.0};//输出double *pdS=new double[100];double *pdD=new double[100];double *pdOut=new double[100];int l=DwtFun(a,dDb4h0,dDb4h1,pdS,pdD,16,8);for(i=0;i<l-1;i++){printf("%f\t",pdS[i]);printf("\n");}printf("*********************\n");for(i=0;i<l-1;i++){printf("%f\t",pdD[i]);printf("\n");}printf("*********************\n");int v=IDwtFun(pdS,pdD,dDb4g0,dDb4g1,pdOut,11,8);//i<v-nG_Len+1for(i=0;i<v-7;i++){printf("%f\t",pdOut[i]);printf("\n");}delete []pdS;pdS=NULL;delete []pdD;pdD=NULL;delete []pdOut;pdOut=NULL;return 0;}。
摘要:这段时间学习了小波以及小波变换的基础知识,学习了快速小波变换的基本原理,练习了基于小波的图像处理的基本方法。
关键词:小波,小波变换,Mallat 算法,基于小波的图像处理一、小波和小波变换的定义小波就是满足可容许条件的具有特殊性质的函数或称小波基函数,而小波变换就是选择适当的基本小波或称母波,通过对基本小波平移、伸缩而形成的一系列的小波,然后将欲分析的信号投影到由平移、伸缩小波构成的信号空间中。
这种平移、放大、缩小是小波变换的一个特点,因而可以在不同的频率范围,不同的时间位置对信号进行分析。
小波变换是一种线性变换,它将信号分解成不同幅值(分辨率)的分量。
假定是内的实或复值函数,当且仅当下式成立时函数被看成小波,其中为函数的傅里叶变换函数: +∞<⎰∞+∞-ωωψd w |||)(|2上述意味着⎰+∞∞-=0)(t d t ψ即是振荡的且面积为零)(a 1a )(a t t τψτψ-=、、 其中为小波函数,a 为尺度常数,为位置常数,则上式是由原像小波通过平移和伸缩得到的。
小波变换定义为:t d a t t f a Wf )(*)(a1),(τψτ-=⎰+∞∞- 其中:f(t)属于的任意函数,Wf(a, )代表含尺度和位置常数的小波变换,*即进行卷积运算。
小波变换取决于两个参数:尺度a 和位置,它们在实数范围内不断地变化,对于比较小的a 值,小波集中在时间域而小波变换给出信号的宏观信息;而当a 值比较大时,小波扩展,小波变换给出宏观信息。
小波变换是一种窗口大小固定不变,但其形状可以改变的局部化分析方法。
小波变换在信号的高频部分可以取得较好的时间分辨率;在信号的低频部分,可以取得较好的频率分辨率,从而能有效地从信号(如语音、图像等)中提取信息。
二、快速小波算法—Mallat 算法1. 一维信号的拓延 在Mallat 算法的推导中,假定输入序列是无限长的,而实际应用中常常是分时采样,即输入序列为有限长.此时,滤波器系数与输入序列卷积时就会出现轮空的现象.因此有必要对原始信号进行边界延拓,减小边界误差.解决的方法通常有补零法、周期延拓法和对称延拓法.设输入信号为f(n),长度为srcLen,滤波器长度为filterLen.下面给出信号边界处理几种方法的具体表达式如下:1)周期拓延法:将原来有限长的输入序列拓展成周期的序列.周期延拓可适用于任何小波变换,但可能导致输入序列边缘的不连续,使得高频系数较大.这种方式的拓延卷积后与源信号的长度一致。
- 252 -小波分析原理1.1 小波变换及小波函数的多样性小波是函数空间2()L R 中满足下述条件的一个函数或者信号()x ψ:2ˆ().R C d ψψωωω+=<∞⎰式中,*{0}R R =-表示非零实数全体,ˆ()ψω是()x ψ的傅里叶变换,()x ψ成为小波母函数。
对于实数对(,)a b ,参数a 为非零实数,函数(,)()x b a b x a ψ-⎛⎫=⎪⎝⎭称为由小波母函数()x ψ生成的依赖于参数对(,)a b 的连续小波函数,简称小波。
其中:a 称为伸缩因子;b 称为平移因子。
对信号()f x 的连续小波变换则定义为,(,)()(),()f a b Rx b W a b f x dx f x x a ψψ-⎛⎫==〈〉 ⎪⎝⎭其逆变换(回复信号或重构信号)为*1()(,)fR R x b f x W a b dadb C a ψψ⨯-⎛⎫=⎪⎝⎭⎰⎰ 信号()f x 的离散小波变换定义为2(2,2)2()(2)j j j j f W k f x x k dx ψ+∞---∞=-⎰其逆变换(恢复信号或重构信号)为(2,2)()(2,2)()j j j j fk j k f t C Wk x ψ+∞+∞=-∞=-∞=∑∑其中,C 是一个与信号无关的常数。
显然小波函数具有多样性。
在MA TLAB 小波工具箱中提供了多种小波幻术,包括Harr 小波,Daubecheies (dbN )小波系,Symlets (symN )小波系,ReverseBior (rbio )小波系,Meyer (meyer )小波,Dmeyer (dmey )小波,Morlet(morl)小波,Complex Gaussian(cgau)小波系,Complex morlet(cmor)小波系,Lemarie (lem )小波系等。
实际应用中应根据支撑长度、对称性、正则性等标准选择合适的小波函数。
- 253 -1.2 小波的多尺度分解与重构1988年Mallat 在构造正交小波基时提出多尺度的概念,给出了离散正交二进小波变换的金字塔算法,其小波分析树形结构如图1所示,即任何函数2()()f x L R ∈都可以根据分辨率为2N-的()f x 的低频部分(近似部分)和分辨率为2(1)j j N -≤≤下()f x 的高频部分(细节部分)完全重构。