图像压缩技术(压缩算法)分析基于离散余弦变换的JPEG图像压缩算法分析第二组:吕昌伟司庆龙赵甜冯明洋图像压缩技术(压缩算法)分析Q1:为什么要进行图像压缩处理?图像数据量举例:【存储】对于每秒25帧,分辨率为512X512,每一个像素用8比特来表示的视频图像视频图像数据量:512X512X8X25bit/s≈150Mbit/s≈19Mbyte/s≈70,000MB/hr家用VCD存储容量:650M,74Min对照70G/hr大约需要压缩100倍【传输】Cable1.5-10MbsATM最大可达34MbsMobilcommunication10Kbs--1Mbs(移动通信网络)图像压缩的目的:在可能的情况下尽量减少图像数据的尺寸,以便于传输、存储、管理、处理和应用。Q2:为什么图像可以压缩?(有没有压缩的可行性?)1、图像中的数据冗余:空间冗余时间冗余信息熵冗余结构冗余知识冗余视觉冗余其它冗余2、图像在一些情况下允许一定程度的失真图像压缩技术(压缩算法)分析三、图像压缩编码的分类1、从图像信息角度对编码分类信息保持编码(依据香农的信息论)保真度编码(允许失真度不同,根据它的应用场合不同)特征抽取2、从图像编码方法对编码分类平均信息方法:利用图像的统计特征分配码字长度,达到压缩目的,如Huffman,S-F等预测方法:图像信息在空间上具有一些冗余性(可利用一维的预测编码)时间上(可以利用时间冗余性针尖预测)变换方法:小波变换离散余弦变换方法频带编码阈值编码多维技术自适应方法像素编码:行程编码等值线编码位平面编码等其它:混合编码二值/图形编码彩色图像编码矢量量化金字塔编码基于知识的编码图像压缩技术(压缩算法)分析四、JPEG图像基础JPEG是联合图象专家组(JointPictureExpertGroup)的英文缩写,是国际标准化组织(ISO)和CCITT联合制定的静态图象的压缩编码标准。与相同图象质量的其它常用文件格式(如GIF,TIFF,PCX)相比,JPEG是目前静态图象中压缩比最高的。我们给出具体的数据来对比一下。图Clouds.bmp,原图大小为640*480,256色。用工具SEA(version1.3)将其分别转成24位色BMP、24位色JPEG、GIF(只能转成256色)压缩格式、24位色TIFF压缩格式、24位色TGA压缩格式。得到的文件大小(以字节为单位)分别为:921,65417,707177,152923,044768,136。可见JPEG比其它几种压缩比要高得多,而图象质量都差不多(JPEG处理的颜色只有真彩和灰度图)。正是由于JPEG的高压缩比,使得它广泛地应用于多媒体和网络程序中,例如HTML语法中选用的图象格式之一就是JPEG(另一种是GIF)。这是显然的,因为网络的带宽非常宝贵,选用一种高压缩比的文件格式是十分必要的。图像压缩技术(压缩算法)分析JPEG专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。压缩算法:(1)有损的离散余弦变换DCT(DiscreteCosineTransform)(2)无损的预测压缩技术;熵编码方法:(1)Huffman编码;(2)算术编码;编码模式:(1)基于DCT的顺序模式:编码、解码通过一次扫描完成;(2)基于DCT的渐进模式:编码、解码需要多次扫描完成,扫描效果由粗到精,逐级递增;(3)无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;(4)层次模式:图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据做解码,放弃高分辨率信息;在实际应用中,JPEG图像编码算法使用的大多是离散余弦变换、Huffman编码、顺序编码模式。这样的方式,被人们称为JPEG的基本系统。这里介绍的JPEG编码算法的流程,也是针对基本系统而言。基本系统的JPEG压缩编码算法一共分为11个步骤:颜色模式转换、采样、分块、离散余弦变换(DCT)、Zigzag扫描排序、量化、DC系数的差分脉冲调制编码、DC系数的中间格式计算、AC系数的游程长度编码、AC系数的中间格式计算、熵编码。下面,将一一介绍这11个步骤的详细原理和计算过程。四、JPEG图像基础图像压缩技术(压缩算法)分析四、JPEG图像压缩过程分析JPEG压缩的编解码互逆过程:图像压缩技术(压缩算法)分析四、JPEG图像压缩过程分析1、颜色模式转换JPEG采用的是YCrCb颜色空间,而BMP采用的是RGB颜色空间,要想对BMP图片进行压缩,首先需要进行颜色空间的转换。YCrCb颜色空间中,Y代表亮度,Cr,Cb则代表色度和饱和度(也有人将Cb,Cr两者统称为色度),三者通常以Y,U,V来表示,即用U代表Cb,用V代表Cr。RGB和YCrCb之间的转换关系如下所示:Y=0.299R+0.587G+0.114BCb=-0.1687R-0.3313G+0.5B+128Cr=0.5R-0.418G-0.0813B+128一般来说,C值(包括CbCr)应该是一个有符号的数字,但这里通过加上128,使其变为8位的无符号整数,从而方便数据的存储和计算。R=Y+1.402(Cr-128)G=Y-0.34414(Cb-128)-0.71414(Cr-128)B=Y+1.772(Cb-128)2、采样研究发现,人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。因此,我们可以认为Y分量要比Cb,Cr分量重要的多。在BMP图片中,RGB三个分量各采用一个字节进行采样,也就是我们常听到的RGB888的模式;而JPEG图片中,通常采用两种采样方式:YUV411和YUV422,它们所代表的意义是Y,Cb,Cr三个分量的数据取样比例一般是4:1:1或者4:2:2(4:1:1含义就是:在2x2的单元中,本应分别有4个Y,4个U,4个V值,用12个字节进行存储。经过4:1:1采样处理后,每个单元中的值分别有4个Y、1个U、1个V,只要用6个字节就可以存储了)。这样的采样方式,虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量。当然,JPEG格式里面也允许将每个点的U,V值都记录下来;图像压缩技术(压缩算法)分析3、分块由于后面的DCT变换是是对8x8的子块进行处理的,因此,在进行DCT变换之前必须把源图象数据进行分块。源图象中每点的3个分量是交替出现的,先要把这3个分量分开,存放到3张表中去。然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表中,即可以进行DCT变换。注意,编码时,程序从源数据中读取一个8x8的数据块后,进行DCT变换,量化,编码,然后再读取、处理下一个8*8的数据块。JPEG编码是以每8x8个点为一个单位进行处理的.所以如果原始图片的长宽不是8的倍数,都需要先补成8的倍数,使其可以进行一块块的处理。将原始图像数据分为8*8的数据单元矩阵之后,还必须将每个数值减去128,然后一一带入DCT变换公式,即可达到DCT变换的目的。图像的数据值必须减去128,是因为DCT公式所接受的数字范围是-128到127之间。图像压缩技术(压缩算法)分析(4)离散余弦变换DCT(DiscreteCosineTransform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT是先将整体图像分成N*N的像素块,然后针对N*N的像素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换。图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析原始的图像信号(最左边的波形)经过DCT变换之后变成了8个波,其中第一个波为直流成分,其余7个为交流成分。图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析图像压缩技术(压缩算法)分析(5)Zigzag扫描排序DCT将一个8x8的数组变换成另一个8x8的数组.但是内存里所有数据都是线形存放的,如果我们一行行的存放这64个数字,每行的结尾的点和下行开始的点就没有什么关系,所以JPEG规定按如下图中的数字顺序依次保存和读取64个DCT的系数值。这样数列里的相邻点在图片上也是相邻的了。不难发现,这种数据的扫描、保存、读取方式,是从8*8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为Zigzag扫描排序。图像压缩技术(压缩算法)分析(6)量化图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在JPEG算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后者粗量化。下图给出JPEG的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。当然,你也可以自定义量化表。图像压缩技术(压缩算法)分析(7)DC系数的差分脉冲调制编码8*8的图像块经过DCT变换之后得到的DC系数有两个特点:(1)系数的数值比较大;(2)相邻的8*8图像块的DC系数值变化不大;根据这两个特点,DC系数一般采用差分脉冲调制编码DPCM(DifferencePulseCodeModulation),即:取同一个图像分量中每个DC值与前一个DC值的差值来进行编码。对差值进行编码所需要的位数会比对原值进行编码所需要的位数少了很多。假设某一个8*8图像块的DC系数值为15,而上一个8*8图像块的DC系数为12,则两者之间的差值为3。(8)DC系数的中间格式计算JPEG中为了更进一步节约空间,并不直接保存数据的具体数值,而是将数据按照位数分为16组,保存在表里面。这也就是所谓的变长整数编码VLI。即,第0组中保存的编码位数为0,其编码所代表的数字为0;第1组中保存的编码位数为1,编码所代表的数字为-1或者1......,如下面的表格所示,这里,暂且称其为VLI编码表:前面提到的那个DC差值为3的数据,通过查找VLI可以发现,整数3位于VLI表格的第2组,因此,可以写成(2)(3)的形式,该形式,称之为DC系数的中间格式。图像压缩技术(压缩算法)分析(9)AC系数的行程长度编码(RLC)量化之后的AC系数的特点是,63个系数中含有很多值为0的系数。因此,可以采用行程编码RLC(RunLengthCoding)来更进一步降低数据的传输量。利用该编码方式,可以将一个字符串中重复出现的连续字符用两个字节来代替,其中,第一个字节代表重复的次数,第二个字节代表被重复的字符串。例如,(4,6)就代表字符串“6666”。但是,在JPEG编码中,RLC的含义就同其原有的意义略有不同。在JPEG编码中,假设RLC编码之后得到了一个(M,N)的数据对,其中M是两个非零AC系数之间连续的0的个数(即,行程长度),N是下一个非零的AC系数的值。采用这样的方式进行表示,是因为AC系数当中有大量的0,而采用Zigzag扫描也会使得AC系数中有很多连续的0的存在,如此一来,便非常适合于用RLC进行编码。例如,现有一个字符串,如下所示:57,45,0,0,0,0,23,0,-30,-8,0,0,1,000.....经过RLC之后,将呈现出以下的形式:(0,57);(0,45);(4,23);(1,-30);(0,-8);(2,1);(0,0)注意,如果AC系数之间连续0的个数超过16,则用一个扩展字节(15,0)来表示16连续的0。图像压缩技术(压缩算法)分析(10)AC系数的中间格式根据前面提到的VLI表格,对于前面的字符串:(0,57);(0,45);(4,23