实验三基于DCT的数字图像压缩及Matlab实现2011通一刘一强一、实验原理图像压缩基本原理及模型(一)图像压缩基本原理图像数据压缩的目的是在满足一定图像质量的条件下,用尽可能少的比特数来表示原始图像,以提高图像传输的效率和减少图像存储的容量,在信息论中称为信源编码。图像压缩是通过删除图像数据中冗余的或者不必要的部分来减小图像数据量的技术,压缩过程就是编码过程,解压缩过程就是解码过程。压缩技术分为无损压缩和有损压缩两大类,前者在解码时可以精确地恢复原图像,没有任何损失;后者在解码时只能近似原图像,不能无失真地恢复原图像。假设有一个无记忆的信源,它产生的消息为{ai},1≤i≤N,其出现的概率是已知的,记为P(ai)。则其信息量定义为:由此可见一个消息出现的可能性越小,其信息量就越多,其出现对信息的贡献量越大,反之亦然。信源的平均信息量称为“熵”(entropy),可以表示为:对上式取以2为底的对数时,单位为比特(bits):根据香农(Shannon)无噪声编码定理,对于熵为H的信号源,对其进行无失真编码所可能达到的最低比特数为,这里为一任意小的正数,因此可能达到的最大压缩比为:其中B是原始图像的平均比特率。在图像压缩中,压缩比是一个重要的衡量指标。可以定义压缩比为:(二)图像压缩的基本模型图像编码包括两个阶段,前一个阶段就是利用预测模型或正交模型对图像信号进行变换;后一个阶段是利用已变换信号的统计特性,对其分配适当的代码来进行编码传输。编码器与解码器的结构分别如图(a)、(b)。在发送端,输入的原始图像首先经过DCT变换后,其低频分量都集中在左上角,高频分量分布在右下角(DCT变换实际上是空间域的低通滤波器)。由于该低频分量包含了图像的主要信息,而高频分量与之相比就不那么重要了,所以可以忽略高频分量,从而达到压缩的目的。将高频分量去掉就要用到量化,这是产生信息损失的根源。“量化”的主要任务是用有限个离散电平来近似表达已抽取出的信息。在此采用均匀量化,通过改变程序中的量化因子Q的值以得到不同压缩比的图像。Huffman编码时,首先对经DCT变换及量化后的图像收据扫描一遍,计算出各种像素出现的概率;然后按概率的大小指定不同长度的唯一码字,由此得到一张Huffman表。编码后的图像记录的是每个像素的码字,而码字与量化后像素值的对应关系记录在码表中。生成的一维字符矩阵即为实际中要传输的序列,压缩后的图像数据在信道中进行传输。在接收端,接收到的压缩图像数据首先经过Huffman译码,通过搜索已生成的Huffman表,根据码字与量化后像素值的对应关系,搜索出与码字对应的像素值,并转换为二维矩阵。反量化时将以上二维矩阵中的每一个像素值乘以量化因子Q。最后通过DCT反变换得到重建图像。离散余弦变换(DCT)当前处于信息高速流通时代,要求在保证质量的前提下,以较小的空间存储图像和较小的比特率传输图像,这就需要采用各种图像压缩编码技术来实现。DCT变换是最小均方误差条件得出的次最佳正交变换,且已经获得广泛的应用,并已经成为许多图像编码国际标准的核心。离散余弦变换的变换核是余弦函数,计算速度较快,有利于图像压缩和其他处理。在大多数情况下,DCT用于图像的压缩操作中。JPEG图像格式的压缩算法采用的是DCT。(一)DCT的定义DCT变换利用傅立叶变换的性质,采用图像边界褶翻将图像变换为偶函数形式,然后对图像进行二维傅立叶变换,变换后仅包含余弦项,所以称之为离散余弦变换。离散余弦变换的概念1.一维离散余弦正反变换的公式2.二维离散余弦正反变换的公式正变换公式:3.二维离散余弦变换的简化x,y为空间域采样值。通常,数字图像用像素方阵表示,即M=N,在这种情况下,二维离散余弦的正反变换可简化为:(二)DCT和图像压缩DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余。变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。图像经DCT变换以后,DCT系数之间的相关性已经很小,而且大部分能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。为此,发送者首先将输入图像分解为8×8或16×16的块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换,最后将操作完成后所有的块拼接起来构成一幅单一的图像。对于一般的图像而言,大多数DCT系数值都接近于0,可以去掉这些系数而不会对重建图像的质量产生重大影响。因此,利用DCT进行图像压缩确实可以节约大量的存储空间。DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。二、实验目的:掌握基于DCT变换的图像压缩的基本原理及其实现步骤;通过使用MATLAB,对同一幅原始图像进行压缩,进一步掌握DCT和图像压缩。三、实验要求:1、学生在实验操作过程中自己动手独立完成,2人为1组。2、上机过程中由指导老师检查结果后方可做其他内容。3、完成实验报告:按照实验的每个题目的具体要求完成4、报告的格式:课程设计名称(一)介绍(课程设计的目的和要求等内容)(二)基本原理或方法(三)结果与结果分析(四)参考文献(五)源程序清单(要有功能性的注释)(六)总结设计体会和问题的讨论及感想四、实验内容:离散余弦变换的Matlab实现利用余弦变换进行图像压缩,首先要将输入图像分解成8×8或16×16的块,然后对每个块进行二维离散余弦变换,最后将变换得到的量化DCT系数进行编码和传送,形成压缩后的图像格式。解码时对每个块进行二维DCT反变换,最后在将反变换后的块组合成一副图像。对于通常的图像来说,大多数的DCT系数的值非常接近于0。如果舍弃这些接近于0的值,在重构图像时并不会带来图像画面质量的显著下降。所以,利用DCT进行图像压缩可以节约大量的存储空间。压缩应该在最合理的近似原图像的情况下使用最少的系数,使用系数的多少也决定了压缩比的大小。按照以上的方法,使用MATLAB,将一幅图像分成8×8的块使用二维离散余弦变换进行压缩(压缩比为16:1,8:1),给出实验仿真结果,要求显示压缩前后的图像,并且计算压缩前后图像的均方误差MSE。改变压缩比为8:1,再如前所做,比较不同之处。MATLAB图像处理工具箱中提供的二维DCT变换及DCT反变换函数如下。1.dct2dct2实现图像的二维离散余弦变换,其语法格式为:(1)B=dct2(A)返回图像A的二维离散余弦变换值,其大小与A相同,且各元素为离散余弦变换的系数B(k1,k2)。(2)B=dct2(A,m,n)或B=dct2(A,[m,n])如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至m×n。如果m和n比图像A小,则进行变换之前,将图像A剪切。2.idct2idct2可以实现图像的二维离散余弦反变换,其语法格式为:B=idct2(A);B=idct2(A,m,n)或B=idct2(A,[m,n])。3.可将二维DCT转化为一维DCT来计算。D=dctmtx(N)举例说明二维余弦正反变换在MATLAB中的实现:%装入图像RGB=imread('autumn.tif');I=rgb2gray(RGB);%画出图像imshow(I);figure(2);%进行余弦变换J=dct2(I);imshow(log(abs(J)),[]),colormap(jet(64)),colorbar;figure(3);J(abs(J)10)=0;%进行余弦反变换K=idct2(J)/255;imshow(K);原始图像余弦变换系数余弦反变换恢复图像编程可能用到的函数:imreadim2doubledctmtx(8)blkproc(I,[88],'P1*x*P2',T,T')imshow(I)title('原始图像')figure;imshow(I2)title('压缩后的图像')注意:在理解课程设计内容之后,在动手设计之前,建议同学们先做几件事:1.在MATLAB的Demos中,浏览ImageProcessing/ImageTransforms/DCT的演示。2.使用helpimages命令,了解图像处理工具箱的版本和它支持的所有图像处理函数。3.同学们在设计过程中遇到不知道函数的用法,多借助help命令。I=imread('LENA.TIF');I=im2double(I);%图像存储类型转换T=dctmtx(8);%离散余弦变换矩阵B=blkproc(I,[88],'P1*x*P2',T,T');%对原图像进行DCT变换mask=[1111000011100000110000001000000000000000000000000000000000000000];B2=blkproc(B,[88],'P1.*x',mask);%数据压缩,丢弃右下角高频数据I2=blkproc(B2,[88],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像subplot(2,2,1);imshow(I)title('压缩前的图像')subplot(2,2,2);imshow(I2)title('压缩后的图像')InitialImage=imread('LENA.TIF');rat=1./8;%设置压缩比InitialImage=double(InitialImage)/255;%设置系数保留个数T=dctmtx(8);DCTCoe=blkproc(InitialImage,[88],'P1*x*P2',T,T');%计算离散余弦变换分块处理CoeVar=im2col(DCTCoe,[88],'distinct');Coe=CoeVar;%得到DCT系数矩阵[Y,Ind]=sort(CoeVar);[m,n]=size(CoeVar);%求出DCT系数矩阵的大小Snum=64-64*rat;%按照压缩比保留系数fori=1:nCoe(Ind(1:Snum),i)=0;endB2=col2im(Coe,[88],[256256],'distinct');%重新排列系数块I2=blkproc(B2,[88],'P1*x*P2',T',T);%进行反余弦变换subplot(2,2,3);imshow(I2)title('压缩比8:1')%计算归一化图像的均方误差error=InitialImage.^2-I2.^2;%计算归一化图象的均方误差MSE=sum(error(:))/prod(size(I2))I=imread('LENA.TIF');I=im2double(I);%图像存储类型转换T=dctmtx(16);%离散余弦变换矩阵B=blkproc(I,[1616],'P1*x*P2',T,T');%对原图像进行DCT变换mask=[1111111100000000111111100000000011111100000000001111100000000000111100000000000011100000000000001100000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000];B2=blkproc(B,[1616],'P1.*x',mask);%数据压缩,丢弃右下角