%程序L7_2.m: 应用小波变换与向量量化做图像压缩%
%利用LGB训练一层小波变换后四个频带的码本%
load lena
[LL1,LH1,HL1,HH1]=dwtper2(X,'bior3.3');
%训练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图像%
load lena
[M,N]=size(X);
%使用Matlab中Wavelet工具箱的周期性小波变换函数dwtper2.m%
%并使用双正交小波bior3.3进行一层小波变换%
[LL1,LH1,HL1,HH1]=dwtper2(X,'bior3.3');
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'); %反小波变换
MSE=(sum(sum((X-Y).^2)))/(M*N);
PSNR=20*log10(255/sqrt(MSE))
CR=M*N*8/totalbit