?? thresholdtestdemo.m
字號:
function thresholdtestdemo(imgname,wavename,level,deta)
% thresholdtestdemo 小波變換在不同閾值下重構的測試演示程序
% thresholdtestdemo(imgname,wavename,level,deta)
% 本程序作用:載入圖像信號,使用小波變換,比較顯示不同閾值下的重構圖像及相關信息
% 輸入: imgname ----要裝載的圖像名稱
% wavename ----變換小波名稱
% level ----小波分解級數
% deta ----測試閾值增加值
% 缺省時:變換圖像為color256.png, 1級db9小波變換 deta=5
if nargin==0
imgname='color256.png';
wavename='db9';
level=1;
deta=5;
else
if nargin==1
wavename='db9';
level=1;
deta=5;
else
if nargin==2
level=1;
deta=5;
else
if nargin==3
deta=5;
end
end
end
end
% 讀入的X中含有被裝載的圖像信號,map中含有被裝載的color
[X,map] = imread(imgname);
%檢測圖像格式
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 ');
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 + -