实验四
图像压缩编码程序设计
一、实验目的和要求
本实验为设计性实验,其目的是理解有损压缩的概念,特别是通过K-L变换或DCT变换,掌握压缩编码的基本原理、算法,并通过编程给予实现,对原始图像数据和解压后的图像数据进行失真估计,了解压缩性能及其重建效果的影响、作用,给出适当的理论分析。
二、实验内容和原理
本实验是在根据图像压缩基本原理的基础上,独立设计图像的有损压缩编码算法,并在MATLAB编程环境中编程实现。
其要求是:
1)选择一种有损压缩编码算法(K-L变换或DCT变换)对一幅数字图像进行压缩编码,计算出压缩率,并显示编码前图像。
2)对编码后的数据进行解压,并显示解压后图像。
3)改变算法参数对原始图像数据和解压后的图像数据进行失真估计。
4)通过改变算法参数(比如改变图像编码的子图像小块的尺度等)进行算法比较和讨论。
三、实验环境
硬件:计算机
软件:Windows 2000和MATLAB编程环境。
四、算法描述及实验步骤
1、先用imread读入原图像,即I=imread('lena256rgb.png');
2、使用由函数dctmtx返回的DCT变换矩阵,dctmtx的调用格式为
D=dctmtx(N),继而利用blkproc函数完成分块操作。blkproc函数的调用格式为B=blkproc(A,[m
n],fun,P1,P2,...) ,其具体代码实现如下所示:
T=dctmtx(8); %产生二维DCT变换矩阵
L=blkproc(R1,[8
8],'P1*x*P2',T,T'); %计算二维DCT,矩阵T及其转置T’是DCT函数P1*x*P2的参数
Mask=[ 1 1 1 0 0 0 0 0
1 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0
0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0
0]; %二值掩膜,用来压缩DCT系数,只留下DCT系数中左上角的10个
L2=blkproc(L,[8 8],'P1.*x',Mask);
%只保留DCT变换的10个系数
3、对原图像进行压缩,具体代码如下所示:
[m
n]=size(L2);
J=[m n];
for i=1:m
value=L2(i,1);
num=1;
for j=2:n
if
L2(i,j)==value
num=num+1;
else
J=[J num value];
num=1;
value=L2(i,j);
end
end
J=[J num value
];
end
4、对其进行解压缩,具体代码如下:
t1=J(1);
t2=J(2);
K(1:t1,1:t2)=0;
i1=1;
j1=1;
for i=3:2:length(J)
c1=J(i);
c2=J(i+1);
for
j=1:c1
K(i1,j1)=c2;
j1=j1+1;
if j1>t2
i1=i1+1;
j1=1;
end
end
end
R2= blkproc(K,[8,8],'P1*x*P2',T',T); %逆DCT,重构图像
G=I(:,:,2);
G1=im2double(G); %将原图像转为双精度数据类型;
5、显示其图像,代码如下:
A(:,:,1)=R2;
A(:,:,2)=G2;
A(:,:,3)=B2;
Subplot(1,2,1);
imshow(I);title('原图像'); %显示原图像
Subplot(1,2,2);
imshow(A);title('压缩图像');%显示压缩后的图像,对比原始图像和压缩后的图像
以上是8*8矩阵的实现步骤,而4*4矩阵步骤与其相同。
五、调试过程
六、实验结果
1、矩阵为8*8所得的结果如下所示
1)原图像和压缩图像
2)R2的原图像大小、压缩图像大小以及图像的压缩比
3)G2的原图像大小、压缩图像大小以及图像的压缩比
4)B2的原图像大小、压缩图像大小以及图像的压缩比
5)压缩图像A的值
6)原图像I的值
7)J的值
8)经过DCT变换后所得的值L2
2、矩阵为4*4所得的结果
1)原图像和压缩图像原图像和压缩图像
2)R2的原图像大小、压缩图像大小以及图像的压缩比
3)G2的原图像大小、压缩图像大小以及图像的压缩比
4)B2的原图像大小、压缩图像大小以及图像的压缩比
5)压缩图像A的值
6)原图像I的值
7)经过二维DCT变换后所得的值L2
8)J的值
七、总结
通过这次的实验,对彩色图像的压缩以及解压缩有了进一步的了解;也对二维DCT变换矩阵有了更深的认识,包括其调用到的函数的一些用法,比如dctmxt、blkproc函数。