⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 thresholdtestdemo.m

📁 用matlab编写的压缩解压缩程序
💻 M
字号:
function thresholdtestdemo(imgname,wavename,level,deta)
%  thresholdtestdemo  小波变换在不同阈值下重构的测试演示程序
%  thresholdtestdemo(imgname,wavename,level,deta)
%  本程序作用:载入图像信号,使用小波变换,比较显示不同阈值下的重构图像及相关信息
%  输入: imgname   ----要装载的图像名称
%        wavename  ----变换小波名称
%        level     ----小波分解级数
%        deta      ----测试阈值增加值
%  缺省时:变换图像为color256.png, 3级haar小波变换 deta=5

if nargin==0
    imgname='woman.jpg';
    wavename='haar';
    level=1;
    deta=90;
else
    if  nargin==1
        wavename='haar';
        level=3;
        deta=5;
    else
        if nargin==2
            level=3;
            deta=5;
        else
            if nargin==3
                deta=5;
            end
        end
    end
end

%  读入的X中含有被装载的图像信号,map中含有被装载的color
[X,map] = imread(imgname);

%检测图像格式
%输入矩阵X为3维时为真彩色图像,RGB三个分量需分别分解与重构
%输入图像为索引图像时(map不为空),转换为RGB真彩色图像,再作分解与重构,因为索引图每个像素的颜色值
%不是矩阵的数值,真正应该显示的颜色为读入的矩阵X上的值通过颜色表map变换得到的,如果直接用来作变换,即有可能会发生失真情况

if isempty(map)
    emp=1;
else
    X=ind2rgb(X,map)*255;
    emp=0;
end
if ndims(X)==3
    imgcolor=1;
    Xr=X(:,:,1);
    Xg=X(:,:,2);
    Xb=X(:,:,3);
else
    imgcolor=0;
end

info=imfinfo(imgname);
ss=round((info(1).FileSize)/1024);
sname=size(imgname);
orgname=imgname(1:sname(2)-4);
nfile=struct('name','');
X=double(X);
%画出原始图像
figure(1);
subplot(2,3,1);
imshow(uint8(X));colormap(map);        
title(strcat(wavename,'小波变换阈值测试(',mat2str(level),'级)'));
xlabel(strcat('原始图像(Size: ',mat2str(ss),'KB)'));
axis square
%小波分解
if imgcolor
    [Cr,Sr]=wavedec2(Xr,level,wavename);
    [Cg,Sg]=wavedec2(Xg,level,wavename);
    [Cb,Sb]=wavedec2(Xb,level,wavename);
    C(1,:)=Cr;
    C(2,:)=Cg;
    C(3,:)=Cb;    
else
    [C,S]=wavedec2(X,level,wavename);
end

%在不同阈值下测试
T(1)=0;
for i=1:4
    %用0置换矩阵中绝对值小于阈值的数值
    if T(i)>0
        C(find(abs(C)<=T(i)))=0;
        %C=wthresh(C,'h',T(i));
    end
    
    %计算零的个数
    zeronum(i)=prod(size(find(C==0)));
    
    %重构不同阈值下图像
    if imgcolor
        Cr=C(1,:);
        Cg=C(2,:);
        Cb=C(3,:);        
        Ar=waverec2(Cr,Sr,wavename);           
        Ag=waverec2(Cg,Sg,wavename);           
        Ab=waverec2(Cb,Sb,wavename);  
        A(:,:,1)=uint8(round(Ar));
        A(:,:,2)=uint8(round(Ag));
        A(:,:,3)=uint8(round(Ab));   
    else
        A=waverec2(C,S,wavename);   
        A=uint8(round(A));
    end
    
    %存贮新图像,图像名为原图像名+小波名+阈值大小
    nfile(i).name=strcat(orgname,'_',wavename,'_',mat2str(T(i)),'.png');
    imwrite(A,nfile(i).name,'png');
    
    %获取图像大小信息
    info=imfinfo(nfile(i).name);
    if info(1).FileSize>1024
        sfile(i)=round((info(1).FileSize)/1024);
        sunit='KB';
    else
        sfile(i)=info(1).FileSize;
        sunit='B';
    end        

    %画出重构图像
    figure(1);
    subplot(2,3,i+1);
    imshow(uint8(A));                  
    title(strcat('阈值T=',int2str(T(i)),' (Size:',int2str(sfile(i)),sunit,')'));
    xlabel(strcat('系数含"0"数目=',int2str(zeronum(i))));
    axis square
    if i<3
        T(i+1)=T(i)+deta;
    else
        if i==3
            T(i+1)=T(i)+2*deta;
        end
    end;
end

%画出不同阈值对应的文件大小及系数为零的关系图
if and(or(min(zeronum)>1000,zeronum(1)==0),zeronum(4)/1000>sfile(4))
    zeronum=zeronum/1000;
    overth=1;
else
    overth=0;
end;
subplot(2,3,6);
plot(T,zeronum,'-rs','LineWidth',1,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','g',...
                'MarkerSize',5);
hold on;
plot(T,sfile,'-bs','LineWidth',1,...
                'MarkerEdgeColor','k',...
                'MarkerFaceColor','y',...
                'MarkerSize',5);
xlabel('                         阈值T ');

%axis([0 20 min(sfile(1),zeronum(1)) max(sfile(4),zeronum(4))]);
meant=(zeronum(4)-sfile(4))/8;
if overth
    text(10,zeronum(4)+meant,'系数含"0"数目/1000');
else
    text(10,zeronum(4)+meant,'系数含"0"数目');
end    
text(15,sfile(4)+meant,strcat('文件大小(',sunit,')'));
axis square


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -