小波分解与重构代码
常用小波函数及Matlab常用指令
THR=wbmpen(C,L,SIGMA,ALPHA)使用penalization方法为降噪返回全局门槛THR.
STDC=wnoisest(C,L,S)返回[C,L]在尺度S上的细节系数的标准差估计
[THR,NKEEP]=wdcbm(C,L,ALPHA,M)返回各尺度上的相应门槛,存放于THR向量中,降噪一般将ALPHA设为3
y=upcoef('O',x,'wname',N) 用于一维小波分析,计算向量x向上N步的重构小波系数,N为正整数。如 果O=a,对低频系数进行重构;如果O=d,对高频系数进行重构。
[thr,sorh,keepapp]=ddencmp('den','wv',x)产生信号全局默认阈值,然后利用wdencmp函数进行消除噪 声的处理,thr = sqrt(2*log(n)) * s
THR=thselect(X,TPTR)使用由TPTR指定的算法计算与X相适应的门槛
D=detcoef(c,l,N) 提取N尺度的高频系数。
[nc,nl,ca]=upwlev(c,l,'wname')对小波分解结构[c,l]进行单尺度重构,返回上一尺度的分解结构并提 取最后一尺度的低频分量。
x=wrcoef('type',c,l,'wname',N)对一维信号的分解结构[c,l]用指定的小波函数进行重构,当'type=a' 时对信号的低频部分进行重构,此时N可以为0.当'type=d'时,对信号 的高频部分进行重构,此时N为正整数。
matlab小波分解重构高频信号
matlab小波分解重构高频信号读者可能会有的问题和困惑。
小波分解是一种遍布于各个领域,常用于信号处理、图像处理等技术的数学工具。
它基于一种名为小波变换的数学理论,可以将原始信号分解成多个频带组合,类似于频域的傅里叶变换。
在这些频带中,低频部分对应着原信号的慢变化、趋势等,而高频部分则对应着信号的短时变化、噪声等。
因此,小波分解可以用于对信号进行去噪、特征提取、边缘检测等操作,也可以用于压缩、加密等应用。
在本文中,我们将以MATLAB 为例,介绍如何使用小波分解对信号进行处理。
一、加载示例数据在MATLAB 中,可以使用wavread 函数加载音频文件作为示例数据,如下所示:matlab[x, fs] = wavread('example.wav');这里,x 是加载的音频数据,fs 是采样率。
如果需要处理的是其他类型的信号,可以使用其他载入数据的函数,如load、csvread 等。
二、进行小波分解在MATLAB 中,可以使用wavedec 函数进行小波分解,如下所示:matlab[c, l] = wavedec(x, N, wname);其中,c 是分解后的系数向量,l 是包含各个频带长度的向量,N 是分解的阶数,wname 是小波函数的名称。
这里,我们选择Daubechies-4 小波作为分析小波函数,其名称为db4。
matlab[c, l] = wavedec(x, 5, 'db4');三、获取高频信号在小波分解后的系数向量c 中,每个位置对应着一个分解出的频带。
因此,我们可以根据小波分解的原理,获取特定频带的系数,再通过逆小波变换将其重构成对应的信号。
在本文中,我们将使用高频部分作为重点介绍。
对于N 阶小波分解,l(1:N+1) 包含有N+1 个数字,分别对应着从低频到高频的各个频带长度。
其中,l(1) 对应的是最低频的长度,也就是原信号长度。
为了获取高频系数,我们需要从c 向量中抽取其中的高频部分。
小波分解与重构
figure(2);
lev_1=lev+1;
for i=1:lev
cD=detcoef(C,L,i);
subplot(lev_1,1,i)
plot(cD);
ylabel(['cD',num2str(i)]);
Fs=1000; % 采样频率
Ts=1/Fs; % 采样间隔
N=1024; % 采样点数
t=[0:1/Fs:(N-1)/Fs]; %采样时刻
lev=5;
x=sin(2*pi*f1*t);
figure(1);
plot(t,x);
%%小波分解
[C,L]=wavedec(x,lev,'db10'); %C由[cAj,cDj,cDj-1,...,cD1]
subplot(2,2,4);
image(hd2+dd2+vd2+a1);colormap(map);
% 验证这些图像的长度都是sX
sX = size(X)
sa1 = size(a1)
shd2 = size(hd2)
norm(hd2+dd2+vd2+a1-X)
结果:
sX =
256 256
plot(A);
title('原始信号')
subplot(3,1,2);
plot(a0);
title('重构信号')
subplot(3,1,3);
plot(A-a0);
title('误差信号')
err=max(abs(A-a0))
小波图像分解和重构程序每句都带解释
小波图像分解程序:function coef=mywavedec2(x,N,wname) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 函数MYWA VEDEC2() 对输入矩阵x 进行dim 层分解,得到相应的分解系数矩阵y% 输入参数:x ——输入矩阵% N ——分解级数% wname ——分解所用的小波函数% 输出参数:coef ——分解系数矩阵,其结构如下:% coef = {cA_N;cV_N;cH_N;cD_N;cV_N-1;cH_N-1;cD_N-1;……;cV_1;cH_1;cD_1}% Copyright by Zou Yuhua ( chenyusiyuan ), original : 2007-11-10, modified: 2008-06-04 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 求出小波函数的滤波器组系数向量[Lo_D,Hi_D] = wfilters(wname,'d');% 画出原始图像imshow(x);title('Original Image');% 标明图像大小[r,c]=size(x);xlabel(['Size : ',num2str(r),'*',num2str(c)]);% 将矩阵x的数据格式转换为适合数值处理的double格式xd=double(x);coef=[];for i=1:N[cA,cV,cH,cD]=mydwt2(xd,Lo_D,Hi_D);% 第i 级小波分解xd=cA;% 将第i 级分解得到的低频系数矩阵作为第i+1 级分解的源矩阵outmp={cV;cH;cD};% 将第i 级分解得到的高频系数矩阵cV,cH,cD存入细胞矩阵outmp % 注意细胞矩阵的赋值是用大括号“{}”的,而普通矩阵赋值是用方括号“[]”% 细胞矩阵不要求其中的子矩阵的行列数都相同coef=[outmp;coef];% 将细胞矩阵outmp 存入输出矩阵coef,coef将由空矩阵变为细胞矩阵% 注意这里的方括号不能用大括号取代% 否则,使用大括号会将初始的coef空矩阵也作为细胞矩阵的子矩阵% 而且,在迭代中coef 将是一个不断嵌套的细胞矩阵,不便于后续处理和读取% 上面这个语句是一种有效的在迭代过程中保存数据的方法% 设待存数据为data,可以是单个数、向量或矩阵% 保存数据的矩阵为mat,初始为空矩阵:mat=[]% 则可按以下格式保存迭代过程产生的数据% mat=[mat;data];% 方括号内的分号“;”表示数据data 是按“列”排序的方式存入矩阵mat% mat=[mat,data];% 方括号内的逗号“,”表示数据data 是按“行”排序的方式存入矩阵mat% data 也可以在mat 前嵌入,即mat=[data;mat] 或mat=[data,mat]end% 迭代结束后,矩阵coef 中保存的是各级分解中的高频系数矩阵% 故需将迭代后得到的矩阵cA,即第dim 级低频矩阵存入矩阵coefcoef=[cA;coef];% 最后,小波系数矩阵coef 的结构如下% coef = {cA_N;cV_N;cH_N;cD_N;cV_N-1;cH_N-1;cD_N-1;……;cV_1;cH_1;cD_1}% 画出各级低频、高频系数矩阵% 首先建立一个名为“Wavelet Decomposition -- Wavelet Type: , Levels: ”的图像窗口figure('Name',['Wavelet Decomposition -- Wavelet Type: ',wname,' , Levels: ',num2str(N)]);% 图像的第1行显示低频系数,置中,左右两个subplot为空subplot(N+1,3,2);yt=uint8(coef{1});[yrow,ycol]=size(yt);imshow(yt);title( ['Approximation A',num2str(N)]);xlabel(['Size : ',num2str(yrow),'*',num2str(ycol)]);% 第2-(N+1)行显示各级高频系数titllist={['Vertical Detail V'];['Horizontal Detail H'];['Diagonal Detail D']};pn=2;% pn 是子图的显示序号for pr=1:Nfor pc=1:3subplot(N+1,3,pn+2);yt=[];% 为了使高频细节内容(轮廓、边缘)更清晰,将高频系数增加100灰度值yt=uint8(coef{pn})+100;[yrow,ycol]=size(yt);imshow(yt);title([ titllist{pc},num2str(N-pr+1)]);xlabel(['Size : ',num2str(yrow),'*',num2str(ycol)]);% 每行的第一个图像的Y轴,显示该行高频系数对应的分解级别if mod(pn+2,3)==1ylabel(['Level ',num2str(N-pr+1)]);endpn=pn+1;endendfunction [cA,cV,cH,cD]=mydwt2(x,Lo_D,Hi_D) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 函数MYDWT2() 对输入的r*c维矩阵x 进行二维小波分解,输出四个分解系数子矩阵[LL,HL,LH,HH]% 输入参数:x ——输入矩阵,为r*c维矩阵。
仿真信号小波分解与重构程序
3仿真信号小波分解与重构程序本实验采用的初始信号为f=sin(0.03*t),其图像如图figure(1)所示,在原信号的基础上加上噪音noissin,添加噪音后的信号的图像如figure(2)所示,然后分别对加了噪声的信号进行db3 小波降噪和sym8小波降噪,并画出了信号降噪后的图像,图像如figure(3)、figure(4)所示。
(1)仿真信号处理程序:N=1000;t=1:1000;f=sin(0.03*t);load noissin;e=noissin;figure(1);plot(t,f);xlabel('y样本序列');ylabel('原始信号幅值');grid;figure(2);plot(e);xlabel('样本序列n');ylabel('含有噪声的信号幅值');grid;s1=wden(e,'minimaxi','s','one',5,'db3');figure(3);plot(s1);xlabel('样本序列n');ylabel('db3 小波降噪后的信号幅');s2=wden(e,'heursure','s','one',5,'sym8');figure(4);plot(s2);xlabel('样本序列n');ylabel('sym8小波降噪后的信号幅');grid;%db10小波进行4层分解%一维小波分解[c,l]=wavedec(f,4,'db10');%重构第1~4层细节信号d4=wrcoef('d',c,l,'db10',4);d3=wrcoef('d',c,l,'db10',3);d2=wrcoef('d',c,l,'db10',2);d1=wrcoef('d',c,l,'db10',1);%显示细节信号figure(5);subplot(4,1,1);plot(d4, 'LineWidth',1);ylabel('d4');subplot(4,1,2);plot(d3, 'LineWidth',1);ylabel('d3');subplot(4,1,3);plot(d2,'LineWidth',1);ylabel('d2');subplot(4,1,4);plot(d1, 'LineWidth',1);ylabel('d1'); xlabel('时间t/s'); grid;(2)信号图像:Figure(1)初始信号的时域图像Figure(3)db3小波降噪后的信号幅。
小波分解和重构算法作业
小波的分解和重构小波分析第二次作业在实际操作中,一般我们是应用matlab在计算机上处理小波变换。
信号总是离散的。
一般包括单层分解重构,多层分解重构等方法。
下面探讨一维离散小波变换在matlab中的应用。
1.单层小波分解%读入信号load leleccum;s=leleccum(1:4000);%通过db4小波基进行离散小波变换[cA1,cD1]=dwt(s,'db4');figure(1), subplot(311);plot(s)title('Original signal');subplot(323); plot(cA1);title('Approx.coef.for db4');subplot(324); plot(cD1);title('Detail coef.for db4');上图我们可以看到经过db4小波一层分解之后的高频信息和低频信息。
2.单尺度一维小波的重构%用小波函数db4进行信号重构ss=idwt(cA1,cD1,'db4');err=norm(s-ss);figure(2),plot(ss);重构完成后的误差为3.53e-10。
重构完成后的函数与分解前的函数相同,仅仅存在很小很小可以忽略为0的误差。
3.多层小波分解上文是使用单层小波分解,下面使用wavedec函数进行多层小波分解,并显示分解后的低频高频信息。
%通过db4小波基进行三尺度小波分解[c,l]=wavedec(s,3,'db4');a1=appcoef(c,l,'db4',1);%提取尺度1的低频系数a2=appcoef(c,l,'db4',2);%提取尺度2的低频系数a3=appcoef(c,l,'db4',3);%提取尺度3的低频系数figure(3);subplot(321);plot(a1);title('尺度1的低频系数');subplot(323);plot(a2);title('尺度2的低频系数');subplot(325):plot(a3):title('尺度3的低频系数');d1=detcoef(c,l,1);d2=detcoef(c,l,2);d3=detcoef(c,l,3);figure(3);subplot(322);plot(d1);title('尺度1的高频系数');figure(3);subplot(324);plot(d2);title('尺度2的高频系数');figure(3);subplot(326);plot(d2);title('尺度3的高频系数');由上图可以清晰的看出低频的信息和高频的信息。
小波分解函数和重构函数的应用和区别
小波分解函数和重构函数的应用和区别今天把有关一维小波基本函数整理了一下,也不知道在理解上是否有偏差。
小波分析基本函数可分为分解和重构两类,下面以一维小波分析为例说明小波函数的应用和相关函数的区别。
1、一维小波分解函数和系数提取函数对常用的dwt、wavedec、appcoef函数的常用格式进行举例说明。
格式:[ca, cd]=dwt(X,’wname’) %单尺度一维离散小波分解[C, L]=wavedec(X,N,’wname’) %多尺度一维小波分解(多分辨分析函数)ca=appcoef(C,L,’wname’,N) %提取一维小波变换低频系数说明:(1)小波分解函数和系数提取函数的结果都是分解系数;(2)如何理解小波系数:小波系数是信号在做小波分解时所选择的小波函数空间的投影。
我们知道,一个信号可以分解为傅里叶级数,即一组三角函数之和,而傅里叶变换对应于傅里叶级数的系数;同样,一个信号可以表示为一组小波基函数之和,小波变换系数就对应于这组小波基函数的系数。
(3)多尺度分解是按照多分辨分析理论,分解尺度越大,分解系数的长度越小(是上一个尺度的二分之一)。
我们会发现分解得到的小波低频系数的变化规律和原始信号相似,但要注意低频系数的数值和长度与原始信号以及后面重构得到的各层信号是不一样的。
举例:(为直观,把运行结果放在相应程序段后面)%载入原始信号load leleccum;s=leleccum(1:3920);ls=length(s);%单尺度一维离散小波分解函数dwt的应用[ca1,cd1]=dwt(s,'db1'); %用小波函数db1对信号s进行单尺度分解figure(1);subplot(411); plot(s); ylabel('s');title('原始信号s及单尺度分解的低频系数ca1和高频系数cd1');subplot(423); plot(ca1); ylabel('ca1');subplot(424); plot(cd1); ylabel('cd1');(注意: figure(1)中的ca1和cd1的长度都是1960,是原始信号s长度3920的一半。
几种常用小波函数对一维信号进行分解与重构MATLAB程序部分
几种常用小波函数对一维信号进行分解与重构MATLAB程序部分具体MATLAB程序如下%将十六进制转换为十进制(读入的数据为高八位第八位)function ndata=CommonToDec2(filename)s = filename;cdata = textread(s,'%2c','delimiter',' ');% for i = 1:m ;% k = 1 ;% for j = 1:n ;% if(text(i,j) ~= ' ')% cdata(i,k) = text(i,j) ;% k = k + 1 ;% end% end% end[m,n] = size (cdata) ;ndata=zeros(1,m/3);for i=0:m/3-1;k = 3*i + 1 ; %转换高八位if(cdata(k,1)>='0')&&(cdata(k,1)<='9')mdata=cdata(k,1)-48;ndata(i+1)=ndata(i+1)+mdata*16^5;elsemdata=cdata(k,1)-55;ndata(i+1)=ndata(i+1)+mdata*16^5;endif(cdata(k,2)>='0')&&(cdata(k,2)<='9')mdata=cdata(k,2)-48;ndata(i+1)=ndata(i+1)+mdata*16^4;elsemdata=cdata(k,2)-55;ndata(i+1)=ndata(i+1)+mdata*16^4;endk = 3*i + 2 ; %转换低八位if(cdata(k,1)>='0')&&(cdata(k,1)<='9')mdata=cdata(k,1)-48;ndata(i+1)=ndata(i+1)+mdata*16^3;elsemdata=cdata(k,1)-55;ndata(i+1)=ndata(i+1)+mdata*16^3;endmdata1=CommonToDec24('93.txt');[n1,m1]=size (mdata1);for i=1:m1;ldata(i)=mdata1(i)*3.3/4096;endfor i=0:m1/2-1;pdata(i+1)=(ldata(2*i+1)-ldata(2*i+2))/64;endN=m1/2;t=1:N;x=pdata;subplot(211);plot(x);[c,l]=wavedec(x,11,'haar');a2=wrcoef('a',c,l,'haar',2);subplot(212);plot(a2);title('第二层低频重构信号'); figure(2);[c,l]=wavedec(x,11,'db3');a2=wrcoef('a',c,l,'db3',2);subplot(211);plot(a2);title('第二层低频重构信号'); figure(3);[c,l]=wavedec(x,11,'sym2');a2=wrcoef('a',c,l,'sym2',2);subplot(211);plot(a2);title('第二层低频重构信号'); figure(4);[c,l]=wavedec(x,11,'Bior1.3');a2=wrcoef('a',c,l,'Bior1.3',2);subplot(211);plot(a2);title('第二层低频重构信号'); figure(5);[c,l]=wavedec(x,11,'coif2');a2=wrcoef('a',c,l,'coif2',2);subplot(211);plot(a2);title('第二层低频重构信号');结果与分析MATLAB程序运行结果如下图所示:从上到下依次为Haar小波,db小波,sym小波,CoiN小波,biorNr.Nd小波去噪结果:因为心电信号频率较低,频谱能量大都集中在低频部分,在对提取的心电信号的第二层低频信号进行重构后发现选择不同的函数,重构的信号具有不同的效果。
小波分解函数和重构函数的应用和区别
小波分解函数和重构函数的应用和区别今天把有关一维小波基本函数整理了一下,也不知道在理解上是否有偏差。
小波分析基本函数可分为分解和重构两类,下面以一维小波分析为例说明小波函数的应用和相关函数的区别。
1、一维小波分解函数和系数提取函数对常用的dwt、wavedec、appcoef函数的常用格式进行举例说明。
格式:[ca, cd]=dwt(X,’wname’) %单尺度一维离散小波分解[C, L]=wavedec(X,N,’wname’) %多尺度一维小波分解(多分辨分析函数)ca=appcoef(C,L,’wname’,N) %提取一维小波变换低频系数说明:(1)小波分解函数和系数提取函数的结果都是分解系数;(2)如何理解小波系数:小波系数是信号在做小波分解时所选择的小波函数空间的投影。
我们知道,一个信号可以分解为傅里叶级数,即一组三角函数之和,而傅里叶变换对应于傅里叶级数的系数;同样,一个信号可以表示为一组小波基函数之和,小波变换系数就对应于这组小波基函数的系数。
(3)多尺度分解是按照多分辨分析理论,分解尺度越大,分解系数的长度越小(是上一个尺度的二分之一)。
我们会发现分解得到的小波低频系数的变化规律和原始信号相似,但要注意低频系数的数值和长度与原始信号以及后面重构得到的各层信号是不一样的。
举例:(为直观,把运行结果放在相应程序段后面)%载入原始信号load leleccum;s=leleccum(1:3920);ls=length(s);%单尺度一维离散小波分解函数dwt的应用[ca1,cd1]=dwt(s,'db1'); %用小波函数db1对信号s进行单尺度分解figure(1);subplot(411); plot(s); ylabel('s');title('原始信号s及单尺度分解的低频系数ca1和高频系数cd1');subplot(423); plot(ca1); ylabel('ca1');subplot(424); plot(cd1); ylabel('cd1');(注意: figure(1)中的ca1和cd1的长度都是1960,是原始信号s长度3920的一半。
小波图像分解与重构自编的程序
用自编的程序实现小波图像分解与重构收藏去年11月发布了一系列有关小波变换和图像处理的文章,把学习小波过程中的心得体会和编写的程序放在网上和大家共享交流。
半年来,感谢大家的关注和帮助,在相互的讨论交流中,我不断地从大家提出的问题中拓展自己的知识面,对小波的理论及其应用有了更深入的了解和掌握。
根据和大家讨论交流中发现的问题,对博客中的程序进行修正。
有关小波图像分解和重构的两篇文章中分享的程序,存在下列问题:(1)程序所用的小波函数只有非标准的Haar小波,其滤波器组为Lo_D=[1/2 1/2], Hi_D=[-1/2 1/2],是固化在mydwt2.m 的程序中的,不能选择其他的小波函数;(2)非标准的Haar小波,其分解出来的系数矩阵中,高频系数的细节内容(轮廓、边缘等特征)不明显;(3)函数mydwt2 中列变换的矩阵对象为输入矩阵,这是错误的,其矩阵对象应该是行变换后的缓存矩阵;(4)函数mydwt2 的输出用[LL,HL,LH,HH]表示,不是很规范,应改为[cA,cV,cH,cD]来表示,即一级小波变换输出的系数矩阵有4个部分:平均部分、垂直细节部分、水平细节部分和对角线细节部分。
(5)函数mywavedec2 的输出y 是与输入矩阵x 相同大小的矩阵,并且已将N级分解后所有的平均、细节系数组合成一体的。
实际上,这种定义只对Haar小波有效。
(6)原程序中要调用modmat 函数对图像矩阵进行修剪,使之能被2 的N 次方整除,主要是为了生成塔式结构图像而设的,对上述问题修正后,这个modmat 函数已不需使用了。
针对上述问题,我对程序作了修正,发布在今天的3篇文章里,请大家点击查看。
新修正的程序更为简洁易懂,功能也有所增强,可以用任意的小波函数进行小波分解,可根据小波分解系数矩阵重构出指定分解级的低频系数和原始图像。
1、《小波图像分解与重构程序存在的问题与解决办法》上一篇文章中我们实现了小波的一维、二维信号分解与重构,其中的二维信号分解与重构,只要稍作修改,就可以实现图像的分解和重构了。
matlab小波分解程序
matlab小波分解程序小波分解是一种信号处理的方法,可以用于信号的分析和压缩。
在MATLAB中,可以使用内置的`wavedec`函数来进行小波分解。
下面是一个简单的MATLAB小波分解程序示例:matlab.% 创建一个示例信号。
x = randn(1,1024);% 选择小波基和分解级别。
wname = 'db4'; % 选择小波基,这里使用db4小波。
level = 3; % 选择分解级别。
% 进行小波分解。
[c, l] = wavedec(x, level, wname);% 从分解系数和长度信息中重构近似和细节系数。
appx = wrcoef('a',c,l,wname,level); % 近似系数。
det1 = wrcoef('d',c,l,wname,1); % 第一层细节系数。
det2 = wrcoef('d',c,l,wname,2); % 第二层细节系数。
det3 = wrcoef('d',c,l,wname,3); % 第三层细节系数。
% 绘制原始信号和重构的近似信号。
t = 1:1024;subplot(2,1,1);plot(t, x);title('Original Signal');subplot(2,1,2);plot(t, appx);title('Approximation Coefficients'); % 显示细节系数。
figure;subplot(3,1,1);plot(t, det1);title('Detail Coefficients Level 1'); subplot(3,1,2);plot(t, det2);title('Detail Coefficients Level 2'); subplot(3,1,3);plot(t, det3);title('Detail Coefficients Level 3');在这个示例中,我们首先生成了一个长度为1024的随机信号。
[原创]matlab小波分解与重构滤波
m=load('A.txt');N=length(m);for i=1:N-1 ;q(i,1)=m(i,1);end;d=q';s1=d;change=1000;[c,l] = wavedec(d,3,'db4');%提取小波分解后的低频系数ca3=appcoef(c,l,'db4',3);%提取各层小波分解后的高频系数cd3=detcoef(c,l,3);cd2=detcoef(c,l,2);cd1=detcoef(c,l,1);%对信号强制消噪cdd3=zeros(1,length(cd3));%第三层高频系数cd3全置0 cdd2=zeros(1,length(cd2));%第二层高频系数cd2全置0 cdd1=zeros(1,length(cd1));%第一层高频系数cd1全置0c1=[ca3,cdd3,cdd2,cdd1];%构建新的系数矩阵s2=waverec(c1,l,'db4')%分解新的结构%[thr,sorh,keepapp]=ddenc mp('den','wv',d);%s2=wdenc mp('gbl',c,l,'db4',4,thr,sorh,keepapp);%subplot(413)%plot(1:change,s2(1:change));%title('默认软阈值消噪后信号')figure(1)subplot(9,2,1)plot(1:change,s1(1:change))title('原始信号')ylabel('S1')subplot(9,2,2)plot(1:change,s2(1:change))title('强制消噪后信号')ylabel('S2')wpt=wpdec(s1,3,'db1','shannon');%plot(wpt);%重构第三层8个节点小波系数s130=wprcoef(wpt,[3,0]);s131=wprcoef(wpt,[3,1]);s132=wprcoef(wpt,[3,2]);s133=wprcoef(wpt,[3,3]);s134=wprcoef(wpt,[3,4]);s135=wprcoef(wpt,[3,5]);s136=wprcoef(wpt,[3,6]);s137=wprcoef(wpt,[3,7]);%计算第三层8个节点小波能量s10=norm(s130);s11=norm(s131);s12=norm(s132);s13=norm(s133);s14=norm(s134);s15=norm(s135);s16=norm(s136);s17=norm(s137);%计算方差st10=std(s130);st11=std(s131);st12=std(s132);st13=std(s133);st14=std(s134);st15=std(s135);st16=std(s136);st17=std(s137);disp('正常信号的特征向量');snorm1=[s10,s11,s12,s13,s14,s15,s16,s17];std1=[st10,st11,st12,st13,st14,st15,st16,st17];。
图像小波分解以及重构
图像小波分解1 一级分解及重构1.1程序a=imread('lena.jpg');x=rgb2gray(a);[cA,cH,cV,cD]=dwt2(x,'haar');subplot(2,2,1);imshow(cA,[]);subplot(2,2,2);imshow(cH,[]);subplot(2,2,3);imshow(cV,[]);subplot(2,2,4);imshow(cD,[]);x_idwt=idwt2(cA,cH,cV,cD,'haar');figure(2);imshow(x_idwt,[]);1.2 结果图1 小波一级分解图2一级分解重构2 小波二级分解2.1 思路一我们在一级分解的基础上,对低频分量进行再次一级分解,即可得到小波二级分解。
程序:[cA2,cH2,cV2,cD2]=dwt2(cA,'haar');figure(3);subplot(2,2,1);imshow(cA2,[]);subplot(2,2,2);imshow(cH2,[]);subplot(2,2,3);imshow(cV2,[]);subplot(2,2,4);imshow(cD2,[]);图3 小波一级分解图4 小波二级分解通过上面两张图片对比,我们可以看出,二级小波分解的低频分量和一级小波分解的低频分量相差不大,说明图像经过一级分解已经将大部分的水平,垂直,斜向分量提取,所以两个低频分量相差不大。
2.2 思路二我们使用函数waverec2函数进行小波变换,其格式为:[c,s]=wavedec2(X,N,'wname')我们用它对图像X用wname小波基函数实现N层分解,将结果储存在一个行向量c里。
程序:[c,s]=wavedec2(x,2,'haar');cA2=reshape(c(1,1:125^2),125,125);figure(4);subplot(2,2,1);imshow(cA2,[]);cH2=reshape(c(1,125^2+1:125*250),125,125);subplot(2,2,2);imshow(cH2,[]);cV2=reshape(c(1,125*250+1:125*250+125^2),125,125);subplot(2,2,3);imshow(cV2,[]);cD2=reshape(c(1,250*375+1:250*375+125^2),125,125);subplot(2,2,4);imshow(cD2,[]);图5 思路二的小波二级分解(有误)但是,通过观察上图的第四幅图即斜向分量明显有误,于是我又查阅了函数waverec2的结构:c=[A(N)|H(N)|V(N)|D(N)|H(N-1)|V(N-1)|D(N-1)|H(N-2)|V(N-2)|D(N-2)|...|H(1)|V(1) |D(1)];所以,取数的顺序是正确的。
小波分解与重构
小波分解与重构我理解的小波分解是将一个多频率组成的波通过小波分解将所有频率分解出来,重构就是将这些分频率加起来得到最后的重构结果,于是写了个这样的程序clcclose all;clear all;clc;fs=612;[reg,sta,data]=readmydata('beijing08.dat');data{1:end};A=ans(2:end);for i=1:609;if A(i)>50.0;A(i)=(A(i-12)+A(i+12))/2;endendfor i=609:612;if A(i)>50.0;A(i)=(A(i-12)+A(i-24))/2;endend%信号时域波形figure(1);plot(1:612,A);%使用db5小波进行尺度为7时的分解[c,l]=wavedec(A,9,'db5');%从小波分解结构[c,l]重构信号xdataa0=waverec(c,l,'db5');%检查重构效果figure(2);subplot(3,1,1);plot(A);title('原始信号')subplot(3,1,2);plot(a0);title('重构信号')subplot(3,1,3);plot(A-a0);title('误差信号')err=max(abs(A-a0))%重构第1~5层高频细节信号d9=wrcoef('d',c,l,'db5',9); d8=wrcoef('d',c,l,'db5',8); d7=wrcoef('d',c,l,'db5',7); d6=wrcoef('d',c,l,'db5',6); d5=wrcoef('d',c,l,'db5',5); d4=wrcoef('d',c,l,'db5',4); d3=wrcoef('d',c,l,'db5',3); d2=wrcoef('d',c,l,'db5',2); d1=wrcoef('d',c,l,'db5',1); %显示高频细节信号figure(3);subplot(9,1,1);plot(d9,'LineWidth',2); ylabel('d9');subplot(9,1,2);plot(d8,'LineWidth',2); ylabel('d8');subplot(9,1,3);plot(d7,'LineWidth',2);ylabel('d7');subplot(9,1,4);plot(d6,'LineWidth',2);ylabel('d6');subplot(9,1,5);plot(d5,'LineWidth',2);ylabel('d5');subplot(9,1,6);plot(d4,'LineWidth',2);ylabel('d4');subplot(9,1,7);plot(d3,'LineWidth',2);ylabel('d3');subplot(9,1,8);plot(d2,'LineWidth',2);ylabel('d2');xlabel('时间 t/s');subplot(9,1,9);plot(d1,'LineWidth',2);ylabel('d1');%第1层高频细节信号的包络谱y=hilbert(d1);ydata=abs(y);y=y-mean(y);nfft=1024;p=abs(fft(ydata,nfft));figure(4);plot((0:nfft/2-1)/nfft*fs,p(1:nfft/2));xlabel('频率 f/Hz');ylabel('功率谱 P/W');小波分解与重构程序>> clearI=imread('C:\Documents and Settings\Administrator\桌面\暑期/cidian.bmp');I=rgb2gray(I);[X,map]=gray2ind(I);subplot(2,2,1);imshow(X,map);title('原始图像');X=double(X);sX=size(X);[cA,cH,cV,cD]=dwt2(X,'db4');A0=idwt2(cA,cH,cV,cD,' db4', sX);subplot(2,2,2);imshow(A0,map);title('db4小波重构');error1=max(max(abs(X-A0)))程序很简单,也很基础。
小波分解与重构代码
load leleccum;s = leleccum(1:3920);% 用db1小波函数对信号进行三尺度小波分解[C,L]=wavedec(s,2,'db1');figure(1);plot(s);title('leleccum原始信号');% 提取尺度1的低频系数cA1 = appcoef(C,L,'db1',1); %用小波分解框架[C.L]计算1层低频系数的近似值,小波基为db1% 提取尺度2的低频系数cA2 = appcoef(C,L,'db1',2);figure(2);subplot(2,1,1);plot(cA1);title('尺度1的低频系数');subplot(2,1,2);plot(cA2);title('尺度2的低频系数');% 提取尺度1的高频系数cD1 = detcoef(C,L,1); %用小波分解框架[C.L]计算1层高频系数的近似值,小波基为db1% 提取尺度2的高频系数cD2 = detcoef(C,L,2);figure(3);subplot(2,1,1);plot(cD1);title('尺度1的高频系数');subplot(2,1,2);plot(cD2);title('尺度2的高频系数');我给你大概标注了一下,但是你的程序有问题,% 小波图像压缩 - RGB 图像clear all;close all;% 读取图像im = input('输入图像');%输入图像名称,要加分号X=imread(im);% 输入要分解的小波层数和小波n=input('输入要分解的小波层数');%输入所要分解的层数wname = input('输入小波名称');%输入小波名称,也要加分号x = double(X);NbColors = 255;map = gray(NbColors);x = uint8(x);%把RGB图像转换成灰度图% x = double(X);% xrgb = 0.2990*x(:,:,1) + 0.5870*x(:,:,2) + 0.1140*x(:,:,3);% colors = 255;% x = wcodemat(xrgb,colors);% map = pink(colors);% x = uint8(x);% 对图像x进行n维小波分解x=imread(’ D:\a.jpg’);map=x;n=3wname='sym5';[c,s] = wavedec2(x,n,wname);% 使用默认参数选择各层不同的阈值alpha = 1.5; m = 2.7*prod(s(1,:));[thr,nkeep] = wdcbm2(c,s,alpha,m)% 使用上面的阈值和硬阈值处理进行图像压缩[xd,cxd,sxd,perf0,perfl2] = wdencmp('lvd',c,s,wname,n,thr,'h');disp('压缩效率');disp(perf0);% 重构(下面这个地方有问题,你这里是原始图像小波变换后进行重构,xd才是小波阀值压缩后重构的图像,cxd,sxd,是c,s经过阀值处理后得到的小波分解结构,也就是说xd=waverec2(cxd,sxd,wname);这个wdencmp函数不需要另外进行重构,你下面那些关于重构的都没用,而下面压缩后的图像才是重构后的图像,)R = waverec2(c,s,wname);rc = uint8(R);% 显示原始图像和压缩图像subplot(221), image(x);colormap(map);title('原始图像')subplot(222), image(xd);colormap(map);title('压缩后的图像')% 显示结果xlab1 = ['图像压缩后保留能量百分比',num2str(perfl2)];xlab2 = ['小波阀值压缩后置零系数百分比 ',num2str(perf0), ' %']; xlabel([xlab1 xlab2]);subplot(223), image(rc);colormap(map);title('重构图像');%计算图像大小disp('原始图像');imwrite(x,'original.tif');%将图像x保存为original.tif,下同imfinfo('original.tif')%显示图片original.tif详细信息,下同disp('压缩后的图像');imwrite(xd,'compressed.tif');imfinfo('compressed.tif')disp('重构后的图像');imwrite(rc,'decompressed.tif');imfinfo('decompressed.tif')。
小波的分解和重构算法
小波的分解和重构算法小波分解是将一个多频率组成的波通过小波分解将所有频率分解出来,重构就是将这些分频率加起来得到最后的重构结果。
小波变换的一级分解过程是,原始信号分别进行低通、高通滤波,再分别进行二元下采样,就得到低频、高频两部分系数;而多级分解则是对上一级分解得到的低频系数再进行小波分解,是一个递归过程。
分解过程:function [cA,cD] = mydwt(x,lpd,hpd,dim)%函数[cA,cD]=MYDWT(X,LPD,HPD,DIM) 对输入序列x进行一维离散小波分解,输出分解序列[cA,cD] ;%输入参数:x——输入序列;% lpd——低通滤波器;% hpd——高通滤波器;% dim——小波分解级数;% 输出参数:cA——平均部分的小波分解系数;% cD——细节部分的小波分解系数;cA=x; % 初始化cA,cDcD=[ ];for i=1:dimcvl=conv(cA,lpd); % 低通滤波,为了提高运行速度,调用MATLAB 提供的卷积函数conv()dnl=downspl(cvl); % 通过下采样求出平均部分的分解系数cvh=conv(cA,hpd); % 高通滤波dnh=downspl(cvh); %通过下采样求出本层分解后的细节部分系数cA=dnl; % 下采样后的平均部分系数进入下一层分解cD=[cD,dnh]; % 将本层分解所得的细节部分系数存入序列cDendfunction y=downspl(x);% 函数Y=DOWMSPL(X) 对输入序列进行下采样,输出序列Y。
% 下采样是对输入序列取其偶数位,舍弃奇数位。
N=length(x); % 读取输入序列长度M=floor(N/2); % 输出序列的长度是输入序列长度的一半i=1:M;y(i)=x(2*i);而重构则是分解的逆过程,对低频系数、高频系数分别进行上采样和低通、高通滤波处理。
重构过程:function y = myidwt(cA,cD,lpr,hpr);% 函数MYIDWT() 对输入的小波分解系数进行逆离散小波变换,重构出信号序列y% 输入参数:cA ——平均部分的小波分解系数;% cD ——细节部分的小波分解系数;% lpr、hpr ——重构所用的低通、高通滤波器。
灰度图像的小波分解与重构
灰度图像的小波分解与重构摘要:本文概述了小波变换的基本理论,介绍了haar 小波的分解和重构过程,并在Matlab环境下实现了用haar 小波对灰度图像的三级分解与重构,最后对结果作了简要的分析与讨论。
关键词:小波;小波变换;图像分解;图像重构1.引言小波变换理论自80年代末成为国际上十分活跃的研究领域,是继Fourier 变换发展的一个新的里程碑。
由于小波变换克服了傅立叶变换在单分辨率上的缺陷,具有多分辨率分析的特点,在时域和频域都有表征信号局部信息的能力 ,从而使小波理论在图像处理、故障诊断、量子场论、光学成像、数据压缩等领域得到了广泛的应用。
小波变换在图像处理中主要用于以下几个方面:图像分解、图像重构、图像融合、图像消噪等。
本文主要讨论了小波分解与重构过程,在此基础上进一步阐述了在Matlab 环境下利用haar 小波对灰度图像进行三级分解和重构的编码实现。
2.小波变换的基本理论2.1.小波变换的定义一个实值函数ψ)(x ,若它的频谱ψ)(x 满足允许条件(AdmissibleCondition )。
∞<=⎰∞+∞-dw w w C |||)(|2ψψ则ψ)(x 被称作一个基本小波或母小波(mother wavelet )。
由于W 在积分式的分母上,所以必须有ψ )(x =0, ψ )(+∞=0。
可以看到,ψ)(x 类似于一个带通滤波器的传递函数,是ψ)(x 的傅立叶变换。
小波是一个满足∫R ψ)(x dx =0的,通过平移和伸缩而产生的一个函数族ψa ,b )(x)()(,21abx ax b a -=-ψψ a ,b ∈R a 0≠ ψa ,b )(x 被称为小波基或小波。
设)(x f ∈L 2,定义其小波变换为:dx abx x f ab a wf )()(),(21-=⎰∞+∞--ψ由定义可见,参数a ,b 具有非常重要的意义,a 为伸缩因子,反映一个特定基函数的尺度,它的变化不仅改变连续小波的频谱结构,而且也改变其窗口的大小和形状。
8.2 小波分解与重构
8.2信号分解与合成的Mallat算法一、一维信号的分解与合成1. 正交镜像滤波器2. 一维信号的小波分解与重构算法(Mallat’s herringbone算法)二、二维信号的分解与重构三、用Matlab实现图像的分解与合成1.dwt2与idwt2dwt2为一层二维离散小波分解函数,调用格式:[cA,cH,cV,cD]=dwt2(X,’wname’)% 用指定小波基对图像X进行一层二维离散小波变换分解。
’wname’为小波基的名称,cA为近似(低频)图像矩阵,cH, cV, cD分别为小波分解的水平方向细节系数,垂直方向细节系数,对角线方向细节系数。
[cA,cH,cV,cD]=dwt2(X,Lo_D,Hi_D) % 用指定的低通分解滤波器Lo_D和高通分解滤波器Hi_D对图像X进行二维离散小波分解。
Lo_D与Hi_D的长度必须一致。
idwt2为一层二维离散小波重构函数,调用格式为:X=idwt2(cA,cH,cV,cD,’wname’)% 用指定小波重构图像X,wname为小波基的名称。
X=idwt2(cA,cH,cV,cD,Lo_R,Hi_R)% 用指定低通重构滤波器Lo_R和高通重构滤波器Hi_R重构图像X,Lo_R与Hi_R的长度必须一致。
2.wavedec2与vaverec2wavedec2为多层二维离散小波分解函数,其调用格式为:[C,S]=wavedec2(X,N,’wname’)% 用指定小波基对图像X进行N层二维离散小波分解。
N为正整数,C为小波分解矢量,S为相应的标记矩阵。
C = [ A(N) | H(N) | V(N) | D(N) | ...H(N-1) | V(N-1) | D(N-1) | ... | H(1) | V(1) | D(1) ].A = approximation coefficientsH = horizontal detail coefficientsV = vertical detail coefficientsD = diagonal detail coefficients矩阵S形如S(1,:) = size of approximation coefficients(N)S(i,:) = size of detail coefficients(N-i+2) for i = 2, ...N+1 S(N+2,:) = size(X).wavwrec2为多层二维离散小波重构函数,其调用格式为:X=waverec2(C,S,’wname’) %利用指定小波基由矢量C和标记矩阵S重构图像X。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
load leleccum;
s = leleccum(1:3920);
% 用db1小波函数对信号进行三尺度小波分解
[C,L]=wavedec(s,2,'db1');
figure(1);
plot(s);
title('leleccum原始信号');
% 提取尺度1的低频系数
cA1 = appcoef(C,L,'db1',1); %用小波分解框架[C.L]计算1层低频系数的近似值,小波基为db1
% 提取尺度2的低频系数
cA2 = appcoef(C,L,'db1',2);
figure(2);
subplot(2,1,1);
plot(cA1);
title('尺度1的低频系数');
subplot(2,1,2);
plot(cA2);
title('尺度2的低频系数');
% 提取尺度1的高频系数
cD1 = detcoef(C,L,1); %用小波分解框架[C.L]计算1层高频系数的近似值,小波基为db1
% 提取尺度2的高频系数
cD2 = detcoef(C,L,2);
figure(3);
subplot(2,1,1);
plot(cD1);
title('尺度1的高频系数');
subplot(2,1,2);
plot(cD2);
title('尺度2的高频系数');
我给你大概标注了一下,但是你的程序有问题,
% 小波图像压缩 - RGB 图像
clear all;
close all;
% 读取图像
im = input('输入图像');%输入图像名称,要加分号
X=imread(im);
% 输入要分解的小波层数和小波
n=input('输入要分解的小波层数');%输入所要分解的层数
wname = input('输入小波名称');%输入小波名称,也要加分号
x = double(X);
NbColors = 255;
map = gray(NbColors);
x = uint8(x);
%把RGB图像转换成灰度图
% x = double(X);
% xrgb = 0.2990*x(:,:,1) + 0.5870*x(:,:,2) + 0.1140*x(:,:,3);
% colors = 255;
% x = wcodemat(xrgb,colors);
% map = pink(colors);
% x = uint8(x);
% 对图像x进行n维小波分解
x=imread(’ D:\a.jpg’);
map=x;
n=3
wname='sym5';
[c,s] = wavedec2(x,n,wname);
% 使用默认参数选择各层不同的阈值
alpha = 1.5; m = 2.7*prod(s(1,:));
[thr,nkeep] = wdcbm2(c,s,alpha,m)
% 使用上面的阈值和硬阈值处理进行图像压缩
[xd,cxd,sxd,perf0,perfl2] = wdencmp('lvd',c,s,wname,n,thr,'h');
disp('压缩效率');
disp(perf0);
% 重构(下面这个地方有问题,你这里是原始图像小波变换后进行重构,xd才是小波阀值压缩后重构的图像,cxd,sxd,是c,s经过阀值处理后得到的小波分解结构,也就是说xd=waverec2(cxd,sxd,wname);这个wdencmp函数不需要另外进行重构,你下面那些关于重构的都没用,而下面压缩后的图像才是重构后的图像,)
R = waverec2(c,s,wname);
rc = uint8(R);
% 显示原始图像和压缩图像
subplot(221), image(x);
colormap(map);
title('原始图像')
subplot(222), image(xd);
colormap(map);
title('压缩后的图像')
% 显示结果
xlab1 = ['图像压缩后保留能量百分比',num2str(perfl2)];
xlab2 = ['小波阀值压缩后置零系数百分比 ',num2str(perf0), ' %']; xlabel([xlab1 xlab2]);
subplot(223), image(rc);
colormap(map);
title('重构图像');
%计算图像大小
disp('原始图像');
imwrite(x,'original.tif');%将图像x保存为original.tif,下同imfinfo('original.tif')%显示图片original.tif详细信息,下同
disp('压缩后的图像');
imwrite(xd,'compressed.tif');
imfinfo('compressed.tif')
disp('重构后的图像');
imwrite(rc,'decompressed.tif');
imfinfo('decompressed.tif')。