JPEG编码原理摘要:JPEG不仅是计算机处理中一种广泛适用的压缩图像标准方式,而且是最普遍在万维网上被用来储存和传输照片的格式。它的压缩编码过程主要是对图像进行离散余弦变换后加以量化,并进行熵编码。关键字:离散余弦变换;量化;Huffman编码;行程编码JPEG是JointPhotographicExpertsGroup(联合图像专家组)的缩写,文件后辍名为.jpg或.jpeg,这个名称代表JointPhotographicExpertsGroup(联合JPEG图片图像专家组),这是1993年公布第1个灰度及彩色静止图像的国际标准。它支持8位和24位色彩的压缩位图格式,适合在网络上传输。JPEG压缩算法是这个标准中的核心之一。在制定这个标准时,JPEG专家组开发了两种基本的压缩算法,一种是采用以离散余弦变换(DiscreteCosineTransform)为基础的有损压缩算法。另一种是采用以预测技术为基础的无损压缩算法。JPEG通常采用有损压缩,它利用了人的视角系统的特性,使用量化和无损压缩编码相结合来去掉视角的冗余信息和数据本身的冗余信息。使用有损压缩算法时,在压缩比为25:1的情况下,压缩后还原得到的图像与原始图像相比较,非图像专家难于找出它们之间的区别,因此得到了广泛的应用。JPEG的压缩编码过程大致分成三个步骤:1、使用正向离散余弦变换把空间域表示的图变换成频率域表示的图;2、使用加权函数对DCT系数进行量化,这个加权函数对于人的视觉系统是最佳的;3、使用霍夫曼可变字长编码器对量化系数进行编码。下面依次介绍压缩过程中应用到的技术。一、离散余弦变换离散余弦变换是压缩编码的基础。在JPEG中,首先将图像分割成8x8像素的小块,然后进行余弦变换,其变换式为(M=N=8):对于每个8×8二维原图像采样数据块,64点阵的离散函数FDCT把它们作为输入信号,然后分解成64个正交基信号,每个正交基信号对应于64个二维空间频率中的一个,这些空间频率是由输入信号的频谱组成。FDCT的输出是64个基信号的幅值(即DCT系数),每个系数值由64点阵输入信号唯一地确定,即离散余弦变换的变换系数。在频域平面上变换系数是二维频域变量u和v的函数。因为在一幅图像中像素之间的灰度或色差信号变化缓慢,在8×8子块中像素之间的相关性很强,所以通过离散余弦正变换处理后,在空间频率低频范围内集中了数值大的系数,这就为数据压缩提供了可能。二、量化为了达到压缩数据的目的,对经过FDCT变换后的频率系数进行量化处理。量化处理是一个多到一的映射,它是造成DCT编/解码信息损失的根源,是图像质量下降的最主要原因。在JPEG标准中采用线性均匀量化器。量化定义为,对64个DCT变换系数除以量化步长,然后四舍五入取整。量化步长是量化表的元素,量化表元素随DCT变换系数的位置而改变。不同频率的余弦函数对视觉的影响不同,量化处理是在一定的主观保真度图像质量的前提下,可据不同频率的视觉阈值来选择量化表中元素值的大小。三、行程编码和熵编码JPEG压缩的最后一步是对量化后的系数进行熵编码。这一步采用通用的无损数据压缩技术,对图像质量没有影响。在熵编码之前,需要把64个DCT系数转换为一串中间符号。其中直流系数和交流系数的编码方式不同。坐标u=v=0的值是直流分量(即DC系数)。直流系数表示当前分块中64个象素的平均值,相邻分块的直流系数具有很强的相关性,因此在编码时只需记录与前一分块的直流系数的差值,即直流系数的“中间符号”采用差分脉冲编码(DPCM),它是64个图像的采样平均值。DC系数的编码方法:第1块图像的DC系数是“真值”,以后各块的DC是与前1块DC系数的“差值”:Diff=DC(i)-DC(i-1)其余63个AC系数编码是从左上方开始,沿箭头方向,对63个交流系数用“之”字型扫描,让它变成一维数组。这样做的目的是将低频系数放在前面,高频系数放在后面。因为高频系数中有很多0,为了节约空间,所以交流系数的“中间符号”用零行程码表示。接下来对中间符号进行熵编码,这一步的目的是利用符号的统计特性,进一步提高压缩率。JPEG标准规定的熵编码方式有两种:Huffman编码和自适应二进制算术编码。这两种编码各有优劣:“正宗”的Huffman编码过程要对输入序列进行两遍扫描,第一遍统计各个符号出现的概率,构造Huffman树,得到码书;第二遍用码书对符号进行编码。这么做的话,时间空间开销都较大。两遍扫描意味着要把整幅图像的“中间符号”都记录下来,不能“随到随编”。而且要把码书传给解码器,这会增加压缩文件的大小。JPEG的实际实现一般支持两种Huffman方式,一种是前述的“正宗”Huffman编码(称为optimized方式),另一种则采用JPEG标准AnnexK中给出的缺省码书。采用缺省码书的好处是输入序列只用扫描一遍,空间和实际开销都较小;缺点是,由于码书不是根据当前图像的统计信息得到的,那么压缩率会比“正宗”Huffman编码低一些。不过由于Huffman编码对概率误差不敏感,因此实践中常常采用缺省码书进行编码。算术编码和Huffman编码都是变长码,符号出现概率越高,码字越短。不同之处在于,Huffman编码每个符号对应的码字是确定的,每个码字的bit数为整数。算术编码的基本思想是用一个精度足够高的属于(0,1)的实数来表示整个输入序列,输入序列中每个符号对应的码字是不确定的,总体上每个符号对应的码字长度等于其信息熵(均以bit计),码字平均长度可能是小数。算术编码的压缩率通常高于Huffman编码。算术编码的另一个好处是,它很容易做成自适应的,因此只需扫描一遍输入序列,空间开销小很多。JPEG的发展目前,高压缩率以及拥有更多新功能的新一代静态图像压缩技术JPEG2000已经诞生。它不再采用离散余弦变换,而是采用性能优越的“离散小波变换”,并且不再进行8x8像素分块,而采用金字塔型的多分辨率分层存贮,根据用户需要还原生成不同分辨率图像。这样,在不牺牲图像品质的前提下,图像数据量可以减小30%~50%,而且在特高的压缩率下,可以保证良好的图像品质,没有分块的不连续效应。另外,它还支持多频谱图像、CMYK格式和ICC色彩特性文件,并可以在传输图像的过程中预览低分辨率图像。