哈工大小波理论及应用 第3章哈尔小波分析
- 格式:pdf
- 大小:592.61 KB
- 文档页数:43
哈尔小波变换哈尔小波变换是一种常用的信号处理方法,它可以将信号分解成不同频率的子信号,从而方便地进行分析和处理。
本文将介绍哈尔小波变换的原理、应用以及在实际工程中的应用。
一、哈尔小波变换的原理哈尔小波变换是一种离散小波变换,与传统的傅里叶变换不同,它不仅可以分解信号的频域信息,还可以分解信号的时域信息。
其基本原理是通过一系列的滤波和下采样操作,将原始信号逐步分解为不同尺度的子信号,同时保留了原始信号的能量和信息。
哈尔小波变换的核心是小波基函数,它是一组特殊的函数,具有良好的局部性和多尺度分析能力。
在哈尔小波变换中,常用的小波基函数有Haar小波、Daubechies小波、Symlet小波等。
其中Haar小波是最简单的小波基函数,它只有两个非零值,可以很好地展示小波变换的基本思想。
对于一个长度为N的离散信号x,Haar小波变换可以通过以下步骤进行计算:1.将信号x分成两部分,分别为奇数项和偶数项。
2.计算这两部分信号的平均值和差值,得到两个长度为N/2的新信号。
3.重复以上步骤,对新信号进行递归处理,直到每个子信号的长度为1。
4.将得到的所有子信号按照尺度大小排列,得到小波系数。
通过上述步骤,可以将原始信号分解成多个不同尺度的子信号,每个子信号代表了一定频率范围内的信号信息。
这些子信号可以通过逆小波变换合成为原始信号,同时也可以通过对不同尺度的子信号进行滤波和下采样操作,得到不同频率的信号信息。
二、哈尔小波变换的应用哈尔小波变换在信号处理、图像处理、音频处理等领域都有广泛的应用。
其中,最常见的应用是信号去噪和信号压缩。
1.信号去噪信号在传输和采集过程中往往会受到各种噪声的干扰,这些噪声会严重影响信号的质量和可靠性。
哈尔小波变换可以通过将信号分解成多个尺度的子信号,对不同尺度的子信号进行滤波和去噪,从而去除信号中的噪声成分。
2.信号压缩信号压缩是一种常用的信号处理方法,可以将信号的冗余信息去除,从而减小信号的存储和传输成本。
[摘要]在哈尔滨工业大学工科研究生小波理论与应用的教学过程中,加入上机实践教学内容后,学生的反响比较强烈,普遍反映以往抽象的概念和理论更加易于接受,而且提高了动手实践能力。
[关键词]小波;滤波器;Mallat 分解与重构算法;实践教学[中图分类号]G642[文献标志码]A[文章编号]2096-0602(2020)40-0202-02小波理论与应用课程的实践教学设计李福利(哈尔滨工业大学数学学院,黑龙江哈尔滨150001)近几年来,哈尔滨工业大学工科研究生学位课中,小波理论与应用的选修人数稳定在300人左右。
这是一门理论性和应用性都比较强的交叉学科。
在以往的研究生小波理论的教学过程中,教师往往偏重于理论教学,忽视了实践教学,导致学生学过小波理论后,不知道如何用小波解决具体的实际问题。
学生课堂上似乎听懂了,实际动手操作起来,就很茫然,不知所以然了。
为此,我们在教学过程中,向哈尔滨工业大学研究生院主管研究生教学培养和哈尔滨工业大学数学学院主抓研究生公共教学的领导申请了12学时的上机实践,申明了实践教学的迫切性和重要性,得到了有关部门领导和研究生院的大力支持。
由于课时限制,经过5年多的教学实践摸索,我们把上机实践内容分成两大块,一块是基础篇内容上机实践部分,另一块是提高篇内容上机实践部分。
我们在基础篇内容实践部分,为了使实践教学不流于形式,特别加强设计了八个实践教学任务,使学生上机实践的时候感觉到任务充实。
基础部分要求学生完成实验报告,报告内容包括实验目的、实验原理、实验结论、实验结果分析、MATLAB 源程序、上机收获体会等内容。
从而加深了学生对基本概念、基本理论的理解,提高了学生的动手能力、实践能力,并有效防止了高分低能现象的产生。
具体的八个实践任务如下。
一、Butterworth 滤波器的原理与实践设计这一实践任务的目的是为了加深学生对滤波器概念的理解,体会到滤波器对信号的滤波作用,和不同参数的Butterworth 滤波器对信号的滤波效果的影响是不同的。
小波分析上机实验报告院系:电气工程及自动化学院学科:仪器科学与技术实验一小波分析在信号压缩中的应用一、试验目的(1)进一步加深对小波分析进行信号压缩的理解;(2)学习Matlab中有关信号压缩的相关函数的用法。
二、相关知识复习用一个给定的小波基对信号进行压缩后它意味着信号在小波阈的表示相对缺少了一些信息。
之所以能对信号进行压缩是因为对于规则的信号可以用很少的低频系数在一个合适的小波层上和一部分高频系数来近似表示。
利用小波变换对信号进行压缩分为以下几个步骤来完成:(1)进行信号的小波分解;(2)将高频系数进行阈值量化处理。
对从1 到N 的每一层高频系数都可以选择不同的阈值并且用硬阈值进行系数的量化;(3)对量化后的系数进行小波重构。
三、实验要求(1)对于某一给定的信号(信号的文件名为leleccum.mat),利用小波分析对信号进行压缩处理。
(2)给出一个图像,即一个二维信号(文件名为wbarb.mat),利用二维小波分析对图像进行压缩。
四、实验结果及程序(1)load leleccum%将信号装入Matlab工作环境%设置变量名s和ls,在原始信号中,只取2600-3100个点s = leleccum(2600:3100); ls = length(s);%用db3对信号进行3级小波分解[c,l] = wavedec(s, 3, 'db3');%选用全局阈值进行信号压缩thr = 35;[xd,cxd,lxd,perf0,perfl2] = wdencmp('gbl',c,l,'db3',3,thr,'h',1);subplot(2,1,1);plot(s);title('原是信号s');subplot(2,1,2);plot(xd);title('压缩后的信号xd');图1 实验1压缩结果图2 不同阈值下实验1压缩结果(2)clear %清除Matlab工作环境中现有的变量load wbarb;%显示图像subplot(221); image(X); colormap(map);title('原始图像');axis square;disp('压缩前图像X的大小')whos('X')%==================================================== %对图像用bior3.7小波进行2层小波分解[c,s] = wavedec2(X,2,'bior3.7');%提取小波分解结构中第1层的低频系数和高频系数ca1 = appcoef2(c,s,'bior3.7',1);ch1 = detcoef2('h',c,s,1); %小波分解结构中第1层的水平方向高频系数cv1 = detcoef2('v',c,s,1); %小波分解结构中第1层的垂直方向高频系数cd1 = detcoef2('d',c,s,1); %小波分解结构中第1层的斜线方向高频系数%分别对小波分解结构中第1层的各频率成份进行重构a1 = wrcoef2('a',c,s,'bior3.7',1);h1 = wrcoef2('h',c,s,'bior3.7',1);v1 = wrcoef2('v',c,s,'bior3.7',1);d1 = wrcoef2('d',c,s,'bior3.7',1);c1 = [a1,h1;v1,d1];%显示分解后各频率成分的信息subplot(222);image(c1);axis squaretitle('分解后低频和高频信息');%==================================================== %下面进行图像的压缩处理%保留小波分解结构中第1层的低频信息,进行图像压缩%第1层的低频信息为ca1,显示第1层的低频信息%首先对第1层信息进行量化编码ca1 = wcodemat(ca1,440,'mat',0);%改变图像的亮度ca1 = 0.5*ca1;subplot(223);image(ca1);colormap(map);axis square;title('第一次压缩图像');disp('第一次压缩图像的大小为:')whos('ca1')%==================================================== %保留小波分解第二层低频信息,进行图像的压缩,此时压缩比更大%第2层的低频信息即为ca2,显示第2层的低频信息ca2 = appcoef2(c,s,'bior3.7',2);%首先对第2层低频信息进行量化编码ca2 = wcodemat(ca2,440,'mat',0);%改变图像的亮度ca2 = 0.25*ca2;subplot(224);image(ca2);colormap(map);axis square;title('第2次压缩图像');disp('第2次压缩图像的大小为');whos('ca2')图3 实验2压缩结果五、实验分析及结论(1)根据实验1压缩结果分析得到,压缩后的信号保持了原有信号的轮廓信息,即低频信息,而大部分细节信息(高频信息)得到了消除。
小波分析在去噪中的应用哈尔滨工业大学,黑龙江省哈尔滨市150001;摘要:本文首先介绍了图像去噪的方法与发展过程。
然后介绍了小波变换的基本理论知识,包括连续小波变换和离散小波变换;对基于小波变换的图像去噪进行了概述,同时针对小波去噪的理论和方法进行了介绍,其中包括小波去噪的原理、方法和阈值去噪处理等方面的内容。
最后,利用MATLAB 对小波阈值去噪进行了仿真和分析,包括硬阀值去噪、软阀值去噪,半软阀值去噪以及自适应模糊阀值去噪。
最后通过仿真图对比了各种去噪方式的去噪效果,表明了小波变换进行去噪的优越性。
关键词:小波理论;图像处理0 引言图像是信息社会人们获取信息的重要来源之一。
在通过图像传感器将现实世界中的有用图像信号进行采集、量化、编码、传输、恢复的过程中,存在大量影响图像质量的因素。
因此图像在进行使用之前,一般都要经过严格的预处理如去噪、量化、压缩编码等。
噪声的污染直接影响着对图像边缘检测、特征提取、图像分割、模式识别等处理,使人们不得不从各种角度进行探索以提高图像的质量。
所以采用适当的方法尽量消除噪声是图像处理中一个非常重要的预处理步骤。
然而在很多情况下,图像信息会受到各种各样的噪声影响,严重时甚至会影响到图像中的有用信息,因此,对图像的噪声进行处理就显得非常重要。
计算机图像处理主要采取两大类方法:一是在空间域中的处理,即在图像空间中对图像进行各种处理;另一类是把空间域中的图像经过正交变换到频域,在频域里进行各种处理然后反变换到空间域,形成处理后的图像。
人们也根据实际图像的特点、噪声的统计特征和频谱分布的规律,发展了各式各样的去噪方法。
其中最为直观的方法,是根据噪声能量一般集中于高频而图像频谱则分布于一个有限区间的这一特点,采用低通滤波方式来进行去噪,或对图像进行平滑处理等,这属于第一类图像处理方法。
还有就是在频域进行处理,如:傅立叶变换、小波基变换。
近年来,小波理论得到了非常迅速的发展,而且由于其具备良好的时频特性,实际应用也非常广泛。
小波理论实验报告院(系)专业学生学号日期2015年12月实验报告一一、 实验目的1. 运用傅立叶变换知识对常用的基本函数做基本变换。
2. 加深对因果滤波器的理解,并会判断因果滤波器的类型。
3. 运用卷积公式对基本信号做滤波处理并分析,以加深理解。
4. 熟悉Matlab 中相关函数的用法。
二、 实验原理1.运用傅立叶正、反变换的基本公式:()ˆ()() ()(),11ˆ()(),22i x i t i ti t i t f f x e dx f t e dt f t e f t fe df t e ωωωωωωωωππ∞∞---∞-∞∞--∞=====⎰⎰⎰及其性质,对所要处理信号做相应的傅里叶变换和逆变换。
2.运用卷积的定义式:1212()()()()+∞-∞*=-⎰f t f t f f t d τττ对所求信号做滤波处理。
三、 实验步骤与内容1.实验题目:Butterworth 滤波器,其冲击响应函数为,0()0,0若若α-⎧≥=⎨<⎩t Ae t h t t 1. 求$()hω 2. 判断是否因果;是低通、高通、带通还是带阻? 3. 对于信号3()(sin 22sin 40.4sin 2sin 40),-=++t f t et t t t 0π≤≤t ,画出图形()f t4. 画出滤波后图形()*f h t ,比较滤波前后图形,你会发现什么,这里取10α==A5. 取()(sin5sin3sin sin 40),-=+++tf t e t t t t 采用不同的变量值α=A (初始设定A=α=10) 画出原信号图形与滤波后图形,比较滤波效果。
2.实验步骤及分析过程:1.求$()hω 由傅里叶变换的定义式可得:()0ˆαϖαϖωαω+∞+∞-----∞=⋅=⋅=+⎰⎰t i t t i t Ah Ae e dt Ae e dt i (1) 故该滤波器的幅频特性为:()ω==H ,转折频率τα=;假定1,2A α==,绘制该滤波器的幅频特性曲线如下:图1.1滤波器的幅频特性曲线2. 判断是否因果;是低通、高通、带通还是带阻?(1)观察滤波器响应函数可知,只有在输入信号到达后,该滤波器才会有输出响应,此外实际应用的滤波器均是因果滤波器,所以,题中滤波器是因果滤波器。
哈尔小波变换的原理及其实现(Haar)另外参见俄罗斯写的/Articles/22243/Real-Time-Object-Tracker-in-CHaar小波在图像处理和数字水印等方面应用较多,这里简单的介绍一下哈尔小波的基本原理以及其实现情况。
一、Haar小波的基本原理数学理论方面的东西我也不是很熟悉,这边主要用简单的例子来介绍下Haar小波的使用情况。
例如:有a=[8,7,6,9]四个数,并使用b[4]数组来保存结果.则一级Haar小波变换的结果为:b[0]=(a[0]+a[1])/2, b[2]=(a[0]-a[1])/2b[1]=(a[2]+a[3])/2, b[3]=(a[2]-a[3])/2即依次从数组中取两个数字,计算它们的和以及差,并将和一半和差的一半依次保存在数组的前半部分和后半部分。
例如:有a[8],要进行一维Haar小波变换,结果保存在b[8]中则一级Haar小波变换的结果为:b[0]=(a[0]+a[1])/2, b[4]=(a[0]-a[1])/2b[1]=(a[2]+a[3])/2, b[5]=(a[2]-a[3])/2b[2]=(a[4]+a[5])/2, b[6]=(a[4-a[5]])/2b[3]=(a[6]+a[7])/2, b[7]=(a[6]-a[7])/2如果需要进行二级Haar小波变换的时候,只需要对b[0]-b[3]进行Haar小波变换.对于二维的矩阵来讲,每一级Haar小波变换需要先后进行水平方向和竖直方向上的两次一维小波变换,行和列的先后次序对结果不影响。
二、Haar小波的实现使用opencv来读取图片及像素,对图像的第一个8*8的矩阵做了一级小波变换#include <cv.h>#include <highgui.h>#include <iostream>using namespace std;int main(){IplImage* srcImg;double imgData[8][8];int i,j;srcImg=cvLoadImage("lena.bmp",0);cout<<"原8*8数据"<<endl;for( i=0;i<8;i++){for( j=0;j<8;j++){imgData[i][j]=cvGetReal2D(srcImg,i+256,j+16); cout<<imgData[i][j]<<" ";}cout<<endl;}double tempData[8];//行小波分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[i][2*j];double temp2=imgData[i][2*j+1]; tempData[j]=(temp1+temp2)/2;tempData[j+4]=(temp1-temp2)/2;}for( j=0;j<8;j++)imgData[i][j]=tempData[j];}//列小波分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[2*j][i]; double temp2=imgData[2*j+1][i]; tempData[j]=(temp1+temp2)/2; tempData[j+4]=(temp1-temp2)/2; }for( j=0;j<8;j++)imgData[j][i]=tempData[j];}cout<<"1级小波分解数据"<<endl; for( i=0;i<8;i++){for( j=0;j<8;j++){cout<<imgData[i][j]<<" ";}cout<<endl;}//列小波逆分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[j][i]; double temp2=imgData[j+4][i]; tempData[2*j]=temp1+temp2; tempData[2*j+1]=temp1-temp2; }for( j=0;j<8;j++){imgData[j][i]=tempData[j];}}//行小波逆分解for( i=0;i<8;i++){for( j=0;j<4;j++){double temp1=imgData[i][j]; double temp2=imgData[i][j+4]; tempData[2*j]=temp1+temp2; tempData[2*j+1]=temp1-temp2; }for( j=0;j<2*4;j++){imgData[i][j]=tempData[j];}}cout<<"1级小波逆分解数据"<<endl; for( i=0;i<8;i++){for( j=0;j<8;j++){cout<<imgData[i][j]<<" ";}cout<<endl;}return 0;}====================================== ===================================== /// 小波变换Mat WDT( const Mat &_src, const string _wname, const int _level )const{int reValue = THID_ERR_NONE;Mat src = Mat_<float>(_src);Mat dst = Mat::zeros( src.rows, src.cols, src.type() );int N = src.rows;int D = src.cols;/// 高通低通滤波器Mat lowFilter;Mat highFilter;wavelet( _wname, lowFilter, highFilter );/// 小波变换int t=1;int row = N;int col = D;while( t<=_level ){///先进行行小波变换for( int i=0; i<row; i++ ){/// 取出src中要处理的数据的一行Mat oneRow = Mat::zeros( 1,col, src.type() );for ( int j=0; j<col; j++ ){oneRow.at<float>(0,j) = src.at<float>(i,j);}oneRow = waveletDecompose( oneRow, lowFilter, highFilter ); /// 将src这一行置为oneRow中的数据for ( int j=0; j<col; j++ ){dst.at<float>(i,j) = oneRow.at<float>(0,j);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg1 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg1 );#endif/// 小波列变换for ( int j=0; j<col; j++ ){/// 取出src数据的一行输入Mat oneCol = Mat::zeros( row, 1, src.type() );for ( int i=0; i<row; i++ ){oneCol.at<float>(i,0) = dst.at<float>(i,j);}oneCol = ( waveletDecompose( oneCol.t(), lowFilter, highFilter ) ).t();for ( int i=0; i<row; i++ ){dst.at<float>(i,j) = oneCol.at<float>(i,0);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg2 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg2 );#endif/// 更新row /= 2;col /=2;t++;src = dst;}return dst;}/// 小波逆变换Mat IWDT( const Mat &_src, const string _wname, const int _level )const{int reValue = THID_ERR_NONE;Mat src = Mat_<float>(_src);Mat dst = Mat::zeros( src.rows, src.cols, src.type() );int N = src.rows;int D = src.cols;/// 高通低通滤波器Mat lowFilter;Mat highFilter;wavelet( _wname, lowFilter, highFilter );/// 小波变换int t=1;int row = N/std::pow( 2., _level-1);int col = D/std::pow(2., _level-1);while ( row<=N && col<=D ){/// 小波列逆变换for ( int j=0; j<col; j++ ){/// 取出src数据的一行输入Mat oneCol = Mat::zeros( row, 1, src.type() );for ( int i=0; i<row; i++ ){oneCol.at<float>(i,0) = src.at<float>(i,j);}oneCol = ( waveletReconstruct( oneCol.t(), lowFilter, highFilter ) ).t();for ( int i=0; i<row; i++ ){dst.at<float>(i,j) = oneCol.at<float>(i,0);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg2 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg2 );#endif///行小波逆变换for( int i=0; i<row; i++ ){/// 取出src中要处理的数据的一行Mat oneRow = Mat::zeros( 1,col, src.type() );for ( int j=0; j<col; j++ ){oneRow.at<float>(0,j) = dst.at<float>(i,j);}oneRow = waveletReconstruct( oneRow, lowFilter, highFilter );/// 将src这一行置为oneRow中的数据for ( int j=0; j<col; j++ ){dst.at<float>(i,j) = oneRow.at<float>(0,j);}}#if 0//normalize( dst, dst, 0, 255, NORM_MINMAX );IplImage dstImg1 = IplImage(dst);cvSaveImage( "dst.jpg", &dstImg1 );#endifrow *= 2;col *= 2;src = dst;}return dst;}/////////////////////////////////////////////////////////////////// //////////////////////////// 调用函数/// 生成不同类型的小波,现在只有haar,sym2void wavelet( const string_wname, Mat &_lowFilter, Mat &_highFilter )const{if ( _wname=="haar" || _wname=="db1" ){int N = 2;_lowFilter = Mat::zeros( 1, N, CV_32F );_highFilter = Mat::zeros( 1, N, CV_32F );_lowFilter.at<float>(0, 0) = 1/sqrtf(N);_lowFilter.at<float>(0, 1) = 1/sqrtf(N);_highFilter.at<float>(0, 0) = -1/sqrtf(N);_highFilter.at<float>(0, 1) = 1/sqrtf(N);}if ( _wname =="sym2" ){int N = 4;float h[] = {-0.483, 0.836, -0.224, -0.129 };float l[] = {-0.129, 0.224, 0.837, 0.483 };_lowFilter = Mat::zeros( 1, N, CV_32F );_highFilter = Mat::zeros( 1, N, CV_32F );for ( int i=0; i<N; i++ ){_lowFilter.at<float>(0, i) = l[i];_highFilter.at<float>(0, i) = h[i];}}}/// 小波分解Mat waveletDecompose( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )const{assert( _src.rows==1 && _lowFilter.rows==1 && _highFilter.rows==1 );assert( _src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );Mat &src = Mat_<float>(_src);int D = src.cols;Mat &lowFilter = Mat_<float>(_lowFilter);Mat &highFilter = Mat_<float>(_highFilter);/// 频域滤波,或时域卷积;ifft( fft(x) * fft(filter)) = cov(x,filter) Mat dst1 = Mat::zeros( 1, D, src.type() );Mat dst2 = Mat::zeros( 1, D, src.type() );filter2D( src, dst1, -1, lowFilter );filter2D( src, dst2, -1, highFilter );/// 下采样Mat downDst1 = Mat::zeros( 1, D/2, src.type() );Mat downDst2 = Mat::zeros( 1, D/2, src.type() );resize( dst1, downDst1, downDst1.size() );resize( dst2, downDst2, downDst2.size() );/// 数据拼接for ( int i=0; i<D/2; i++ ){src.at<float>(0, i) = downDst1.at<float>( 0, i );src.at<float>(0, i+D/2) = downDst2.at<float>( 0, i );}return src;}/// 小波重建Mat waveletReconstruct( const Mat &_src, const Mat &_lowFilter, const Mat &_highFilter )const{assert( _src.rows==1 && _lowFilter.rows==1 && _highFilter.rows==1 );assert( _src.cols>=_lowFilter.cols && _src.cols>=_highFilter.cols );Mat &src = Mat_<float>(_src);int D = src.cols;Mat &lowFilter = Mat_<float>(_lowFilter);Mat &highFilter = Mat_<float>(_highFilter);/// 插值;Mat Up1 = Mat::zeros( 1, D, src.type() );Mat Up2 = Mat::zeros( 1, D, src.type() );/// 插值为0//for ( int i=0, cnt=1; i<D/2; i++,cnt+=2 )//{// Up1.at<float>( 0, cnt ) = src.at<float>( 0, i ); ///< 前一半// Up2.at<float>( 0, cnt ) = src.at<float>( 0, i+D/2 ); ///< 后一半//}/// 线性插值Mat roi1( src, Rect(0, 0, D/2, 1) );Mat roi2( src, Rect(D/2, 0, D/2, 1) );resize( roi1, Up1, Up1.size(), 0, 0, INTER_CUBIC );resize( roi2, Up2, Up2.size(), 0, 0, INTER_CUBIC );/// 前一半低通,后一半高通Mat dst1 = Mat::zeros( 1, D, src.type() );Mat dst2= Mat::zeros( 1, D, src.type() );filter2D( Up1, dst1, -1, lowFilter );filter2D( Up2, dst2, -1, highFilter );/// 结果相加dst1 = dst1 + dst2;return dst1;}====================================== =====================================*************************************************************** **************************************************其他代码实现*************************************************************** **************************************************// 哈尔小波.cpp : 定义控制台应用程序的入口点。