JPEG是连续色调静止图像压缩的国际标准,由于其高压缩比,使得它广泛应
用于计算机和通信等领域,例如图像压缩、多媒体通信、图像数据库等。
JPEG在压缩与解压缩的处理过程中,一般采用无损和有损两种方式。无损方式压缩比较低,有损方式则能提供很高的压缩比。 JPEG具有适中的计算复杂性,从而使得压缩算法既可以用软件实现,也可以用硬件实现。 JPEG标准中实际定义了3种编码系统:第一种是基于DCT的有损编码基本系统(顺序模式),可用于绝大多数压缩应用场合;第二种是用于高压缩比、高精度或渐进重建应用的扩展编码系统(递增模式、分层编码);第三种是用于无失真应用场合的无损系统(DPCM)。
(1)基于 DCT的有损编码基本系统
最常用的JPEG编码是基于DCT变换的顺序型模式,又称为基本系统。其JPEG压缩编解码算法框图如图3.4.1所示。
图3.4.1 JPEG压缩编码-解码算法框图
JPEG压缩编码算法的主要计算步骤如下: ①正向离散余弦变换( FDCT)。 ②量化(quantization)。
③使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。 ④使用行程长度编码(RLE)对交流系数(AC)进行编码。 ⑤熵编码。
下面分别对各个计算步骤作简要介绍:
①正向离散余弦变换
在基于DCT的顺序模式中,8×8样本块以从左到右,从上到下(每次一个块行)的顺序对图像进行扫描和编码,这一过程持续到整个图像的所有数据都处理完为止。
在图3.4.1(a)的编码过程中,输入分量的样本被分成 8×8大小的数据块,并且用正向DCT(FDCT)把每个块变成64个DCT系数值,系数值中有一个是DC系数,其它63个是AC系数。其非零元素主要集中于某一个区域,通常在左上角,而右下角大部分是零。
②量化
量化是对经过FDCT变换后的频率系数进行量化。其目的是减少非“0”系数的幅度以及增加“0”值系数的数目。
由于DCT系数包含了空间频率信息,可充分利用人眼对不同频率其敏感程度不同这一特性来来选择量化表中的元素值的大小,对视觉重要的系数采用细量化(量化步长较小),如低频系数被细化;对高频系数则可采用粗量化(量化步长较大)。
JPEG给出了两个量化表,如图3.4.2所示。图(a)示出了根据视觉加权函数得到的亮度分量量化矩阵,即亮度量化表,图(b)是其色度分量量化矩阵,即色度量化表。这两个量化表是JPEG所推荐的。用户也可以设置自己的量化表,量化表必须作为JPEG编码器的输入。
量化表中的每个元素值为1~255之间的整数值,其规定了它所对应DCT系数的量化步长。
(a)亮度量化表 (b)色度量化表
图3.4.2 JPEG推荐的量化表
量化表中的某个对应值用于对相应的系数进行量化处理。量化所得数值为
零可舍去。系数量化是个十分重要的过程,它是造成DCT编解码信息损失(或失真)的根源。在JPEG中采用均匀量化器,量化定义为对64个DCT系数除以其量化步长,四舍五入取整,即:
Q(u,v)=Integer Round(F(u,v)/S(u,v))
式中,Q(u,v)为量化的系数幅度,S(u,v)为量化步长,它是量化表的元素, 量化表元素通常随DCT系数的位置和彩色分量的不同而取不同的值,量化表的尺寸为8×8与DCT 64个系数一一对应。
反量化是量化的逆过程,即
Q’=Q(u,v)×S(u,v)
③直流系数(DC)的编码
8×8 图像块经过DCT变换后,其频率系数低频分量都集中在左上角,其中F(0,0)(即第一行第一列元素)代表了直流(DC)系数,即8×8子块的平均值。直流系数有两个特点:一是系数的数值比较大,二是相邻8×8 图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲编码调制(DPCM)技术,对相邻图像块之间的DC系数的差值单独进行编码,以提高压缩比。
④交流系数(AC)的编码
DCT变换的其他63个元素是交流(AC)系数,经量化后,其系数包含有许多“0”系数,并且许多“0”是连续的,因此使用行程长度编码(RLE)对它们进行编码。
为了保证低频分量先出现,高频分量后出现,以增加行程中连续“0”的个数,这63个元素采用了“Z”字型(Zig-Zag)的排列方法,如图3.4.3所示。
图3.4.3 量化DCT系数的编排
这63个AC系数编码的码字用两个字节来表示。如图3.4.4所示。
图3.4.4 行程编码
第一个字节的高4位表示两个非零值之间连续零的个数(行程 RunLength),低4位表示编码下一个非零值所需要的位数(尺寸Size)。第二个字节表示的是下一个非零系数的实际值。
⑤熵编码
在上面的预处理工作中,我们得到了DC码字和AC码字,为了进一步提高压缩比,需要对其再进行熵编码。熵编码过程中可使用两种编码方法: Huffman编码和自适应二进制算术编码(Adaptive Binary Arithmetic Coding)。在基本系统中推荐了两组Huffman码表,一组用于亮度信号Y,另一组用于色度信号U、V,每一组表又包括两张表,一个用于DC分量,一个用于AC分量。
编码的过程分成两步: ⅰ熵编码的中间格式表示
上述DC码字和AC码字一起作为描述符送到熵编码器进行熵编码。 对于AC系数,有两个符号。符号1为行程和尺寸,即上面的(RunLengh,Size)。(0,0)和(15,0)是两个比较特殊的情况。(0,0)表示块结束标志(EOB),
(15,0)表示ZRL,当行程长度超过15时,用增加ZRL的个数来解决,所以最多有三个ZRL(3×16+15=63)。符号2为幅度值(Amplitude)。
对于DC系数,也有两个符号。符号1为尺寸(Size),符号2为幅度值(Amplitude)。
ⅱ熵编码
对于AC系数,符号1和符号2分别进行编码。零行程长度超过15个时,有一个符号(15,0),块结束时只有一个符号(0,0)。
对符号1进行Huffman 编码,对符号2进行变长整数VLI编码。举例来说:Size=6时,Amplitude的范围是-63~-32,以及32~63。绝对值相同符号相反
的码字之间为反码关系,所以AC系数为32的码字为100000,33的码字为100001,-32的码字为011111,-33的码字为011110。符号2的码字紧接于符号1的码字之后。
对于DC系数,符号1和符号2也要分别进行编码。符号1用Huffman 编码,符号2用变长整数VLI编码。下面举例说明上述的编码过程。
下面为8×8的亮度(Y)图像子块经过DCT变换和量化后的系数:
15 0 -1 0 0 0 0 0 -2 -1 0 0 0 0 0 0 -1 -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
可见量化后只有左上角的几个点(低频分量)不为零,这样采用行程编码就很有效。
第一步,将AC和DC系数表示为熵编码的中间格式。先看DC系数。假设前一个8×8子块DC系数的量化值为12,则本块DC系数于它的差为3,根据下表:
Size Amplitude 0 0 1 2 3 4 5 6 7 8 9 10
-1,1 -3,-2,2,3 -7~ -4,4~7 -15~ -8,8~15 -31~ -16,16~31 -63~ -32,32~63 -127~ -64,64~127 -255~ -128,128~255 -511~ -256,256~511 -1023~ -512,512~1023