HARR小波分解与重构C++代码
haar小波变换分解和复原
haar小波变换分解和复原
Haar小波变换是一种常用的图像处理方法,它通过使用低通和高通滤波器,将图像信息逐层分解剥离开来。
具体来说,Haar小波变换对图像的分解可以看做如下图所示的滤波过程:
1. 首先进行行滤波,沿着列方向进行。
2. 然后下采样。
3. 对上一步得到的结果进行列滤波,沿着行方向。
4. 最后下采样。
通过以上步骤,可以获得4个不同的频带,一个近似分量、三个细节分量(水平、垂直、对角线),将所有的结果组合为一张图。
若对所得的近似分量继续进行这样的滤波过程,即可得到塔式分解。
在进行Haar小波变换分解和复原时,需要注意处理细节和调整参数,以获得最佳的效果。
如果你需要更详细的信息或代码示例,请提供更多上下文或提供具体要求,我将尽力为你解答。
小波实验报告一维Haar小波2次分解
一、题目:一维Haar 小波2次分解二、目的:编程实现信号的分解与重构三、算法及其实现:离散小波变换离散小波变换是对信号的时-频局部化分析,其定义为:/2200()(,)()(),()()j j Wf j k a f t a t k dt f t L R φ+∞---∞=-∈⎰ 本实验实现对信号的分解与重构:(1)信号分解:用小波工具箱中的dwt 函数来实现离散小波变换,函数dwt 将信号分解为两部分,分别称为逼近系数和细节系数(也称为低频系数和高频系数),实验中分别记为cA1,cD1,它们的长度均为原始信号的一半,但dwt 只能实现原始信号的单级分解。
在本实验中使用小波函数db1来实现单尺度小波分解,即:[cA1,cD1]=dwt(s,’db1’),其中s 是原信号;再通过[cA2,cD2]=dwt(cA1,’db1’)进行第二次分解,长度又为cA2的一半。
(2)信号重构:用小波工具箱中的upcoef 来实现,upcoef 是进行一维小波分解系数的直接重构,即:A1 = upcoef('a',cA1,'db1'); D1 = upcoef('a',cD1,'db1')。
四、实现工具:Matlab五、程序代码:%装载leleccum 信号load leleccum;s = leleccum(1:3920);%用小波函数db1对信号进行单尺度小波分解[cA1,cD1]=dwt(s,'db1');subplot(3,2,1);plot(s);title('leleccum 原始信号');%单尺度低频系数cA1向上一步的重构信号A1 = upcoef('a',cA1,'db1');%单尺度高频系数cD1向上一步的重构信号D1 = upcoef('a',cD1,'db1');subplot(3,2,3);plot(A1);title('单尺度低频系数cA1向上一步的重构信号');subplot(3,2,5);plot(D1);title('单尺度高频系数cD1向上一步的重构信号');[cA1,cD1]=dwt(cA1,’db1');subplot(3,2,2);plot(s);title('leleccum 第一次分解后的cA1信号');%第二次分解单尺度低频系数cA2向上一步的重构信号A2= upcoef('a',cA2,'db1',2);%第二次分解单尺度高频系数cD2向上一步的重构信号D2 = upcoef('a',cD2,'db1',2);subplot(3,2,4);plot(A2);title('第二次分解单尺度低频系数cA2向上一步的重构信号');subplot(3,2,6);plot(D2);title('的二次分解单尺度高频系数cD2向上一步的重构信号');六、运行结果:七、结果分析:。
小波分解与重构
小波分解与重构我理解的小波分解是将一个多频率组成的波通过小波分解将所有频率分解出来,重构就是将这些分频率加起来得到最后的重构结果,于是写了个这样的程序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)))程序很简单,也很基础。
提升小波及其算法-基本程序-有说明
% 使用Haar小波,得到相应的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案els={'p',[-0.125 0.125],0}lsnew=addlift(lshaar,els);% 对于简单图像,尺度为2进行LWTx=reshape(1:16,4,4);xDec=lwt2(x,lsnew,2)% 提取第一层的低频系数ca1=lwtcoef2('ca',xDec,lsnew,2,1)% 重构低频和高频a1=lwtcoef2('a',xDec,lsnew,2,1)a2=lwtcoef2('a',xDec,lsnew,2,2)h1=lwtcoef2('h',xDec,lsnew,2,1)v1=lwtcoef2('v',xDec,lsnew,2,1)d1=lwtcoef2('d',xDec,lsnew,2,1)h2=lwtcoef2('h',xDec,lsnew,2,2)v2=lwtcoef2('v',xDec,lsnew,2,2)d2=lwtcoef2('d',xDec,lsnew,2,2)% 检查重构效果err=max(max(abs(x-a2-h2-v2-d2-h1-v1-d1)))M1=laurmat(eye(2,2))Z=laurpoly(1,1);M2=laurmat({1 Z;0 1})% 计算劳伦多项式P=M1*M2d=det(P)% 得到Haar滤波器[LoD,HiD,LoR,HiR]=wfilters('haar')% 提升Haar滤波器twoels(1)=struct('type','p','value',laurpoly([0.125 -0.125],0)); twoels(2)=struct('type','p','value',laurpoly([0.125 -0.125],1)); [LoDN,HiDN,LoRN,HiRN]=liftfilt(LoD,HiD,LoR,HiR,twoels);% 得到双正交小波bior1.3[LoDB,HiDB,LoRB,HiRB]=wfilters('bior1.3');somewavelet=isequal([LoDB,HiDB,LoRB,HiRB],[LoDN,-HiDN,LoRN,HiRN])% 使用Haar小波,得到相应的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案els={'p',[-0.125 0.125],0}lsnew=addlift(lshaar,els);% 对于简单信号,进行2层LWTx=1:8;xDec=lwt(x,lsnew,2)% 提取尺度为1时的低频系数ca1=lwtcoef('ca',xDec,lsnew,2,1)% 重构低频和高频a1=lwtcoef('a',xDec,lsnew,2,1)a2=lwtcoef('a',xDec,lsnew,2,2)d1=lwtcoef('d',xDec,lsnew,2,1)d2=lwtcoef('d',xDec,lsnew,2,2)% 检查重构效果err=max(abs(x-a2-d2-d1))% 定义劳伦多项式P=laurpoly([1:3],2);P=laurpoly([1:3],'dmax',2)P=laurpoly([1:3],'dmin',2)% 计算劳伦多项式Z=laurpoly(1,1)Q=Z*P% 得到Haar小波的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 进行单层提升小波分解load noisdopp;x=noisdopp;[cA,cD]=lwt(x,lsnew);figure(1);subplot(311);plot(x);title('原始信号');subplot(312);plot(cA);title('提升小波分解的低频信号');subplot(313);plot(cD);title('提升小波分解的高频信号');% 直接使用Haar小波进行2层提升小波分解[cA,cD]=lwt(x,'haar',2);figure(2);subplot(311);plot(x);title('原始信号');subplot(312);plot(cA);title('2层提升小波分解的低频信号'); subplot(313);plot(cD);title('2层提升小波分解的高频信号');% 得到Haar小波的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 2层提升小波分解load noisdopp;x=noisdopp;xDec=lwt(x,lsnew,2);% 提取第1层的近似系数ca1=lwtcoef('ca',xDec,lsnew,2,1);% 提取第2层的近似系数ca2=lwtcoef('ca',xDec,lsnew,2,2);% 提取第1层的细节系数cd1=lwtcoef('cd',xDec,lsnew,2,1);% 提取第2层的细节系数cd2=lwtcoef('cd',xDec,lsnew,2,2);plot(x);title('原始信号');subplot(323);plot(ca1);title('第一层近似信号');subplot(324);plot(ca2);title('第二层近似信号');subplot(325);plot(cd1);title('第一层细节信号');subplot(326);plot(cd2);title('第二层细节信号');% 获得db2小波的提升方案lsdb2=liftwave('db2');% 显示提升方案displs(lsdb2);% 获得sym2小波的提升方案lssym2=liftwave('sym2');% 显示提升方案displs(lssym2);% 获得整数变换提升方案lsdb2=liftwave('db2','Int2Int');x=[1:10];lwtx=lwt(x,lsdb2)% 获得Haar小波的提升方案lshaar=liftwave('haar');% 将提升步骤ELS加入到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 进行单层提升小波分解load noisdopp;subplot(211);plot(x);ylabel('x');% 实施提升小波变换[cA,cD]=lwt(x,lsnew);xRec=ilwt(cA,cD,lsnew);err=max(max(abs(x-xRec))) subplot(212);plot(xRec);ylabel('xRec');els={'p',[-0.125 0.125],0}; lsnew=addlift(lshaar,els);% 2层提升小波分解load noisdopp;x=noisdopp;xDec=lwt(x,lsnew,2);% 重构近似信号和细节信号a1=lwtcoef('a',xDec,lsnew,2,1); a2=lwtcoef('a',xDec,lsnew,2,2); d1=lwtcoef('d',xDec,lsnew,2,1); d2=lwtcoef('d',xDec,lsnew,2,2); % 检查重构误差err=max(abs(x-a2-d2-d1)) subplot(311);plot(x);title('原始信号');subplot(323);plot(a1);title('重构第一层近似信号'); subplot(324);plot(a2);title('重构第二层近似信号'); subplot(325);plot(d1);title('重构第一层细节信号'); subplot(326);plot(d2);title('重构第二层细节信号');% 得到Haar小波的提升方案lshaar=liftwave('haar');% 将提升步骤ELS添加到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 2层提升小波分解load noisdopp;x=noisdopp;subplot(211);plot(x);ylabel('x');% 对信号实施整数提升小波变换lshaarInt=liftwave('haar','int2int'); lsnewInt=addlift(lshaarInt,els);[cAint,cDint]=lwt(x,lsnewInt);% 实施提升小波变换xRecInt=ilwt(cAint,cDint,lsnewInt);errInt=max(max(abs(x-xRecInt)))subplot(212);plot(xRecInt);ylabel('xRecInt');% 使用Haar小波,得到相应的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案els={'p',[-0.125 0.125],0}lsnew=addlift(lshaar,els);% 对于简单信号,尺度为1进行LWTx=1:8;[cA,cD]=lwt(x,lsnew)% 对上面的信号,进行整数LWT lshaarInt=liftwave('haar','int2int'); lsnewInt=addlift(lshaarInt,els);[cAint,cDint]=lwt(x,lsnewInt)% 使用Haar小波,得到相应的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 对于简单信号,尺度为1进行LWTx=1:8;[cA,cD]=lwt(x,lsnew);% 对上面的信号,进行整数LWTlshaarInt=liftwave('haar','int2int');lsnewInt=addlift(lshaarInt,els);[cAint,cDint]=lwt(x,lsnewInt);% 进行逆变换xRec=ilwt(cA,cD,lsnew);err=max(max(abs(x-xRec)))xRecInt=ilwt(cAint,cDint,lsnewInt);errInt=max(max(abs(x-xRecInt)))clc;load woman;nbc=size(map,1);% 得到Haar小波的提升方案lshaar=liftwave('haar');% 将提升步骤ELS添加到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);load woman;% 进行一层提升小波分解[cA,cH,cV,cD]=lwt2(X,lsnew);length=size(cA,1);c=zeros(1,length*length*4);for i=1:length;c((i-1)*length+1:i*length)=cA(:,i);end;for i=length+1:2*length;c((i-1)*length+1:i*length)=cH(:,i-length); end;for i=2*length+1:3*length;c((i-1)*length+1:i*length)=cV(:,i-2*length); end;for i=3*length+1:4*length;c((i-1)*length+1:i*length)=cD(:,i-3*length); end;s=zeros(3,2);s(:,1)=[length,length,2*length];s(:,2)=[length,length,2*length];% 使用wdcbm2获得压缩阈值alpha=1.5;m=3.5*prod(s(1,:));[thr,nkeep]=wdcbm2(c,s,alpha,m);% 对图像进行压缩xd=wdencmp('lvd',c,s,'haar',1,thr,'h'); colormap(pink(nbc));figure(1);subplot(121);image(wcodemat(X,nbc));title('原始图像');subplot(122);image(wcodemat(xd,nbc));title('压缩后的图像');load woman;nbc=size(map,1);% 得到Haar小波的提升方案lshaar=liftwave('haar');% 将提升步骤ELS添加到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);load woman;% 进行一层提升小波分解[cA,cH,cV,cD]=lwt2(X,lsnew);length=size(cA,1);c=zeros(1,length*length*4);for i=1:length;c((i-1)*length+1:i*length)=cA(:,i);end;for i=length+1:2*length;c((i-1)*length+1:i*length)=cH(:,i-length); end;for i=2*length+1:3*length;c((i-1)*length+1:i*length)=cV(:,i-2*length); end;for i=3*length+1:4*length;c((i-1)*length+1:i*length)=cD(:,i-3*length); end;s=zeros(3,2);s(:,1)=[length,length,2*length];s(:,2)=[length,length,2*length];% 使用ddencmp获得压缩阈值[thr,nkeep]=ddencmp('cmp','wv',X);% 对图像进行压缩xd=wdencmp('gbl',c,s,'haar',1,thr,'s',1); colormap(pink(nbc));figure(1);subplot(121);image(wcodemat(X,nbc));title('原始图像');subplot(122);image(wcodemat(xd,nbc));title('压缩后的图像');load woman;% 产生含噪图像init=2055615886;randn('seed',init);x=X+18*randn(size(X));nbc=size(map,1);% 得到Haar小波的提升方案lshaar=liftwave('haar');% 将提升步骤ELS添加到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);load woman;% 进行一层提升小波分解[cA,cH,cV,cD]=lwt2(X,lsnew);length=size(cA,1);c=zeros(1,length*length*4);for i=1:length;c((i-1)*length+1:i*length)=cA(:,i);end;for i=length+1:2*length;c((i-1)*length+1:i*length)=cH(:,i-length); end;for i=2*length+1:3*length;c((i-1)*length+1:i*length)=cV(:,i-2*length); end;for i=3*length+1:4*length;c((i-1)*length+1:i*length)=cD(:,i-3*length); end;s=zeros(3,2);s(:,1)=[length,length,2*length];s(:,2)=[length,length,2*length];% 使用wdcbm2获得去噪阈值alpha=3;m=3.5*prod(s(1,:));[thr,nkeep]=wdcbm2(c,s,alpha,m);% 对图像进行去噪sorh='s';xd=wdencmp('lvd',c,s,'haar',1,thr,sorh); colormap(pink(nbc));figure(1);subplot(221);image(wcodemat(X,nbc));title('原始图像');subplot(222);image(wcodemat(x,nbc));title('含噪图像');subplot(223);image(wcodemat(xd,nbc));title('去噪后的图像');% 得到Haar小波的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);load woman;% 进行一层提升小波分解[cA,cH,cV,cD]=lwt2(X,lsnew);figure(1);nbc=size(map,1);colormap(pink(nbc));subplot(321);image(wcodemat(X,nbc));title('原始图像');subplot(322);image(wcodemat(cA,nbc));title('提升小波分解的低频图像'); subplot(323);image(wcodemat(cH,nbc));title('水平方向高频图像');subplot(324);image(wcodemat(cV,nbc));title('垂直方向高频图像');subplot(325);image(wcodemat(cD,nbc));title('对角方向高频图像');% 使用Haar小波,得到相应的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案els={'p',[-0.125 0.125],0}lsnew=addlift(lshaar,els);% 对于简单图像,尺度为1进行LWTx=reshape(1:16,4,4);[cA,cH,cV,cD]=lwt2(x,lsnew);% 对上面的图像,进行整数LWT lshaarInt=liftwave('haar','int2int'); lsnewInt=addlift(lshaarInt,els);[cAint,cHint,cVint,cDint]=lwt2(x,lsnewInt)clear;clc;% 得到Haar小波的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 2层提升小波分解load woman;xDec=lwt2(X,lsnew,2);% 提取近似图像和细节图像ca2=lwtcoef2('ca',xDec,lsnew,2,2); ch1=lwtcoef2('ch',xDec,lsnew,2,1); cv1=lwtcoef2('cv',xDec,lsnew,2,1); cd1=lwtcoef2('cd',xDec,lsnew,2,1); ch2=lwtcoef2('ch',xDec,lsnew,2,2); cv2=lwtcoef2('cv',xDec,lsnew,2,2); cd2=lwtcoef2('cd',xDec,lsnew,2,2); nbc=size(map,1);colormap(pink(nbc));subplot(121);image(wcodemat(X,nbc));title('原始图像');subplot(122);image(wcodemat(ca2,nbc));title('第二层近似图像'); figure;subplot(231);image(wcodemat(ch1,nbc));title('第一层水平方向图像'); subplot(232);image(wcodemat(cv1,nbc));title('第一层垂直方向图像'); subplot(233);image(wcodemat(cd1,nbc));title('第一层对角方向图像'); subplot(234);image(wcodemat(ch2,nbc));title('第二层水平方向图像'); subplot(235);image(wcodemat(cv2,nbc));title('第二层垂直方向图像'); subplot(236);image(wcodemat(cd2,nbc));title('第二层对角方向图像');% 获得Haar小波的提升方案lshaar=liftwave('haar');% 将提升步骤ELS加入到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 实施二维提升小波分解load woman;nbc=size(map,1);colormap(pink(nbc));subplot(221);image(wcodemat(X,nbc));title('X');[cA,cH,cV,cD]=lwt2(X,lsnew);% 对同一个图像实施整数提升小波变换lshaarInt=liftwave('haar','int2int');lsnewInt=addlift(lshaarInt,els);[cAint,cHint,cVint,cDint]=lwt2(X,lsnewInt);% 实施提升小波逆变换xRec=ilwt2(cA,cH,cV,cD,lsnew);err=max(max(abs(X-xRec)))subplot(222);image(wcodemat(xRec,nbc));title('xRec');xRecInt=ilwt2(cAint,cHint,cVint,cDint,lsnewInt); errInt=max(max(abs(X-xRecInt)))subplot(223);image(wcodemat(xRecInt,nbc));title('xRecInt');clear;clc;% 得到Haar小波的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案中els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 2层提升小波分解load woman;xDec=lwt2(X,lsnew,2);% 提取近似图像和细节图像a2=lwtcoef2('a',xDec,lsnew,2,2);h1=lwtcoef2('h',xDec,lsnew,2,1);v1=lwtcoef2('v',xDec,lsnew,2,1);d1=lwtcoef2('d',xDec,lsnew,2,1);h2=lwtcoef2('h',xDec,lsnew,2,2);v2=lwtcoef2('v',xDec,lsnew,2,2);d2=lwtcoef2('d',xDec,lsnew,2,2);% 检查重构误差err=max(max(abs(X-a2-h2-v2-d2-h1-v1-d1))) nbc=size(map,1);colormap(pink(nbc));subplot(121);image(wcodemat(X,nbc));title('原始图像');subplot(122);image(wcodemat(a2,nbc));title('重构第二层近似图像');figure;subplot(231);image(wcodemat(h1,nbc));title('第一层水平方向图像');subplot(232);image(wcodemat(v1,nbc));title('第一层垂直方向图像');subplot(233);image(wcodemat(d1,nbc));title('第一层对角方向图像');subplot(234);image(wcodemat(h2,nbc));title('第二层水平方向图像');subplot(235);image(wcodemat(v2,nbc));title('第二层垂直方向图像');subplot(236);image(wcodemat(d2,nbc));title('第二层对角方向图像');% 使用Haar小波,得到相应的提升方案lshaar=liftwave('haar');% 添加ELS到提升方案els={'p',[-0.125 0.125],0};lsnew=addlift(lshaar,els);% 对于简单图像,尺度为1进行LWTx=reshape(1:16,4,4);[cA,cH,cV,cD]=lwt2(x,lsnew);% 对上面的图像,进行整数LWTlshaarInt=liftwave('haar','int2int');lsnewInt=addlift(lshaarInt,els);[cAint,cHint,cVint,cDint]=lwt2(x,lsnewInt);% 进行逆变换xRec=ilwt2(cA,cH,cV,cD,lsnew);err=max(max(abs(x-xRec)))xRecInt=ilwt2(cAint,cHint,cVint,cDint,lsnewInt); errInt=max(max(abs(x-xRecInt)))。
一维信号的小波分解重构程序
% 函数 Y = UPSPL(X) 对输入的一维序列x进行上抽样,即对序列x每个元素之间
% 插零,例如 x=[x1,x2,x3,x4],上抽样后为 y=[0,x1,0,x2,0,x3,0,x4,0];
%
% Copyright by Zou Yuhua ( chenyusiyuan ), Created: 2007-11-10, Modified: 2008-07-07
% Modified: 2008-09-01
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cA=x;
c=[];
l=length(x);
for i=1:dim
cvl=conv(cA,lpd); % 低通滤波
dnl=downspl(cvl); % 通过下抽样求出平均部分的分解系数
cvh=conv(cA,hpd); % 高通滤波
dnh=downspl(cvh); % 通过下抽样求出本层分解后的细节部分系数
cA=dnl; % 下抽样后的平均部分系数进入下一层分解
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
cA=c(1:l(1));
for i=1:length(l)-2
upl=upspl(cA); % 对平均部分系数进行上抽样
cvl=conv(upl,lpr); % 低通卷积
原创 一维信号的小波分解重构程序 收藏
感谢网友‘李明杨艳’指出了我此前三个版本的小波信号分解重构程序中有关一维信号分解重构的程序mydwt和myidwt都存在的一个大Bug,因为当时编程时都是按照haar小波的特点来写的代码,没有考虑到使用其它小波函数滤波器组时卷积运算的输出序列长度变化的问题,后来的版本也只集中于二维图像方面,没有考虑一维信号,现已修正。更新的程序代码如下:
小波分解与重构代码
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')。
python haar小波分解
python haar小波分解小波分解是一种信号处理技术,可以将信号分解成多个频率范围的子信号。
Haar小波是其中一种常用的小波函数。
以下是使用Python进行Haar小波分解的示例代码:```pythonimport numpy as npdef haar_wavelet_decomposition(signal):n = len(signal)output = []while n > 1:coeffs = []for i in range(0, n, 2):average = (signal[i] + signal[i+1]) / 2difference = (signal[i] - signal[i+1]) / 2coeffs.extend([average, difference])output.append(coeffs)signal = coeffsn = len(coeffs)output.append(signal)return output# 示例信号signal = [1, 2, 3, 4, 5, 6, 7, 8]# 进行Haar小波分解decomposition = haar_wavelet_decomposition(signal)# 打印分解结果for level, coeffs in enumerate(decomposition):print(f"Level {level+1}: {coeffs}")```输出结果为:```Level 1: [1.5, 0.5, 4.5, 0.5, 7.5, 0.5, 6.5, 0.5]Level 2: [1.0, 3.0, 6.0, -2.0]Level 3: [2.0, 4.0]Level 4: [3.0]```以上代码实现了一个名为`haar_wavelet_decomposition`的函数,该函数接受一个信号作为输入,并返回一个包含多个层级的分解结果。
三层分解与重构
数字图像处理作业四姓名:08信计(2)班王芬学号:200841210226题目:对图片进行三层分解和三次重构:(1)采用haar(或db4)小波函数;(2)比较两种小波变换。
使用haar小波基函数程序如下:I=imread('wf.jpg'); %读入图片IY=RGB2gray(I); %将真彩色图像I换成灰度图像XX=double(Y); %转图片Y为浮点型X%一层分解[cA1,cH1,cV1,cD1]=dwt2(X,'haar'); %使用小波基函数‘haar’对二维信号X进行二维离散小波变换cA,cH,cV,cD 分别表示近似分量分量,水平细节分量,垂直细节分量,对角细节分量m1=[cA1,cH1;cV1,cD1]; %对图像X进行一层小波分解%二层分解[cA2,cH2,cV2,cD2]=dwt2(cA1,'haar');m2=[cA2,cH2;cV2,cD2]; %对图像进行二层分解%三层分解[cA3,cH3,cV3,cD3]=dwt2(cA2,'haar'); %使用小波基函数‘haar’对二维信号cA2进行二维离散小波变换m3=[cA3,cH3;cV3,cD3]; %对图像进行三层小波分解%一层重构a1=size(m3);X1=idwt2(cA3,cH3,cV3,cD3,'haar',a1); %对图像m3的近似信号cA和细节信号cH,cV,cD经小波反变换重构信号X1%二层重构a2=size(m2);X2=idwt2(X1,cH2,cV2,cD2,'haar',a2);%三层重构a3=size(m1);X3=idwt2(X2,cH1,cV1,cD1,'haar',a3);figure(1)subplot(1,4,1),imshow(Y),title('灰度图Y')subplot(1,4,2),imshow(m1,[]),title('一次分解m1')subplot(1,4,3),imshow(m2,[]),title('二次分解m2')subplot(1,4,4),imshow(m3,[]),title('三次分解m3')figure(2)subplot(1,4,1),imshow(Y),title('灰度图Y')subplot(1,4,2),imshow(X1,[]),title('一层重构X1')subplot(1,4,3),imshow(X2,[]),title('二层重构X2')subplot(1,4,4),imshow(X3,[]),title('三层重构X3')利用db4小波函数运行图像如下:通过比较可知,haar小波基函数经重构后所得图像与原图像基本一致,而db4小波函数的分解图像较好。
熟悉小波变换融合算法代码
熟悉小波变换融合算法代码小波变换融合是一种常用的图像处理算法,它可以将一幅图像通过小波变换解析为不同尺度和频率的信息,并通过将多个小波变换产生的信息进行融合,得到更加清晰和丰富的图像信息。
下面是一份中文的小波变换融合算法代码:1.导入必要的库和函数import numpy as npimport pywtimport cv22.定义小波变换融合函数def wavelet_fusion(img1, img2):# 使用haar小波变换进行分解,设置分解层数为2coeffs1 = pywt.wavedec2(img1, 'haar', level=2)coeffs2 = pywt.wavedec2(img2, 'haar', level=2)# 将高频系数进行融合coeffs = []for i in range(len(coeffs1)):# 对于第三个系数的小数组进行处理,因为第三个系数的小数组是大小不同的if i == 0:coeffs.append((coeffs1[0] + coeffs2[0]) / 2)else:# 将大小相同的小数组进行融合fused_coeffs = []for j in range(len(coeffs1[i])):# 融合系数fused_coeffs.append((coeffs1[i][j] + coeffs2[i][j]) / 2) # 将融合后的系数放入系数列表coeffs.append(fused_coeffs)# 使用haar小波变换进行重构fused_img = pywt.waverec2(coeffs, 'haar')# 将所有像素值限制在0-255之内fused_img = np.where(fused_img < 0, 0, fused_img)fused_img = np.where(fused_img > 255, 255, fused_img)# 返回融合后的图像return fused_img.astype(np.uint8)3.读取两幅待融合的图像并调用小波变换融合函数# 读取两幅待融合的图像img1 = cv2.imread('img1.jpg',0)img2 = cv2.imread('img2.jpg',0)4.将融合后的图像进行保存和显示以上就是一份简单的小波变换融合算法代码,它可以帮助我们更好地理解小波变换融合算法的原理和实现方式。
matlab haar小波四层分解生成四层信号
1. 引言Matlab是一种常用的科学计算软件,其中包含了丰富的工具箱,能够帮助工程师和科学家们进行数据处理、模拟和分析。
其中,小波变换是一种强大的信号处理工具,能够将信号按照不同频率进行分解和重构。
本文将介绍如何使用Matlab对信号进行Haar小波四层分解,并生成相应的四层信号。
2. Haar小波变换的原理Haar小波变换是一种基于矩阵运算的离散小波变换方法。
通过对信号进行分解和重构,可以将信号分解成不同尺度和频率的成分,从而更好地理解和处理信号。
Haar小波变换的核心是通过一组基函数对信号进行分解和重构,这组基函数包括平均函数和差分函数。
通过对信号进行多层分解,可以得到不同尺度和频率的信号序列。
3. Matlab中Haar小波变换的使用在Matlab中,可以使用wavefun函数生成Haar小波函数。
通过指定'haar'作为第一个参数,可以获取Haar小波函数的基本信息,包括基本函数和尺度。
在进行小波分解时,可以使用wavedec函数对信号进行指定层数的小波分解。
在生成四层信号时,需要指定分解的层数为4,即进行四次分解得到四层信号。
4. 代码示例```matlab生成信号t = 0:0.01:1;x = sin(2*pi*3*t) + sin(2*pi*5*t) + sin(2*pi*7*t);进行四层Haar小波分解[c, l] = wavedec(x, 4, 'haar');生成四层信号a4 = appcoef(c, l, 'haar', 4);d4 = detcoef(c, l, 4);a3 = appcoef(c, l, 'haar', 3);d3 = detcoef(c, l, 3);a2 = appcoef(c, l, 'haar', 2);d2 = detcoef(c, l, 2);a1 = appcoef(c, l, 'haar', 1);d1 = detcoef(c, l, 1);```5. 结果分析通过以上代码,我们成功生成了原始信号和四层Haar小波分解得到的四层信号。
灰度图像的小波分解与重构
灰度图像的小波分解与重构摘要:本文概述了小波变换的基本理论,介绍了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 为伸缩因子,反映一个特定基函数的尺度,它的变化不仅改变连续小波的频谱结构,而且也改变其窗口的大小和形状。
小波图像分解和重构程序每句都带解释
小波图像分解程序: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维矩阵。
c++实现haar小波变换
c++实现haar小波变换在C++中实现Haar小波变换,可以参考以下代码:```cpp#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace std;using namespace cv;void HaarWavelet(Mat& src, Mat& dst, int nLayer) {if (src.empty()) {cout << "输入的图像为空,请检查输入。
" << endl;return;}if (dst.empty()) {dst.create(src.size(), src.type());}if (nLayer < 0) {cout << "层数不能为负数,请检查输入。
" << endl;return;}int width = src.cols;int height = src.rows;int halfWidth = width / 2;int halfHeight = height / 2;float* pfData = new float[height];float* pfRow = new float[halfWidth];float* pfColumn = new float[halfHeight];for (int y = 0; y < height; y++) {pfData[y] = (float)src.at<float>(y, 0);}for (int y = 0; y < halfHeight; y++) {for (int x = 0; x < halfWidth; x++) {pfRow[x] = (pfData[y * 2 + x] + pfData[y * 2 + x + 1]) / 2.0;}for (int x = halfWidth; x < width; x++) {pfRow[x] = pfData[y * 2 + x];}}for (int x = 0; x < width; x++) {for (int y = 0; y < halfHeight; y++) {pfColumn[y] = (pfRow[x] + pfRow[x + 1]) / 2.0;}for (int y = halfHeight; y < height; y++) {pfColumn[y] = pfRow[x];}}for (int y = 0; y < height; y++) {for (int x = 0; x < width; x++) {dst.at<float>(y, x) = pfColumn[y] * 2;}}delete[] pfData;delete[] pfRow;delete[] pfColumn;}int main() {Mat src = imread("input.jpg", IMREAD_GRAYSCALE);if (src.empty()) {cout << "无法加载图像,请检查输入路径。
小波图像分解与重构
⼩波图像分解与重构MATLAB2015教程中⽰例clc;clear;% 装载图像load woman;% X包含载⼊的图像% 绘制原始图像figure(1);subplot(2,2,1);image(X);colormap(map);title('原始图像');% 使⽤sym5对X进⾏尺度为2的分解[c,s] = wavedec2(X,1,'sym5');% 从⼩波分解结构[c,s]进⾏尺度为1和2时的低频重构a1 = wrcoef2('a',c,s,'sym5',1);a2 = wrcoef2('a',c,s,'sym5',1);% 绘制尺度为1时的低频图像subplot(2,2,3);image(a1);colormap(map);title('尺度为1时的低频图像');% 绘制尺度为2时的低频图像subplot(2,2,4);image(a2);colormap(map);title('尺度为2时的低频图像');% 从⼩波分解结构[c,s]在尺度为2时重构⾼频% 'h' 是⽔平⽅向% 'v' 是垂直⽅向% 'd' 是对⾓⽅向hd2 = wrcoef2('h',c,s,'sym5',1);vd2 = wrcoef2('v',c,s,'sym5',1);dd2 = wrcoef2('d',c,s,'sym5',1);% 绘制⾼频图像figure(2);subplot(2,2,1);image(hd2);colormap(map);title('尺度为2时的⽔平⾼频图像');subplot(2,2,2);image(vd2);colormap(map);title('尺度为2时的垂直⾼频图像');subplot(2,2,3);image(dd2);colormap(map);title('尺度为2时的对⾓⾼频图像');subplot(2,2,4);image(hd2+dd2+vd2+a1);colormap(map);% 验证这些图像的长度都是sXsX = size(X)sa1 = size(a1)shd2 = size(hd2)norm(hd2+dd2+vd2+a1-X)。
haar小波变换matlab
haar小波变换matlab
在MATLAB中执行Haar小波变换(Haar wavelet transform)可以使用wavedec 和waverec函数。
这些函数能够对信号进行小波分解和重构。
下面是一个简单的例子,演示如何在MATLAB中执行Haar小波变换:
创建一个示例信号
x=[1 2 3 4 5 6 7 8];
执行一级Haar小波变换
level=1;
[c,l]=wavedec(x,level,'haar');
重构信号
x_reconstructed=waverec(c,l,'haar');
显示结果
disp('原始信号:');
disp(x);
disp('小波变换系数:');
disp(c);
disp('重构后的信号:');
disp(x_reconstructed);
在这个例子中,wavedec函数用于对信号x进行一级Haar小波分解,返回分解后的系数c和长度向量l。
然后,waverec函数使用这些系数和长度向量来重构原始信号。
可以根据自己的信号和需要,修改输入的信号x,调整小波变换的级别,或者尝试其他小波类型(不仅限于Haar小波)。
这些函数提供了灵活性,可以用于不同类型的信号处理和分析。
图像小波分解以及重构
图像小波分解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)];所以,取数的顺序是正确的。
自己动手编写小波信号分解与重构的Matlab程序
去年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篇文章里,请大家点击查看。
新修正的程序更为简洁易懂,功能也有所增强,可以用任意的小波函数进行小波分解,可根据小波分解系数矩阵重构出指定分解级的低频系数和原始图像.Matlab小波分析工具箱丰富的函数和强大的仿真功能为我们学习小波、用好小波提供了方便、快捷的途径,但是,如果我们要深入掌握小波分析的原理,真正学好、用好小波,就应该尽量用自己编写的程序去实现小波变换和信号分析,尽量在自己的程序中少调用Matlab提供的函数,多用自己的理解去编写相关的小波函数,这样的过程是一个探索、求知的过程,更能让我们体会到小波的强大和学习的乐趣。
小波分解重构算法的实践
引言小波分解重构算法的实践天津大学建筑工程学院岩土工程专业1015205008 林澍小波是一种震荡形式,具有正负相间的振幅。
这种震荡形式因为具有衰减性,长度有限,均值为0,且具有波动性,所以称为小波。
小波分析是通过选取适合的小波作为空间基底来对信号进行处理,能够通过伸缩平移运算将信号的细部信息体现出来。
小波分析不仅在时域上将信号进行了局部化处理,而且能够在频率上进行调节。
信号的小波分解是利用小波作为基底,将信号依照不同频率段分解为若干层。
小波重构是分解的逆过程,是将若干层信号重新组合成一个信号。
本次实践仅将信号做分解重构处理,不进行其他处理。
二、小波基选取可供选择的小波基非常多,常用的有Haar小波,Daubechies小波,Biorthogonal小波,Symlets小波等。
不同小波各有优缺点,应根据信号特征选取适合的小波。
本次实践不对信号进行其他处理,因此仅选用一种小波对信号进行分解重构处理。
选用db1小波,即Haar小波。
Haar小波是一个正交函数系,其表达式为b 其它Haar小波函数的一般形式为j,k(t)-- (2j t—k),k=0,1,2, ••丿-2A=CAl+roipCAI=CA2+CD2A-CAS+CD 3+CD2+CD 1亠三、实践结果本次实践通过MATLAB 进行,对地震波信号进行三层分解,再重构回原信号,并将原是新号和重构信号进行对比。
信号的分解和重构过程示意图如图 1所示。
图1信号分解和重构示意图所使用的MATLAB 程序代码如下:clear all;clc;A=textread('NS.txt');%提取地震波信号N=le ngth(1:1024);Time=(0:(N-1))*0.02;figure(1)plot(Time,A); title('原始地震波信号');[c,l]=wavedec(A,3,'db1');%用db1小波对地震波信号A 进行3层小波分解 cd1= detcoef(c,l,1);%提取第一层细节系数 cd2=detcoef(c,l,2);%提取第二层细节系数 cd3=detcoef(c,l,3);%提取第三层细节系数 ca3=appcoef(c,l,'db1',3); %使用小波分解框架[c,l ]计算第三层小波系数近似值ca2=appcoef(c,l,'db1',2); %使用小波分解框架[c,l]计算第二层小波系数近似值ca1=appcoef(c,l,'db1',1); %使用小波分解框架[c,l]计算第一层小波系数近似值figure(2);subplot(3,2,1);plot(ca3); title('a3');title('第3 层低频分解');ylabel('ca3');subplot(3,2,3);plot(ca2); title('a2'); title('第2 层低频分解');ylabel('ca2');subplot(3,2,5);plot(ca1); title('al'); title('第1 层低频分解');ylabel('ca1');subplot(3,2,2);plot(cd3); title('h3'); title('第3 层高频分解');ylabel('cd3');subplot(3,2,4);plot(cd2); title('h2'); title('第2 层高频分解');ylabel('cd2');subplot(3,2,6);plot(cd1); title('h1'); title('第1 层高频分解');ylabel('cd1');%进行重构计算figure(3);A2=waverec(c,l,'db1'); % 将信号重构subplot(2,1,1),plot(Time,A);title('原始地震波信号');subplot(2,1,2),plot(Time,A2);title('重构地震波信号');通过运行上述代码,可以得到如下结果。
小波图像分解与重构自编的程序
用自编的程序实现小波图像分解与重构收藏去年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、《小波图像分解与重构程序存在的问题与解决办法》上一篇文章中我们实现了小波的一维、二维信号分解与重构,其中的二维信号分解与重构,只要稍作修改,就可以实现图像的分解和重构了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//*****************重构**********************
//上采样及延拓
for(int j=0;j<512;j++)
{
YanTuo1[2*j+1]=CaiYang1[j];
YanTuo1[2*j+2]=0.0;
YanTuo2[2*j+1]=CaiYang2[j];
//*********************
// 小波分解与才重构
// Edit by Atp
//*********************
#include <iostream>
#include <fstream>
#include <math.h>
#include <time.h>
double Result[1024];
//生成源随机数
for(int i=0;i<RandomTime;i++)
{OriginalData[i]=(int)(((double)rand()/RAND_MAX)*1000);}
OriginalData[1024]=OriginalData[0];
}
//高通滤波
for(int j=0;j<RandomTime;j++)
{
GaoTong[1][j]=YanTuo2[j]*g_[1]+YanTuo2[j+1]*g_[0];
}
for(int j=0;j<1024;j++){
Result[j]=DiTong[1][j]+GaoTong[1][j];
fout<<Separate[k]<<" ";
}
fout<<endl<<"最终重构结果: "<<endl;
for(int k=0;k<1024;k++)
{
fout<<Result[k]<<" ";
}
return(0);
}
YanTuo2[2*j+2]=0.0;
}
YanTuo1[0]=0.0;
YanTuo2[0]=0.0;
//低通滤波
for(int j=0;j<RandomTime;j++)
{
DiTong[1][j]=YanTuo1[j]*h_[1]+YanTuo1[j+1]*h_[0];
}
//下采样
for(int j=0;j<51ห้องสมุดไป่ตู้;j++)
{
CaiYang1[j]=DiTong[0][j*2];
CaiYang2[j]=GaoTong[0][j*2];
//一级小波分解
Separate[j]=CaiYang1[j];
Separate[j+512]=CaiYang2[j];
#include <ctime>
using namespace std;
int main(){
srand(time(NULL));
ofstream fout("OutPut.txt",ios::out);
int RandomTime=1024;
double h[2]={0.5,0.5};
}
//输出结果
cout<<endl;
cout<<"源随机数: "<<endl;
for(int k=0;k<1024;k++)
{
cout<<OriginalData[k]<<" ";
}
cout<<endl<<"一级小波分解: "<<endl;
for(int k=0;k<1024;k++)
for(int k=0;k<1024;k++)
{
fout<<OriginalData[k]<<" ";
}
fout<<endl<<"一级小波分解: "<<endl;
for(int k=0;k<1024;k++)
{
if(k==511)
fout<<endl<<"**************************"<<endl;
double h_[2]={1,1};
double g[2]={-0.5,0.5};
double g_[2]={-1,1};
int OriginalData[1025];
double DiTong[2][1024];
double GaoTong[2][1024];
double CaiYang1[512];
//低通滤波
for(int j=0;j<RandomTime;j++)
{
DiTong[0][j]=OriginalData[j]*h[0]+OriginalData[j+1]*h[1];
}
//高通滤波
for(int j=0;j<RandomTime;j++)
{
GaoTong[0][j]=OriginalData[j]*g[0]+OriginalData[j+1]*g[1];
double CaiYang2[512];
double Separate[1024];
double YanTuo1[1025];
double YanTuo2[1025];
double CaiYang3[512];
double CaiYang4[512];
//double ChongGou[1024];
{
cout<<Separate[k]<<" ";
}
cout<<endl<<"最终重构结果: "<<endl;
for(int k=0;k<1024;k++)
{
cout<<Result[k]<<" ";
}
//输出到文件
fout<<endl;
fout<<"源随机数: "<<endl;