一、 实验目的
1.了解有关数字图像压缩的基本概念,了解几种常用的图像压缩编码方式;
2.进一步熟悉JPEG编码与离散余弦变换(DCT)变换的原理及含义;
3.掌握编程实现离散余弦变换(DCT)变换及JPEG编码的方法;
4.对重建图像的质量进行评价。
二、 实验原理
1.图像压缩基本概念及原理
图像压缩主要目的是为了节省存储空间,增加传输速度。图像压缩的理想标准是信息丢失最少,压缩比例最大。不损失图像质量的压缩称为无损压缩,无损压缩不可能达到很高的压缩比;损失图像质量的压缩称为有损压缩,高的压缩比是以牺牲图像质量为代价的。压缩的实现方法是对图像重新进行编码,希望用更少的数据表示图像。应用在多媒体中的图像压缩编码方法,从压缩编码算法原理上可以分为以下3类:
(1)无损压缩编码种类
哈夫曼(Huffman)编码,算术编码,行程(RLE)编码,Lempel zev编码。
(2)有损压缩编码种类
预测编码,DPCM,运动补偿;
频率域方法:正交变换编码(如DCT),子带编码;
空间域方法:统计分块编码;
模型方法:分形编码,模型基编码;
基于重要性:滤波,子采样,比特分配,向量量化;
(3)混合编码
JBIG,H.261,JPEG,MPEG等技术标准。
2. JPEG压缩编码原理
JPEG是一个应用广泛的静态图像数据压缩标准,其中包含两种压缩算法(DCT和DPCM),并考虑了人眼的视觉特性,在量化和无损压缩编码方面综合权衡,达到较大的压缩比(25:1以上)。JPEG既适用于灰度图像也适用于彩色图像。其中最常用的是基于DCT变换的顺序式模式,又称为基本系统。JPEG 的压缩编码大致分成三个步骤:
(1)使用正向离散余弦变换(forward discrete cosine transform,FDCT)把空间域表示的图变换成频率域表示的图。
(2)使用加权函数对DCT系数进行量化,该加权函数使得压缩效果对于人的视觉系统最佳。
(3)使用霍夫曼可变字长编码器对量化系数进行编码。
3.离散余弦变换(DCT)变换原理
离散余弦变换(DCT)是一种实数域变换,其变换核为实数余弦函数,图像处理运用的是二维离散余弦变换,对图像进行DCT,可以使得图像的重要可视信息都集中在DCT的一小部分系数中。 经DCT 变换之后,为变换矩阵。是直流分量,其他为交流分量。变换系数矩阵为正交阵。
这里我们只讨论两个N相等的情况,即图像为方形(行列数相等),在实际应用中对不是方阵的数据都应先补齐再进行变换的。
4.图象质量评价
保真度准则是压缩后图象质量评价的标准。
客观保真度准则:原图象和压缩图象之间的均方根误差或压缩后图象的均方根信噪比。
主观保真度准则:极好、良好、通过、勉强、低劣、不能用。
客观保真度准则:新旧图像的均方误差;峰值信噪比
三、实验内容及步骤
本实验主要采用MATLAB程序实现DCT变换及JPEG压缩编码。
读取一张大小为512x512(或256x256)的灰度图像(或彩色图像,并将其灰度化),分别按照以下要求进行完成实验内容。
1.
把图像分解成若干个8x8的子块;
对每个子块分别作DCT变换;
保留变换后的部分系数(如原点及周围的10个系数),其余系数全部清零;
需处理后的系数使用逆DCT变换,得到新的图像,观察图片变化。
参考程序:
I=imread(‘cameraman.tif’); I=im2double(I); T=dctmtx(8); B=blkproc(I,[8 8],‘P1xP2’,T,T’); mask=[1 1 1 1 0 0 0 0 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]; B2=blkproc(B,[8 8],‘P1.x’,mask); I2=blkproc(B2,[8 8],'P1x*P2’,T’,T); imshow(I);title(‘原始图像’); figure; imshow(I2);title(‘压缩后的图像’); D=I2-I; MSE=sum(D(😃.D(😃)/numel(I); %均方误差 PSNR=10log10(255^2/MSE); %峰值信噪比
2.
把图像分解成若干个8x8的子块;
对每个子块分别作DCT变换;
保留变换后的直流分量,将交流分量全部清零;
使用逆DCT变换,得到新的图像,观察图片变化,并与1中的实验结果进行比较,给出结论。
因为2中的实验,只保留了直流分量,也即左上角的(1,1)那个信息值,其他的都被置位0,因此信息量保存的较少
3.
直接对整张原图像做DCT变换;
保留直流分量,交流分量全部清零;
再用逆DCT变换,得到新的图像,观察图片变化,注意与2中的实验结果进行比较说明。
由于3是对整个图像做离散余弦变换并只保留直流分量,导致整体的信息量呈现交叉,而2中是先分块再保留直流分量,一定程度上,对图像信息量保留的更多
4.
1)直接对整张原图像做DCT变换;
2)根据变换后的矩阵特征,自行选择保留有限个(例如前m行n列 )交流分量的个数;
3)直到逆DCT变换以后的图像可以达到可观察的效果,与3和1中的实验结果作比较说明。
与3比较而言,因为4保留了部分交流分量,信息量较多,因此在逆变换后,效果比3要好。
与1比较而言,因为4没有进行图像分割,所以看起来比1要更加光滑
四、撰写实验报告填写:
1.给出所有程序、处理后的图像以及评价指标数据(均方误差以及峰值信噪比)。
2.根据不同处理后的图像以及统计指标数值总结频谱系数的保留个数与压缩效果的关系。(同为分块处理,保留系数的多少与MSE和PSNR的关系;保留相同的系数个数,分块和不分块处理得到的图像有什么视觉上的区别。)
相同系数的情况下,不分块的图像比分块的图像从视觉上看起来更加光滑
3.总结本次实验中出现的问题及解决方案。
五、代码展示
%% 1 I=imread('cameraman.tif'); I=im2double(I); T=dctmtx(8); B=blkproc(I,[8 8],'P1*x*P2',T,T'); mask=[1 1 1 1 0 0 0 0 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]; B2=blkproc(B,[8 8],'P1.*x',mask); I2=blkproc(B2,[8 8],'P1*x*P2',T',T); imshow(I);title('原始图像'); figure; imshow(I2);title('压缩后的图像'); D=I2-I; MSE=sum(D(:).*D(:))/numel(I); %均方误差 PSNR=10*log10(255^2/MSE); %峰值信噪比 %% 2 I=imread('cameraman.tif'); I=im2double(I); T=dctmtx(8); B=blkproc(I,[8 8],'P1*x*P2',T,T'); mask=[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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]; B2=blkproc(B,[8 8],'P1.*x',mask); I2=blkproc(B2,[8 8],'P1*x*P2',T',T); imshow(I);title('原始图像'); figure; imshow(I2);title('压缩后的图像'); D=I2-I; MSE=sum(D(:).*D(:))/numel(I); %均方误差 PSNR=10*log10(255^2/MSE); %峰值信噪比 %% 3 I=imread('cameraman.tif'); I=im2double(I); B = dct2(I) B(2:256,2:256)=0; I1 = idct2(B); imshow(I);title('原始图像'); figure; imshow(I1,[]);title('压缩后的图像'); %% 4 I=imread('cameraman.tif'); I=im2double(I); B = dct2(I) % for i=1:256 % for j = 1:256 % if i >= 4 && j >= 4 % B(i,j) = 0; % end % end % end B(1,5:256)=0; B(2,4:256)=0; B(3,3:256)=0; B(4,2:256)=0; B(5:end,:)=0; I1 = idct2(B); imshow(I);title('原始图像'); figure; imshow(I1,[]);title('压缩后的图像');
六、实验截图