二维小波分解与重构程序实例
- 格式:doc
- 大小:92.00 KB
- 文档页数:21
小波分解与重构我理解的小波分解是将一个多频率组成的波通过小波分解将所有频率分解出来,重构就是将这些分频率加起来得到最后的重构结果,于是写了个这样的程序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')。
二维haar小波变换二维Haar小波变换是一种常用的图像处理方法,它可以将图像分解为不同频率的子图像,从而实现图像的压缩和去噪等功能。
本文将介绍二维Haar小波变换的基本原理、算法实现和应用案例。
一、基本原理Haar小波变换是一种基于小波分析的信号处理方法,它利用小波函数的特性对信号进行分解和重构。
二维Haar小波变换将二维图像看作是一个矩阵,通过对矩阵的行和列进行小波分解,可以得到图像的不同频率分量。
具体而言,二维Haar小波变换的基本原理如下:1. 将二维图像分解为4个子图像,每个子图像的尺寸是原图像的一半。
2. 对每个子图像进行小波分解,得到近似系数和细节系数。
近似系数表示低频分量,细节系数表示高频分量。
3. 重复以上步骤,将近似系数作为输入,继续进行小波分解,直到达到指定的分解层数。
4. 最后,通过对各个子图像进行合并和重构,得到原图像的小波变换结果。
二、算法实现二维Haar小波变换的算法实现相对简单,可以用矩阵运算来实现。
具体步骤如下:1. 将二维图像转换为灰度图像,并将像素值归一化到[0,1]的范围。
2. 初始化变换矩阵,用于进行小波分解和重构。
3. 对图像的行进行小波变换,得到近似系数和细节系数。
4. 对近似系数和细节系数的列进行小波变换,得到最终的小波变换结果。
三、应用案例二维Haar小波变换在图像处理中有广泛的应用。
以下是几个典型的应用案例:1. 图像压缩:通过对图像进行小波分解,可以将图像的能量集中在少数的系数上,从而实现对图像的压缩。
通过保留较大的系数,可以实现有损压缩;而通过保留较小的系数,可以实现无损压缩。
2. 图像去噪:图像的细节系数通常包含了图像中的噪声信息。
通过对细节系数进行阈值处理,可以将噪声去除,从而实现图像的去噪功能。
3. 图像增强:通过对图像的近似系数进行增强处理,可以提高图像的对比度和清晰度。
通过调整不同频率分量的权重,可以实现不同的增强效果。
4. 特征提取:小波变换可以将图像分解为不同频率的子图像,每个子图像包含了图像的一部分特征信息。
小波图像分解程序: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维矩阵。
二维离散小波变换实验报告 - 实验报告二维离散小波变换实验报告2008-11-021. 实验题目对图像进行二维离散小波变换, 变换级数大于等于3级,然后统计系数中0的个数(百分比表示) 并进行重构, 最后计算重构图像的峰值信噪比(PSNR).数据:灰度图像lena.bmp或其它图像, 滤波器系数可以调用matlab中的wfilters函数获得, wfilters函数的使用请在matlab中help wfilters.另外,峰值信噪比计算公式:MN'2()ff,,,ijij255255,ij,,11PSNRMSE,,10lg,MSEMN,'{},{}ff1,1,,,,iMjNijij其中,分别表示原始图像和重建图像, 且. 注:实验中,边缘延拓的方法和具体的小波滤波器可以自己根据实验结果进行选择。
2. 实验步骤1) 生成原始灰度图像作为标准以便对比。
在matlab中导入LENA.bmp, 使用下列命令生成,结果如图1所示。
imagesc(LENA.cdata, [0,255]); colormap(gray);图1 原始灰度图像2) 用matlab小波工具包作出分解合成图,如图2。
第 - 1 - 页图2 直接使用matlab小波工具箱进行分析3) 写代码实现DWT正反变换,见附件MyDwt2D.dsw。
我在代码中构建了一个CDwt类,输入为:@ const char* lpInputImage : 输入图像文件名@ int nAnalysisLevel : 分析级数,本题要求大于等于3@ int nThreshold = 0 : 阈值,默认值为0(即不进行阈值化)公用方法有四个为:void ForwadDwt(); /* 实现DWT变换 */void InverseDwt(); /* 实现DWT逆变换 */void StatisticThenOutput(const char* lpStatisticFile); /* 先统计,然后输出统计信息 */void OutputInversedImage(const char* lpInversedImageName); /* 输出重构图像数据 */方法调用顺序为首先调用ForwadDwt,然后调用InverseDwt,最后是类的两个输出。
[转帖]小波图像分解与合成(例子)-Matlab讨论区-振动论坛动力学,噪声-...转帖]小波图像分解与合成(例子)% 该函数是根据对所输入的png格式的真彩图像、小波类型(db9或haar)% 和相应的阈值进行了三级非标准小波harr或db9的分解和重构,从而达到了对原图像的压缩处理的% 目的。
它首先把通过原图像分离后的某颜色分量作为二维图像矩阵,通过调用自定义的二维离散% 小波变换函数mydwt2(),并依据指定的小波基函数'wavename'进行二维离散的行、列小波变换,% 得到了经变换后的相应颜色分量的近似分量% cA,水平细节分量cH,垂直细节分量cV,对角细节% 分量cD和中间分量cM,然后调用自定义的图像输出函数outrgb分别把中间分量以及cA、cH、cV、% cD合并后的图像阵进行R、G、B合成输出图像文件,其中某颜色分量的cA又做为下一级二维离散的% 行、列小波分解的输入图像阵,如此共完成三次。
% 其次,把经过三级非标准小波分解后的各颜色分量的各级水平细节分量、垂直细节分量、对角细% 节分量矩阵通过调用自定义函数make_0()完成了相应矩阵元素数值小于阀值系数的个数统计,并% 对它们进行小于阀值系数元素置0处理,且把分量尽数返回,以便三级的非标准小波重构处理。
% 最后,将返回得到的各颜色分量的第三级水平细节分量、垂直细节分量、对角细节分量矩阵和第% 三级分解后的近似分量作为参数,通过调用自定义的二维离散小波反变换函数myidwt2()进行二维% 离散的列、行重构,得到了经重构后的近似分量cA 和中间分量cM,把该中间分量cM以及近似分量% cA分别和经置0处理后第二级cH、cV、cD行列扩展,同时进行R、G、B合成,后调用自定义的图像% 输出函数outrgb()输出图像文件。
其中各颜色分量的cA又做为下一级二维离散的列、行小波重构% 的输入图像阵,如此共完成三次。
图像小波分解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)];所以,取数的顺序是正确的。
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。