www.pudn.com > m_program.zip > modetest.m


function modetest(imgname,wavename,mode) 
%modetest  不同小波在不同分解模式下3级分解与重构图像演示程序 
%modetest(imgname,wavename,mode) 
%输入:imgname   图像文件 
%      wavename  小波名称 
%      mode      分解模式(sym,per,zpd,spd,sp0,ppd) 
%缺省为black256.png,db9小波,sym分解模式 
%装载图像为黑白索引图像,X中含有被装载的信号,map中含有被装载的color 
 
if nargin==0 
    imgname='black256.png'; 
    wavename='db9'; 
    mode='sym'; 
else 
    if nargin==1 
        wavename='db9'; 
        mode='sym'; 
    else 
        mode='sym'; 
    end 
end 
 
[X,map] = imread(imgname); 
deccof=struct('cA',[],'cH',[],'cV',[],'cD',[]); 
reccof=struct('RX',[]); 
sX=size(X); 
nbcol=size(map,1); 
X=double(X); 
%画出原始图像 
figure(1); 
subplot(241);imshow(uint8(X));colormap(map); 
title(strcat('原始图像(',wavename,'小波)')); 
ylabel(strcat('3级分解与重构演示图(',mode,'模式)')); 
xlabel(mat2str(sX)); 
axis square 
DX=X; 
deccof(1).cA=X; 
for i=2:4 
    %用小波函数进行分解 
    [deccof(i).cA,deccof(i).cH,deccof(i).cV,deccof(i).cD]=dwt2(DX,wavename,'mode',mode); 
     
    %画出各分解系数对应的图像 
    subplot(2,4,i); 
    imshow([deccof(i).cA/255,deccof(i).cH/255;deccof(i).cV/255,deccof(i).cD/255;]);colormap(map); 
    title(strcat(int2str(i-1),'级分解系数图像')); 
    xlabel(mat2str(2*size(deccof(i).cA))); 
    axis square; 
    DX=deccof(i).cA; 
end 
reccof(i).RX=deccof(i).cA; 
i=i+4; 
for j=4:-1:2 
    %画出每级重构的图像 
    figure(1); 
    subplot(2,4,i);imshow([reccof(j).RX/255,deccof(j).cH/255;deccof(j).cV/255,deccof(j).cD/255]); 
    if j==3 
        title(strcat(int2str(j-1),'级分解系数图像')); 
    else 
        title(strcat('重构',int2str(j-1),'级系数图像')); 
    end 
    axis square; 
    xlabel(mat2str(2*size(reccof(j).RX))); 
 
    %利用分解系数进行直接重构 
    reccof(j-1).RX=idwt2(reccof(j).RX,deccof(j).cH,deccof(j).cV,deccof(j).cD,wavename,size(deccof(j-1).cA),'mode',mode) ; 
    i=i-1; 
end 
%检查重构精度 
A0max1=max(max(abs(X-reccof(1).RX))); 
A0max2=prod(size(find(abs((X-(reccof(1).RX)))~=0))); 
 
subplot(245);imshow(reccof(1).RX/255);colormap(map); 
title('系数重构图像'); 
axis square; 
xlabel(mat2str(size(reccof(1).RX))); 
ylabel(strcat('最大重构误差=',num2str(A0max1))); 
%xlabel(strcat('有误差值的数量=',num2str(A0max2)));