?? wavelet_vector_comprssion64.m
字號:
%程序L7_2.m: 應用小波變換與向量量化做圖像壓縮%
%利用LGB訓練一層小波變換后四個頻帶的碼本%
function Wavelet_Vector_Comprssion()
%X=imread('j:\數字圖像處理-活用Matlab程序\CH7\lena.bmp','bmp');
%[LL1,LH1,HL1,HH1]=dwtper2(X,'bior3.3');
%load lena
X=imread('E:\matlab1\LENA64.bmp','bmp');
figure(100);imshow(uint8(X));title('original image');
%利用正交小波函數對X進行多尺度分解
%[C,S]=wavedec2(double(X),N,Wavelet_Name)是使用指定的小波基‘Wavelet_Name’對圖像X進行N層分解
Wavelet_Name='db1';
Wavelet_Scale=1;
[C,S]=wavedec2(double(X),Wavelet_Scale,Wavelet_Name);
%appcoef2用來提取二維信號小波分解的近似分量
LL1=appcoef2(C,S,Wavelet_Name,Wavelet_Scale);
%detcoef2用來提取二維信號小波分解的細節分量
%D=detcoef2(O,C,S,N),O指定細節分量的類型,
%當O=‘h’時,重構水平細節分量,當O=‘v’時,重構垂直細節分量,當O=‘d’時,重構細節細節分量
LH1=detcoef2('v',C,S,1);
HL1=detcoef2('h',C,S,1);
HH1=detcoef2('d',C,S,1);
%訓練LL1頻帶碼本,將碼本大小設為128,維度為4 %
th=0.05;
nc=128;nd=4;
[cbLL1]=LBG(LL1,nc,nd,th); %LBG.m在L3.3節中
%訓練LH1頻帶碼本,將碼本大小設為64,維度為4 %
nc=64;nd=4;
[cbLH1]=LBG(LH1,nc,nd,th);
%訓練HL1頻帶碼本,將碼本大小設為64,維度為4 %
nc=64;nd=4;
[cbHL1]=LBG(HL1,nc,nd,th);
%訓練HH1頻帶碼本,將碼本大小設為64,維度為16 %
nc=64;nd=16;
[cbHH1]=LBG(HH1,nc,nd,th);
%利用一層小波變換加上向量量化進行Lena圖像壓縮%
%輸入一幅Lena圖像%
X=imread('E:\matlab\LENA64.bmp','bmp');
%load lena
[M,N]=size(X);
%使用Matlab中Wavelet工具箱的周期性小波變換函數dwtper2.m%
%并使用雙正交小波bior3.3進行一層小波變換%
%[LL1,LH1,HL1,HH1]=dwtper2(X,'bior3.3');
[C,S]=wavedec2(double(X),Wavelet_Scale,Wavelet_Name);
LL1=appcoef2(C,S,Wavelet_Name,Wavelet_Scale);
LH1=detcoef2('v',C,S,1);
HL1=detcoef2('h',C,S,1);
HH1=detcoef2('d',C,S,1);
wt_X(1:M/2,1:N/2)=LL1;
wt_X(1:M/2,N/2+1:N)=LH1;
wt_X(M/2+1:M,1:N/2)=HL1;
wt_X(M/2+1:M,N/2+1:N)=HH1;
%分別針對不同的頻帶進行向量量化,其中VQ.m置于L3.4節中%
[R_LL1,bitLL1]=VQ(LL1,cbLL1);
[R_LH1,bitLH1]=VQ(LH1,cbLH1);
[R_HL1,bitHL1]=VQ(HL1,cbHL1);
[R_HH1,bitHH1]=VQ(HH1,cbHH1);
wt_Y(1:M/2,1:N/2)=R_LL1;
wt_Y(1:M/2,N/2+1:N)=R_LH1;
wt_Y(M/2+1:M,1:N/2)=R_HL1;
wt_Y(M/2+1:M,N/2+1:N)=R_HH1;
%計算圖像經過向量量化后的壓縮率CR及失真PSNR%
totalbit=bitLL1+bitLH1+bitHL1+bitHH1; %花費的總位數
%Y=idwtper2(R_LL1,R_LH1,R_HL1,R_HH1,'bior3.3'); %反小波變換
C1= [R_LL1 R_HL1 R_LH1 R_HH1];
S1=S;
Y=waverec2(C1,S1,Wavelet_Name);
size(Y)%size(Y)=[512 512]
X=double(X);
Y=double(Y);
MSE=(sum(sum((X-Y).^2)))/(M*N)
PSNR=20*log10(255/sqrt(MSE))
CR=M*N*8/totalbit
figure(200);imshow(uint8(Y));title('compressed image');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -