《医学图像处理》实验报告
实验十:小波变换
日期: 2014年05月06日
摘要
本次实验的实验目的及主要内容是:
一维小波变换和反变换
二维小波变换和反变换
二维小波细节置零、去噪
一、技术讨论
1.1实验原理
小波变换的原理:是指一组衰减震动的波形,其振幅正负相间变化为零,是具有一定的带宽和中心频率波组。小波变换是用伸缩和平移小波形成的小波基来分解(变换)或重构(反变换)时变信号的过程。不同的小波具有不同带宽和中心频率,同一小波集中的带宽与中心频率的比是不变的,小波变换是一系列的带通滤波响应。它的数学过程与傅立叶分析是相似的,只是在傅立叶分析中的基函数是单频的调和函数,而小波分析中的基函数是小波,是一可变带宽内调和函数的组合。
小波去噪的原理:利用小波变换把含噪信号分解到多尺度中,小波变换多采用二进型,然后在每一尺度下把属于噪声的小波系数去除,保留并增强属于信号的小波系数,最后重构出小波消噪后的信号。其中关键是用什么准则来去除属于噪声的小波系数,增强属于信号的部分。
1.2实验方法
1)dwt函数(实现1-D离散小波变换)
[cA,cD]=dwt(X,’wname’)使用指定的小波基函数‘wname’对信号X进行分解,cA和cD分别是近似分量和细节分量;
[cA,cD]=dwt(X,Lo_D,Hi_D)用指定的滤波器组Lo_D,Hi_D对信号进行分解
2)idwt函数(实现1-D离散小波反变换)
X=idwt(cA,cD,’wname’)
X=idwt(cA,cD,Lo_R,Hi_R)
X=idwt(cA,cD,’wname’,L)
X=idwt(cA,cD,Lo_R,Hi_R,L)
由近似分量cA和细节分量cD经过小波反变换,选择某小波函数或滤波器组,L为信号X中心附近的几个点
3)dwt2函数(实现2-D离散小波变换)
[cA,cH,cV,cD]=dwt2(X,’wname’)
[cA,cH,cV,cD]=dwt2(X,’wname’)
cA近似分量,cH水平细节分量,cV垂直细节分量,cD对角细节分量
4)idwt2函数(实现2-D离散反小波变换)
X=idwt2(cA,cH,cV,cD,’wname’)
X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)
X=idwt2(cA,cH,cV,cD,’wname’,S)
X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R,S)
二、结果与讨论
2.1实验结果
一维小波变换的结果
图一
(a)
(b)
(a)此时size值取4,f为{1,4,-3,0,}
(b)此时size值取6,f为{1,4,-3,0,8,3} 二维小波变换的结果:
图二、正变换结果
(a ) (b )
反变换结果(利用正变换结果进行反变换)
(c ) (d )
置零处理结果:(三个细节分别置零处理)
图三 右下角置0
(a )original pic (b )zero
(c ) wave result (d )change
图四 左下角置0
(a )original pic (b )zero
(c )wave result (d )change
图五右上角置0
(a)original pic (b)zero
(c)wave result (d)change 去噪结果:
图六去噪结果
(a)original pic (b)zero
(c )wave result (d )change
2.2实验讨论
1)一维小波变换原理是将信号分解为高频和低频两列信号,对于实验中的一维信号,实验结果图一验证了这一结果,即将信号分解为高频和低频。
2)对于二维小波变换,信号将图像信息分解为高频和低频信息。正变换是将图像分解为高频、低频信息,图二(b )是对(a )进行分解的结果,(b )的右上角、左上角以及左下角均为高频信息,左上角为低频信息。而(d )是根据(c )的高频、低频信息进行重构的结果。
3)对于置零处理,分别对图像右下角、左下角以及左上角进行置零的时候,原图应该出现横向细节、垂直细节以及对角线细节被清理的后果,从图三到图五来看,可知由于图片选择问题,从当今结果不能清晰表达出来。
4)去噪是将小波变换结果的高频细节全部置零,得到的图像将比之前清晰,从图六可以简单得出此结论。
附录(实验代码)
.pro程序如下:
#-------------------------------------------------
#
# Project created by QtCreator 2014-05-08T21:26:01
#
#-------------------------------------------------
QT += core
QT -= gui
TARGET= shiyanshi
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES+= main.cpp
INCLUDEPATH+=d:\Qt\opencv2.2\include\opencv\
d:\Qt\opencv2.2\include\opencv2\
d:\Qt\opencv2.2\include
LIBS+=d:\Qt\opencv2.2\lib\libopencv_calib3d220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_contrib220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_core220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_features2d220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_flann220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_gpu220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_highgui220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_imgproc220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_legacy220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_ml220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_objdetect220.dll.a\
d:\Qt\opencv2.2\lib\libopencv_video220.dll.a
HEADERS += \
I:/【快盘下载】实验十小波变换/头文件/targetver.h \
I:/【快盘下载】实验十小波变换/头文件/stdafx.h \
I:/【快盘下载】实验十小波变换/头文件/sdkddkver.h \
.cpp程序
一、一维小波变换
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define SIZE 4
#define layer 2
void DWT_1_harr( double *in, double *out, int scale, int size ); void iDWT_1_harr2( double *in, double *out,int scale, int size ); int main(){
double f[SIZE] = {1,4,-3,0};
double q[SIZE]={0};
DWT_1_harr( f, q, 2, SIZE );
for (int i=0; i { printf("%lf\n",f[i]); } printf("\n"); iDWT_1_harr2( f, q, 2, SIZE ); for (int i=0; i { printf("%lf\n",f[i]); } char key_cmd = 1; while(1){ key_cmd = cvWaitKey(); if(key_cmd==27) break; } return 0; } //一维harr小波变换 void DWT_1_harr( double *in, double*out,int scale, int size ){ //检查尺度是否吻合 if( scale>(log(size)/log(2.0)) ){ printf("Scale is too large\n"); return; } int t = size; int i; while( scale>0 ){ t = t/2; for (i=0; i out[i]=(in[2*i]+in[2*i+1])/1.4142; out[t+i]=(in[2*i]-in[2*i+1])/1.4142; } for (i=0; i in[i]=out[i]; } scale--; } } //一维haar小波反变换(自动计算尺度) void iDWT_1_harr2( double *in, double *out, int scale, int size ){ //检查尺度是否吻合 if( scale>(log(size)/log(2.0)) ){ printf("Scale is too large\n"); return; } int t = size/pow(2,scale); int i; while( scale>0 ){ for( i=0; i out[2*i] = (in[i]+in[t+i])*0.7071; out[2*i+1] = (in[i]-in[t+i])*0.7071; } for(i=0;i in[i]=out[i]; } t *=2; scale--; } } 二、二维小波变换程序 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include #include #include #include #include #include #include #include #include #include #define SIZE 452 #define layer 1 void DWT_1_harr( double *in, double *out, int scale, int size ); void iDWT_1_harr( double *in, double *out, int size ); void DWT_2_harr( IplImage *img_in, int scale ); void iDWT_2_harr( IplImage *img_in, int scale ); int main(){ IplImage* img_in = cvLoadImage("d:/zero_screenshot_05.05.2014.png"); CvSize size = cvSize( img_in->width, img_in->height ); IplImage* img_gray = cvCreateImage(size,IPL_DEPTH_8U,1);cvCvtColor(img_in, img_gray, CV_BGR2GRAY ); // IplImage* img_gray2 = cvCreateImage(size,IPL_DEPTH_64F,1); IplImage* img_gray3 = cvCreateImage(size,IPL_DEPTH_64F,1); double f[SIZE]; double q[SIZE]; for( int j = 0; j uchar* ptr1 = (uchar*) ( img_gray->imageData + j * img_gray->widthStep ); double* ptr2 = (double*) ( img_gray3->imageData + j * img_gray3->widthStep ); for( int i = 0; i ptr2[i] = (double)ptr1[i]; } } // DWT_2_harr( img_gray3, layer );//小波变换 iDWT_2_harr( img_gray3, layer );//反变换 cvNormalize(img_gray3,img_gray3,1,0,CV_MINMAX); cvNamedWindow( "original pic", 1 );//创建窗口 cvShowImage("originalpic", img_gray);//显示图像 cvNamedWindow("wavelet pic",1);//创建窗口 cvShowImage("wavelet pic", img_gray3);//显示图像char key_cmd = 1; while(1){ key_cmd = cvWaitKey(); if(key_cmd==27) break; } return 0; } //一维harr小波变换 voidDWT_1_harr(double *in, double*out, int scale, int size){ //检查尺度是否吻合 if(scale>(log(size)/log(2.0))){ printf("Scale is toolarge\n"); return; } int t =size; int i; while(scale>0){ t = t/2; for(i=0; i out[i]=(in[2*i]+in[2*i+1])/1.4142; out[t+i]=(in[2*i]-in[2*i+1])/1.4142; } for(i=0; i in[i]=out[i]; } scale--; } } //一维haar小波反变换 void iDWT_1_harr(double *in,double*out, int size ){ //固定尺度为1 int t= size/2;inti; for( i=0; i out[2*i]=(in[i]+in[t+i])*0.7071; out[2*i+1] = (in[i]-in[t+i])*0.7071; } for(i=0;i in[i]=out[i]; } } //二维haar小波变换 voidDWT_2_harr(IplImage*img_in, intscale){ //检查尺度是否吻合 CvSize size= cvSize(img_in->width,img_in->height); if(scale>(log(size.width)/log(2.0))){ printf("Scaleistoolarge\n"); return; } if( size.width> SIZE ){ printf("Figureistoolarge,please change theSIZE parement\n"); return; } //开辟变量及中间变量 intstep_x =size.width;//这两个变量用于指向当前近似分量(LL) intstep_y=size.height; IplImage*img_temp =cvCreateImage(size,IPL_DEPTH_64F,1); doublef[SIZE]; double q[SIZE]; for( intk=1; k<=scale; k++,step_x/=2,step_y/=2){ //水平分解 for(intj = 0; j double* ptr1=(double*) ( img_in->imageData+j*img_in->widthStep ); double*ptr2=(double*) ( img_temp->imageData+j * img_temp->widthStep ); for(inti = 0; i f[i] = ptr1[i]; q[i] = 0; } DWT_1_harr( f, q, 1, step_x ); for( int i = 0; i ptr2[i] = f[i]; } } //垂直分解 cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); for( int j = 0; j double* ptr1 = (double*) ( img_temp->imageData + j * img_temp->widthStep ); double* ptr3 = (double*) ( img_in->imageData + j * img_in->widthStep ); for( int i = 0; i f[i] = ptr1[i]; q[i] = 0; } DWT_1_harr( f, q, 1, step_y ); for( int i = 0; i ptr3[i] = f[i]; } } cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); } //cvNormalize(img_temp,img_temp,1,0,CV_MINMAX); //cvNamedWindow( "c", 1 ); //创建窗口 //cvShowImage( "c", img_temp ); //显示图像 cvReleaseImage(&img_temp); return; } //二维haar小波反变换 void iDWT_2_harr( IplImage *img_in, int scale ){ //开辟变量及中间变量 CvSize size = cvSize( img_in->width, img_in->height ); int step_x = size.width/(pow(2,layer)); int step_y = size.height/(pow(2,layer)); IplImage* img_temp = cvCreateImage(size,IPL_DEPTH_64F,1);cvZero(img_temp); double f[SIZE]; double q[SIZE]; //cvNormalize(img_in,img_temp2,1,0,CV_MINMAX); //cvNamedWindow( "f", 1 ); //创建窗口 //cvShowImage( "f", img_temp2 ); //显示图像 for( int k=scale; k>=1; k--, step_x*=2, step_y*=2 ){ //垂直反变换 cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); for( int j = 0; j double* ptr1 = (double*) ( img_in->imageData + j * img_in->widthStep ); double* ptr2 = (double*) ( img_temp->imageData + j * img_temp->widthStep ); for( int i = 0; i f[i] = ptr1[i]; q[i] = 0; } iDWT_1_harr( f, q, step_y*2 ); for( int i = 0; i ptr2[i] = f[i]; } } cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); //水平反变换 for( int j = 0; j double* ptr1 = (double*) ( img_temp->imageData + j * img_temp->widthStep ); double* ptr3 = (double*) ( img_in->imageData + j * img_in->widthStep ); for( int i = 0; i f[i] = ptr1[i]; q[i] = 0; } iDWT_1_harr( f, q, step_x*2 ); for( int i = 0; i ptr3[i] = f[i]; } } } //cvNormalize(img_temp,img_temp,1,0,CV_MINMAX); //cvNamedWindow( "d", 1 ); //创建窗口 //cvShowImage( "d", img_temp ); //显示图像 cvReleaseImage(&img_temp); return; } 三、置零和去噪程序 #include "stdafx.h" #include "cv.h" #include "highgui.h" #include #include #include #include #include #include #include #include #include #include #define SIZE 300 #define layer 1 void DWT_1_harr( double *in, double *out, int scale, int size ); void iDWT_1_harr( double *in,double*out, int size ); void DWT_2_harr( IplImage *img_in, int scale ); void iDWT_2_harr( IplImage *img_in, int scale ); int main(){ IplImage* img_in = cvLoadImage("d:/lena.tif"); CvSize size = cvSize( img_in->width, img_in->height ); IplImage* img_gray = cvCreateImage(size,IPL_DEPTH_8U,1);cvCvtColor(img_in, img_gray, CV_BGR2GRAY ); IplImage* img_gray2 = cvCreateImage(size,IPL_DEPTH_64F,1); IplImage* img_gray3 = cvCreateImage(size,IPL_DEPTH_64F,1); double f[SIZE]; double q[SIZE]; for( int j = 0; j uchar* ptr1 = (uchar*) ( img_gray->imageData + j * img_gray->widthStep ); double* ptr2 = (double*) ( img_gray3->imageData + j * img_gray3->widthStep ); for( int i = 0; i ptr2[i] = (double)ptr1[i]; } } //小波变换 DWT_2_harr( img_gray3, layer ); cvNormalize(img_gray3,img_gray2,1,0,CV_MINMAX); cvNamedWindow( "wavelet_result", 1 ); //创建窗口 cvShowImage( "wavelet_result", img_gray2 ); //显示图像 //置0 for( int j = 128; j double* ptr2 = (double*) ( img_gray3->imageData + j * img_gray3->widthStep ); for( int i = 128; i ptr2[i] = 0;//把右下角细节置0 } } for( int j = 128; j double* ptr2 = (double*) ( img_gray3->imageData + j * img_gray3->widthStep ); for( int i = 0; i<128; i++ ) {//0<=i<128 ptr2[i] = 0;//把左下角细节置0 } }for( int j = 0; j<128; j++ ) {//0 double* ptr2 = (double*) ( img_gray3->imageData + j * img_gray3->widthStep ); for( int i = 128; i ptr2[i] = 0;//把右上角细节置0 } } cvNormalize(img_gray3,img_gray2,1,0,CV_MINMAX); cvNamedWindow( "change_coefficients", 1 ); //创建窗口 cvShowImage( "change_coefficients", img_gray2 ); //显示图像 iDWT_2_harr( img_gray3, layer );//反变换 cvNormalize(img_gray3,img_gray3,1,0,CV_MINMAX); cvNamedWindow( "original pic", 1 ); //创建窗口 cvShowImage( "original pic", img_gray ); //显示图像 cvNamedWindow( "zero", 1 ); //创建窗口 cvShowImage( "zero", img_gray3 ); //显示图像 char key_cmd = 1; while(1){ key_cmd = cvWaitKey(); if(key_cmd==27) break; } return 0; } //一维harr小波变换 void DWT_1_harr( double *in, double *out, int scale, int size ){ //检查尺度是否吻合 if( scale>(log(size)/log(2.0)) ){ printf("Scale is too large\n"); return; } int t =size; int i; while( scale>0 ){ t = t/2; for (i=0; i out[i]=(in[2*i]+in[2*i+1])/1.4142; out[t+i]=(in[2*i]-in[2*i+1])/1.4142; } for (i=0; i in[i]=out[i]; } scale--; } } //一维haar小波反变换 voidiDWT_1_harr( double *in, double*out,intsize){ //固定尺度为1 intt=size/2;int i; for(i=0;i out[2*i] =(in[i]+in[t+i])*0.7071; out[2*i+1] =(in[i]-in[t+i])*0.7071; } for(i=0; i in[i]=out[i]; } } //二维haar小波变换 voidDWT_2_harr(IplImage *img_in, int scale ){ //检查尺度是否吻合 CvSize size= cvSize( img_in->width,img_in->height ); if( scale>(log(size.width)/log(2.0)) ){ printf("Scaleis too large\n"); return; } if( size.width > SIZE ){ printf("Figureis too large, pleasechangetheSIZEparement\n"); return; } //开辟变量及中间变量 int step_x=size.width;//这两个变量用于指向当前近似分量(LL) int step_y= size.height; IplImage*img_temp=cvCreateImage(size,IPL_DEPTH_64F,1); doublef[SIZE]; doubleq[SIZE]; for(int k=1;k<=scale; k++, step_x/=2,step_y/=2){ //水平分解 for( int j =0;j double*ptr1 = (double*)( img_in->imageData+j*img_in->widthStep); double*ptr2= (double*) (img_temp->imageData+ j* img_temp->widthStep); for(inti= 0;i f[i]=ptr1[i]; q[i]=0; } DWT_1_harr( f,q, 1,step_x ); for(inti=0; i ptr2[i]=f[i]; } } //垂直分解 cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); for(intj=0; j double*ptr1=(double*)( img_temp->imageData+j*img_temp->widthStep); double*ptr3=(double*)(img_in->imageData+j*img_in->widthStep ); for(int i=0;i f[i]=ptr1[i]; q[i] =0; } DWT_1_harr(f, q, 1,step_y ); for( int i=0; i ptr3[i] = f[i]; } } cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); } //cvNormalize(img_temp,img_temp,1,0,CV_MINMAX); //cvNamedWindow( "c", 1 ); //创建窗口 //cvShowImage( "c", img_temp ); //显示图像 cvReleaseImage(&img_temp); return; } //二维haar小波反变换 void iDWT_2_harr( IplImage *img_in, int scale ){ //开辟变量及中间变量 CvSize size = cvSize( img_in->width, img_in->height ); int step_x = size.width/(pow(2,layer)); int step_y = size.height/(pow(2,layer)); IplImage* img_temp = cvCreateImage(size,IPL_DEPTH_64F,1);cvZero(img_temp); double f[SIZE]; double q[SIZE]; //cvNormalize(img_in,img_temp2,1,0,CV_MINMAX); //cvNamedWindow( "f", 1 ); //创建窗口 //cvShowImage( "f", img_temp2 ); //显示图像 for( int k=scale; k>=1; k--, step_x*=2, step_y*=2 ){ //垂直反变换 cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); for( int j = 0; j double* ptr1 = (double*) ( img_in->imageData + j * img_in->widthStep ); double* ptr2 = (double*) ( img_temp->imageData + j * img_temp->widthStep ); for( int i = 0; i f[i] = ptr1[i]; q[i] = 0; } iDWT_1_harr( f, q, step_y*2 ); for( int i = 0; i ptr2[i] = f[i]; } } cvTranspose(img_temp,img_temp); cvTranspose(img_in,img_in); //水平反变换 for( int j = 0; j double* ptr1 = (double*) ( img_temp->imageData + j * img_temp->widthStep ); double* ptr3 = (double*) ( img_in->imageData + j * img_in->widthStep ); for( int i = 0; i f[i] = ptr1[i]; q[i] = 0; } iDWT_1_harr( f, q, step_x*2 ); for( int i = 0; i ptr3[i] = f[i]; } } } //cvNormalize(img_temp,img_temp,1,0,CV_MINMAX); //cvNamedWindow( "d", 1 ); //创建窗口 //cvShowImage( "d", img_temp ); //显示图像 cvReleaseImage(&img_temp); return; } 10.2小波变换的基本原理 地质雷达的电磁波信号和地震波信号都是非平稳随机时变信号,长期以来,因非平稳信号处理的理论不健全,只好将其作为平稳信号来处理,其处理结果当然不满意。近年来,随着科学技术的发展和进步,国内外学术界已将注意力转向非平稳随机信号分析与处理的研究上,其中非平稳随机信号的时频表示法是研究热点之一。在这一研究中,戈勃展开、小波变换、维格纳分布与广义双线性时频分布等理论发展起来,这些方法既可以处理平稳信号过程,也可以处理非平稳随机时变信号。 小波变换是上世纪80年代中后期逐渐发展起来的一种数学分析方法。1984年法国科学家J.M OLET在分析地震波的局部特性时首先使用了小波这一术语,并用小波变换对地震信号进行处理。小波术语的含义是指一组衰减震动的波形,其振幅正负相间变化,平均值为零,是具有一定的带宽和中心频率波组。小波变换是用伸缩和平移小波形成的小波基来分解(变换)或重构(反变换)时变信号的过程。不同的小波具有不同带宽和中心频率,同一小波集中的带宽与中心频率的比是不变的,小波变换是一系列的带通滤波响应。它的数学过程与傅立叶分析是相似的,只是在傅立叶分析中的基函数是单频的调和函数,而小波分析中的基函数是小波,是一可变带宽内调和函数的组合。 小波变换在时域和频域都具有很好的局部化性质,较好地解决了时域和频域分辨率的矛盾,对于信号的低频成分采用宽时窗,对高频成分采用窄时窗。因而,小波分析特别适合处理非平稳时变信号,在语音分析和图象处理中有广泛的应用,在地震、雷达资料处理中将有良好的应用前景。 下边就小波分析的基本原理、主要作用及在雷达资料处理中的应用三方面作以介绍。 10.2.1小波分析的基本原理 小波函数的数学表达 第六章小波变换的几个典型应用 6.1 小波变换与信号处理 小波变换作为信号处理的一种手段,逐渐被越来越多领域的理论工作者和工程技术人员所重视和应用,并在许多应用中取得了显著的效果。同传统的处理方法相比,小波变换取得了质的飞跃,在信号处理方面具有更大的优势。比如小波变换可以用于电力负载信号的分析与处理,用于语音信号的分析、变换和综合,还可以检测噪声中的未知瞬态信号。本部分将举例说明。 6.1.1 小波变换在信号分析中的应用 [例6-1] 以含躁的三角波与正弦波的组合信号为例具体说如何利用小波分析来分析信号。已知信号的表达式为 应用db5小波对该信号进行7层分解。xiaobo0601.m 图6-1含躁的三角波与正弦波混合信号波形 分析: (1)在图6-2中,逼近信号a7是一个三角波。 (2)在图6-3中细节信号d1和d2是与噪声相关的,而d3(特别是d4)与正弦信号相关。 图6-2 小波分解后各层逼近信号 图6-3 小波分解后各层细节信号 6.1.2 小波变换在信号降躁和压缩中的应用 一、信号降躁 1.工程中,有用信号一般是一些比较平稳的信号,噪声通常表现为高频信号。2.消躁处理的方法:首先对信号进行小波分解,由于噪声信号多包含在具有较高频率的细节中,我们可以利用门限、阈值等形式对分解所得的小波系数进行处理,然后对信号进行小波重构即可达到对信号的消躁目的。 小波分析进行消躁处理的3种方法: (1)默认阈值消躁处理。该方法利用ddencmp生成信号的默认阈值,然后利用wdencmp函数进行消躁处理。 (2)给定阈值消躁处理。在实际的消躁处理过程中,阈值往往可通过经验公式获得,且这种阈值比默认阈值的可信度高。在进行阈值量化处理时可利用函数wthresh。 (3)强制消躁处理。该方法时将小波分解结构中的高频系数全部置为0,即滤掉所有高频部分,然后对信号进行小波重构。方法简单,消躁后信号比较平滑,但易丢失信号中的有用成分。 小波阈值去噪方法是目前应用最为广泛的小波去噪方法之一。 3.信号降噪的准则: 1.光滑性:在大部分情况下,降噪后的信号应该至少和原信号具有同等的光滑性。 MATLAB小波变换指令及其功能介绍 1 一维小波变换的 Matlab 实现 (1) dwt函数 功能:一维离散小波变换 格式:[cA,cD]=dwt(X,'wname') [cA,cD]=dwt(X,Lo_D,Hi_D)别可以实现一维、二维和 N 维DFT 说明:[cA,cD]=dwt(X,'wname') 使用指定的小波基函数 'wname' 对信号X 进行分解,cA、cD 分别为近似分量和细节分量; [cA,cD]=dwt(X,Lo_D,Hi_D) 使用指定的滤波器组 Lo_D、Hi_D 对信 号进行分解。 (2) idwt 函数 功能:一维离散小波反变换 格式:X=idwt(cA,cD,'wname') X=idwt(cA,cD,Lo_R,Hi_R) X=idwt(cA,cD,'wname',L)函数 fft、fft2 和 fftn 分 X=idwt(cA,cD,Lo_R,Hi_R,L) 说明:X=idwt(cA,cD,'wname') 由近似分量 cA 和细节分量 cD 经 小波反变换重构原始信号 X 。 'wname' 为所选的小波函数 X=idwt(cA,cD,Lo_R,Hi_R) 用指定的重构滤波器 Lo_R 和 Hi_R 经小波反变换重构原始信号 X 。 X=idwt(cA,cD,'wname',L) 和 X=idwt(cA,cD,Lo_R,Hi_R,L) 指定返回信号 X 中心附近的 L 个点。 2 二维小波变换的 Matlab 实现 二维小波变换的函数别可以实现一维、二维和 N 维 DFT 函数名函数功能 --------------------------------------------------- dwt2 二维离散小波变换 wavedec2 二维信号的多层小波分解 idwt2 二维离散小波反变换 waverec2 二维信号的多层小波重构 wrcoef2 由多层小波分解重构某一层的分解信号 upcoef2 由多层小波分解重构近似分量或细节分量 detcoef2 提取二维信号小波分解的细节分量 appcoef2 提取二维信号小波分解的近似分量 upwlev2 二维小波分解的单层重构 dwtpet2 二维周期小波变换 idwtper2 二维周期小波反变换 ----------------------------------------------------------- (1) wcodemat 函数 功能:对数据矩阵进行伪彩色编码函数 fft、fft2 和 fftn 分 格式:Y=wcodemat(X,NB,OPT,ABSOL) Y=wcodemat(X,NB,OPT) Y=wcodemat(X,NB) Y=wcodemat(X) 说明:Y=wcodemat(X,NB,OPT,ABSOL) 返回数据矩阵 X 的编码矩阵 Y ;NB 伪编码的最大值,即编码范围为 0~NB,缺省值 NB=16; OPT 指定了编码的方式(缺省值为 'mat'),即:别可以实现 一维、二维和 N 维 DFT OPT='row' ,按行编码 OPT='col' ,按列编码 我希望能简单介绍一下小波变换,它和傅立叶变换的比较,以及它在移动平台做motion detection的应用。如果不做特殊说明,均以离散小波为例子。考虑到我以前看中文资料的痛苦程度,我会尽量用简单,但是直观的方式去介绍。有些必要的公式是不能少的,但我尽量少用公式,多用图。另外,我不是一个好的翻译者,所以对于某些实在翻译不清楚的术语,我就会直接用英语。我并不claim我会把整个小波变换讲清楚,这是不可能的事,我只能尽力去围绕要点展开,比如小波变换相对傅立叶变换的好处,这些好处的原因是什么,小波变换的几个根本性质是什么,背后的推导是什么。我希望达到的目的就是一个小波变换的初学者在看完这个系列之后,就能用matlab或者别的工具对信号做小波变换的基本分析并且知道这个分析大概是怎么回事。 要讲小波变换,我们必须了解傅立叶变换。要了解傅立叶变换,我们先要弄清楚什么是”变换“。很多处理,不管是压缩也好,滤波也好,图形处理也好,本质都是变换。变换的是什么东西呢?是基,也就是basis。如果你暂时有些遗忘了basis的定义,那么简单说,在线性代数里,basis是指空间里一系列线性独立的向量,而这个空间里的任何其他向量,都可以由这些个向量的线性组合来表示。那basis在变换里面啥用呢?比如说吧,傅立叶展开的本质,就是把一个空间中的信号用该空间的某个basis的线性组合表示出来,要这样表示的原因,是因为傅立叶变换的本质,是。小波变换自然也不例外的和basis有关了。再比如你用Photoshop去处理图像,里面的图像拉伸,反转,等等一系列操作,都是和basis的改变有关。 既然这些变换都是在搞基,那我们自然就容易想到,这个basis的选取非常重要,因为basis的特点决定了具体的计算过程。一个空间中可能有很多种形式的basis,什么样的basis比较好,很大程度上取决于这个basis服务于什么应用。比如如果我们希望选取有利于压缩的话,那么就希望这个basis能用其中很少的向量来最大程度地表示信号,这样即使把别的向量给砍了,信号也不会损失很多。而如果是图形处理中常见的线性变换,最省计算量的完美basis就是eigenvector basis了,因为此时变换矩阵T对它们的作用等同于对角矩阵( Tv_n = av_n,a是eigenvalue )。总的来说,抛开具体的应用不谈,所有的basis,我们都希望它们有一个共同的特点,那就是,容易计算,用最简单的方式呈现最多的信号特性。 好,现在我们对变换有了基本的认识,知道他们其实就是在搞基。当然,搞基也是分形式的,不同的变换,搞基的妙处各有不同。接下来先看看,傅立叶变换是在干嘛。 傅立叶级数最早是Joseph Fourier 这个人提出的,他发现,这个basis不仅仅存在与vector space,还存在于funct ion space。这个function space本质上还是一个linear vector space,可以是有限的,可以是无限的,只不过在这个空间里,vector就是function了,而对应的标量就是实数或者复数。在vector space里,你有vector v可以写成vector basis的线性组合,那在function space里,function f(x)也可以写成对应function basis的线性组合,也有norm。你的vector basis可以是正交的,我的function basis也可以是正交的(比如sin(t)和sin(2t))。唯一不同的是,我的function basis是无穷尽的,因为我的function space的维度是无穷的。好,具体来说,那就是现在我们有一个函数,f(x)。我们希望将它写成一些cos函数和一些sin函数的形式,像这样 again,这是一个无限循环的函数。其中的1,cosx, sinx, cos2x …..这些,就是傅立叶级数。傅立叶级数应用如此广泛的主要原因之一,就是它们这帮子function basis是正交的,这就是有趣的地方了。为什么function basis正交如此重要呢?我们说两个vector正交,那就是他俩的内积为0。那对于function basis呢?function basis怎么求内积呢? 现在先复习一下vector正交的定义。我们说两个vector v,w如果正交的话,应符合:小波变换的基本原理
小波变换的几个典型应用
MATLAB小波变换指令及其功能介绍(超级有用)解读
(完整版)小波原理课件
小波变换与傅里叶变换的对比异同