数字图像的冗余包括空间冗余、结构冗余、知识冗余和视觉冗余等空间冗余是指规则物体和规则背景的表面物理特性都具有相关性,数字化后表现为数字冗余例如:某图片的画面中有一个规则物体,其表面颜色均匀,各部分的亮度、饱和度相近,把该图片作数字化处理,生成位图后,很大数量的相邻像素的数据是完全一样或十分接近的,完全一样的数据当然可以压缩,而十分接近的数据也可以压缩,因为恢复后人亦分辨不出它与原图有什么区别,这种压缩就是对空间冗余的压缩再比如视觉冗余,视觉系统对于图像场的注意是非均匀和非线性的,视觉系统不是对图像的任何变化都能感知,因此对图像进行压缩后人眼也并不会非常敏锐地察觉画面内容有所删减所谓的图像压缩编码技术就是对要处理的图像数据按一定的规则进行变换和组合, 从而达到以尽可能少的数据流(代码)来表示尽可能多的数据信息在众多的图像压缩编码标准中,JPEG(Joint Photographic Experts Group)格式是一种称为联合图像专家组的图像压缩格式,它适用于不同类型、不同分辨率的彩色和黑白静止图像而在JPEG图像压缩算法中,有一种是以离散余弦变换(DCT,Discrete Cosine Transform)为基础的有损压缩算法,是为本论文的主要研究对象。
DCT变换利用傅立叶变换的性质采用图像边界褶翻将像变换为偶函数形式,然后对图像进行二维傅立叶变换,变换后仅包含余弦项,所以称之为离散余弦变换DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的图像经DCT变换以后,DCT系数之间的相关性就会变小而且大部分能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好为此,发送者首先将输入图像分解为8*8或16*16块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换最后将操作完成后所有的块拼接起来构成一幅单一的图像对于一般的图像而言,大多数DCT系数值都接近于0,所以去掉这些系数不会对重建图像的质量产生较大影响。
因此,利用DCT进行图像压缩确实可以节约大量的存储空间在实验中,先将输入的原始图像分为8*8块,然后再对每个块进行二维DCT变换1.1.1 DCT编码DCT编码属于正交变换编码这类算法通常是将空间域上的图像经过正交变换映射到系数空间,使变换后的系数直接相关性降低图像变换本身并不能压缩数据,但变换后图像大部分能量集中到了少数几个变换系数上,再采用适当的量化和熵编码便可以有效地压缩图像信息论的研究表明,正交变换不改变信源的熵值,变换前后图像的信息量并无损失,完全可以通过反变换得到原来的图像值但图像经过正交变换后,把原来分散在原空间的图像数据在新的坐标空间中得到集中,对于大多数图像而言,大量的变换系数很小,只要删除接近于0的系数,并对较小的系数进行粗量化,而保留包含图像主要信息的系数,以此进行压缩编码在重建图像进行解码(逆变换)时,所损失的将是些不重要的信息,几乎不会引起图像失真,图像的变换编码就是利用这些来压缩图像并得到很高的压缩比由于图像可看成二维数据矩阵,所以在图像编码中多采用二维正交变换方式,然而其正交变换的计算量太大,所以在实用中变换编码并不是对整幅图像进行变换和编码,而是将图像分成若干个n×n的子图像分别处理。
这是因为小块图像的变换计算比较容易,而且距离较远的像素之间的相关性比距离较近的像素之间的相关性要小实践证明4×4、8×8、16×16适合图像压缩,这是因为:① 如果子图像尺寸取得太小,虽然计算速度快,实现简单,但压缩能力有限;② 如果子图像尺寸取得太大,虽然去相关效果好,因为DCT等正弦类变换均渐近最佳化,同时也渐近饱和,犹豫图像本身的相关性很小,反而使得压缩效果不明显,并且增加了计算的复杂度1.1.2 变换系数的选择对子图像经过变换后,保留变换后的哪些系数用作编码和传输将直接影响信号恢复的质量,变换系数的选择原则是保留能量集中、方差大的系数系数选择通常有变换变换区域编码和变换阈值编码两种方法1) 变换区域编码变换区域编码是对设定形状的区域内的变换系数进行量化编码区域外的系数被舍去一般来说,变换后的系数值较大的会集中在区域的左上部,即低频分量都集中在左上部保留的也是这一部分其他部分的系数被舍去,在恢复信号时对它们补0这样以来,由于保留了大部分图像信号能量,在恢复信号后,其质量不会产生显著变化变换区域编码的明显缺陷是高频分量完全丢失反应在恢复图像上将是轮廓及细节模糊为克服这一缺陷,可预先设定几个区域,根据实际系数分布自动选取能力最大的区域。
2) 变换阈值编码变换阈值编码是根据实际情况设定某一大小幅度的阈值,若变换系数超过该阈值,则保留这些系数进行编码传输,其余补0.这样,多数低频成分被编码输出,而且少数超过阈值的高频成分也将被保留下来进行编码输出这在一定程度上弥补了区域变换法的不足但也有两个问题需要解决:一是被保留下来的系数在矩阵中的位置不是不确定的,因此需增加地质编码比特数,其码率相对要高一些;二是阈值需要通过实验来确定,当然也可以根据总比特数进行自适应阈值选择,但需要一定技术,将增加编码的复杂程度1.1.3 基于DCT编码的JPEG编码压缩基于DCT编码的JPEG编码压缩过程框图,如图2-1所示压缩数据原始图像数据分成8*8的小块量化器DCT变换熵编码器码表量化表图2-1 基于DCT编码的JPEG压缩过程简化图上图是基于DCT变换的图像压缩编码的压缩过程,解压缩与上图的过程相反在编码过程中,首先将输入图像分解为8×8大小的数据块,然后用正向二维DCT把每个块转变成64个DCT系数值,其中左上角第一个数值是直流(DC)系数,即8×8空域图像子块的平均值,其余的63个是交流(AC)系数,接下来对DCT系数进行量化,最后将变换得到的量化的DCT系数进行编码和传送,这样就完成了图像的压缩过程。
在解码过程中,形成压缩后的图像格式,先对已编码的量子化的DCT系数进行解码,然后求逆量化并把DCT系数转化为8×8样本像块(使用二维DCT反变换),最后将操作完成后的块组合成一个单一的图像这样就完成了图像的解压过程1.2 二维离散余弦变换图像数据压缩的目的是在满足一定图像质量的条件下,用尽可能少的比特数来表示原始图像,以提高图像传输的效率和减少图像存储的容量,在信息论中称为信源编码图像压缩是通过删除图像数据中冗余的或者不必要的部分来减小图像数据量的技术,压缩过程就是编码过程,解压缩过程就是解码过程 假设有一个无记忆的信源,它产生的消息为,,其出现的概率是已知的, 记为则其信息量定义为: { (2-1)由此可见一个消息出现的可能性越小,其信息量就越多,其出现对信息的贡献量越大,反之亦然 信源的平均信息量称为“熵”,可以表示为: (2-2)对上式取以2 为底的对数时,单位为比特(bits): (2-3)在图像压缩中,压缩比是一个重要的衡量指标可以定义压缩比为: = C=原始数据的平均比特率(B)/压缩数据的平均比特率(H)DCT变换后系数的量化是引起失真的主要原因,压缩效果与图像内容本身有较大的关系。
在傅里叶级数展开式中,如果被展开的函数是实偶函数,那么,其傅里叶技术中只包含余弦项,在将其离散化由此可导出余弦变换,或称之为离散余弦变换(DCT,Discrete Cosine Transform) (2-)式中,二维离散余弦逆变换公式为 (2-)式中, JPEG采用的是8×8大小的子块的二维离散余弦变换在编码器的输入端,把原始图像顺序地分割成一系列8×8的子块,子块的数值在-128到127之间采用余弦变换获得64个变换系数变换公式,如式(2-)所示 (2-)式中, 在MATLAB 仿真实现中, 主要是采用二维DCT变换的矩阵式定义来实现的,矩阵式定义可以表示为: (2-)其中是空间数据阵列, 是变换系数阵列, 是变换矩阵, 是的转置 The basis functions of the DCT of 64X64 an Image1.2.1 DCT系数的量化量化是对经过DCT变换后的频率系数进行量化,其目的是减小非“0”系数的幅度以及增加“0”值系数的数目,它是图像质量下降的最主要原因量化过程定义了一种从实数到整数映射的方法,它是通过降低DCT变换产生的数值结果的精确度,来减少存储变换后的系数需要的比特数。
定义量化公式为: (2-)其中,为量化前的DCT系数,为量化后的DCT系数,而为量化步长,表示取整对于基于DCT的JPEG图像压缩编码算法,量化步距是按照系数所在的位置和每种颜色分量的色调值来确定因为人眼对亮度信号比对色差信号更敏感,因此使用了表2-1所示的量化表此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此表中的左上角的量化步距要比右下角的量化步距小亮度和色度因为代表的图像的信息量不同,亮度代表了图像的低频分量,色度代表了图像的高频分量,要分别对亮度和色度进行量化,所以量化表也是不同的量化就是用DCT变换后的系数除以量化表中想对应的量化阶后四舍五入取整由于量化表中,左上角的数值比较小,而右下角的数值比较大,因而能够起到保持低频分量,抑制高频分量的作用JPEG压缩色度和亮度量化表如表2-1所示表2-1 JPEG压缩色度和亮度量化表亮度量化表色度量化表161110162440516117182447999999991212141926586055182126669999999914131624405769562426569999999999141722295187806247669999999999991822375668109103779999999999999999243555648110411392999999999999999949647887103121120101999999999999999979929598112100103999999999999999999量化会产生误差,上图是综合大量的图像测试的实验结果,对于大部分图像都有很好的结果。
表中可以看出,高频部分对应的量化值大,目的就是将高频部分编程接近于0,以便以后处理JPEG可以在压缩比和图像质量间作取舍方法就是改变量化值如果量化值放大一倍,则有更多的系数量化为0,提高了压缩比在本课题研究中,用于DCT变换的图像为灰度图像,故只考虑亮度即可1.2.1 量化系数的编排经过DCT变换后,低频分量集中在左上角,其中F(0,0)(即第一行第一列元素)代表了直流(DC)系数,即8×8子块的平均值,要对它单独编码由于两个相邻的8×8子块的DC系数相差很小,所以对它们采用差分编码DPCM,可以提高压缩比,也就是说对相邻的子块DC系数的差值进行编码8×8的其它63个元素是交流(AC)系数,采用行程编码所以量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排DCT变换后低频分量多呈圆形辐射状向高频率衰减,因此可以看成按Z字形衰减因此,量化系数按Z字形扫描读数,这样就把一个8×8的矩阵变成一个1×64的矢量,频率较低的系数放在矢量的顶部量化后的DCT系数的编排如图2-2所示图2-2 量化DCT系数的编排量化后的DCT系数的序号如表2-2所示。
表2-2 量化DCT系数的序号01561415272824713162629423812172530414391118243140445310192332394552542022333846515560213437475056596135364849575862631.3 2D-DCT与2D-FFT的比较这两种运算体现在程序中,分别调用了1D-FFT和1D-DCT变换,而1D-DCT又是以1D-FFT为核心的 设计的程序是以频率抽取的基2FFT算法为基本理论的,因此蝶形运算后,需要进行排序,根据理论推算应该采取倒位序的方法,对于一个N=8的蝶形运算,其结果下标排列应是:0,4,2,6,1,5,3,7倒位序后回到了自然排列顺序0,1,2,3,4,5,6,7一维快速傅立叶正反变换包含于一个核心子程序中,所以在求其反变换时,先将X(K)取共轭变换,在将X(K)的虚部乘以-1,然后就可以直接访问FFT的子程序,最后再对运算结果取一次共轭变换并乘以常数1/N即可得到x(n)值这种IFFT算法可以完全不改动FFT的程序在进行二维的FFT变换时,可把二维的FFT变换变成一维后直接调用FFT子程序。
因为,二维离散傅立叶变换(DFT)处理图像的时间比较长,其处理结果和FFT处理结果相同;FFT运算量非常大,实时性差,处理图像时没有实用性傅里叶变换的不足之处在于子图像的变换系数在边界处的不连续而造成恢复的子图像在其边界也不连续,于是由于各恢复子图像构成的整幅图像将呈现隐约可见的子图像的方块状结构,影响图像质量 图2-3 2D-FFT的变换谱 图2-4 2D-DCT的变换谱 可以看出,原图像经FFT变换后频域能的量主要集中在两条对角线附近;DCT变换后变换域的能量主要集中在低频分量附近(即左上角)图像压缩中的DCT编码正是利用DCT变换的这一特性,在对二维图像进行DCT变换后,只对变换域低频分量进行编码,抛弃部分高频分量,减少携带的信息量,从而实现对图像的有损压缩编码 DCT 变换与FFT 变换类似,但DCT 变换可以使用较少的频谱系数来表示被变换的图像数据在接收端,用逆变换IDCT 将这些频谱系数恢复成的图像数据,与变换前的数据更接近因此在图像压缩算法中常用DCT 变换实验结果及分析离散余弦变换DCT 的MATLAB 实现有两种方法,一种是基于FFT 的快速算法,这是通过MATLAB工具箱提供的dct2 函数实现的;另一种是DCT 变换矩阵方法。
变换矩阵方法非常适合做 8*8 或 16*16 的图像块的DCT 变换,工具箱提供了dctmtx 函数来计算变换矩阵方法1:该方法出发点是对整幅图像进行DCT变换,主要应用MATLAB的图像处理工具箱中的基于FFT的有大量输入的快速算法进行处理的dct2函数: 具体程序实现如下:A=imread('D:\rabit\rabit.bmp');I=rgb2gray(A);DCT=dct2(I); %余弦变化DCT(abs(DCT)<10)=0; %把变换矩阵中小于10的值置换为0,然后用idct2重构IDCT=idct2(DCT);subplot(2,2,1),imshow(I);title('灰度图像')subplot(2,2,2),imshow(IDCT,[0 255]);title('反余弦变换恢复图')subplot(2,2,3),imshow(DCT);title('DCT变换')subplot(2,2,4),imshow(log(abs(DCT)),[]);title('余弦变换系数');figure,mesh(DCT);title('变换谱三维彩色图') (a) (b) (c) (d) (e) 图4-1 DCT变换从(b)图,“反余弦变换恢复图”中,可以看出,该方法偏重图像的视觉效果,按照这种方法重构的图像与原图几乎没有差别。
从(c) 图,“DCT变换”图中可以看出,DCT谱集中在左上部,只有左上部分不为零值 通过观察(e)图DCT谱的彩色三维图也可得到这一结论需要说明的是,对于本课题选取的这幅图像而言,其低频信息比较多,分布扩散至右下部因此并未像传统使用的Lena图一样,仅有少部分有效信息集中在左上角DCT变换系数如下:图4-2 DCT变换系数方法2:该方法的出发点是先将图像分解为8*8或16*16个数据块,然后分别对分解后的每个数据小方块进行DCT变换,主要应用MATLAB的图像处理工具箱中dctmtx函数返回DCT变换矩阵,而后进行相关处理样本程序实现如下:A=imread('D:\rabit\rabit.bmp');I=rgb2gray(A);I=im2double(I);%将图像转换为双精度格式T=dctmtx(8);%返回一个8*8的DCT变换矩阵B=blkproc(I,[8 8],'P1*x*P2',T,T');%对原图像进行DCT变换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];%保留了10个DCT系数重构图像B2=blkproc(B,[8 8],'P1.*x',mask);%数据压缩,丢弃右下角高频数据I2=blkproc(B2,[8 8],'P1*x*P2',T',T);%进行DCT反变换,得到压缩后的图像subplot(1,2,1),imshow(I)title('原始图像')subplot(1,2,2),imshow(I2)title('压缩图像1')disp('压缩后图像I2的大小');whos('I2');disp('压缩前图像A的大小');whos('A');disp('压缩后图像I的大小');whos('I'); (a) (b) (c) (d) (e) (f)图4-3 基于DCT的图像压缩对于(b)图“压缩图像1”,仿真中仅保留了3个DCT系数,约占5%,从结果来看,图像压缩的效果出现了“块”失真。
并且随着量化系数的进一步减少,失真情况会越来越严重,这说明图像信息丢失严重对于(c)图“压缩图像2”,仿真中保留了10个DCT系数,占15%,比较原图和重构图像,可以发现:在抛弃85%的系数后,重构图像基本上恢复了原图像的信息,可以比较清楚地辨清亮度上的差异,大部分的信息都很好的保留下来然而细节部分,即边缘部分,也就是高频分量所携带的信息,并没有很好地重现出来因为我们把高频分量通过mask表中的0值控制全部舍弃了而且从方法1中的“DCT变换”一图中,我们可以清楚地看到,对于本图来说,非0值并非很好地集中在左上部很小的部分,而是分布在几乎85%的区域因此,当我们只取了左上部15%的DCT系数时,当然不能很好地恢复剩余大部分的细节当然,在采用这种方法来实现压缩算法时,可以通过修改mask 变量中的DCT系数来更好地比较仿真结果在(d)图“压缩图像3”中,则是对半取舍DCT系数较之(c)图的效果又有了明显的进步,边缘细节信息已经得到了很好的保留和重现在(e)图“压缩图像4”中,便是把mask中的DCT系数取85%地进行了保留,而只舍去了10个右下角的DCT系数可以看出,该图中的细节信息较之(d)图又有了更好的体现,边缘等部分轮廓比较清晰,与之前的压缩图像进行对比,图像的恢复重现效果明显好了很多。
而在(f)图“压缩图像5”中,则是把“压缩图像1”中的DCT系数的取舍完全颠倒过来,即,“压缩图像2”中,左上部分取1的系数变为取0,同时右下部分取为0的DCT系数则变为取1保留从低频和高频的角度来说,即是将承载了灰度图像很大部分重要亮度信息的低频部分舍弃,而仅仅将右下角的承载边缘细节信息的高频部分予以保留效果如“压缩图像5”所示,我们可以明显看到仅仅有图像的边缘信息显示,而原始图像最重要的信息则没有保留和显现而当把图像分为16*16数据块进行DCT变换时,算法的复杂度急剧上升,但采用较大的子块可以明显减少图像分块效应实验结果如下:(程序见附录五) (a) (b) (c) (d) (e) (f) 图4-4 16*16的DCT图像压缩 (b)图“压缩图像1”是16*16子块模式中仅保留了6个左上角DCT系数的效果,可以看出明显的块失真效果c)图“压缩图像2”是保留了10个DCT系数,效果与8*8子块模式中保留3个DCT系数的效果差不多,但要稍微好一点。
(d)图“压缩图像3”中保留了36个DCT系数,约占14%,此时与8*8子块模式中的保留了15%的DCT系数的“压缩图像2”效果相近,并且稍微更清晰一些 (e)图保留了3/8的DCT系数,而(f)图“压缩图像5”中保留了50%的DCT系数,和8*8子块模式中同样对半取舍系数的(d)图进行对比,可以看出16*16子块的效果要更好一些 由此可见,将图像划分为更小的数据块进行DCT变换和压缩的效果更好,然而复杂度上升当图像压缩比增大时,也即压缩效率减小时,图像的质量也将降低,人们可以根据需要的图像的质量来规定压缩比的大小。