表 3.3 色度量化表
17 18 24 4718 21 26 6624 26 56 9947 66 99 9999 99 99 9999 99 99 9999 99 99 9999 99 99 99
99 99 99 9999 99 99 9999 99 99 9999 99 99 9999 99 99 9999 99 99 9999 99 99 9999 99 99 99以上二个表都是JPEG给出的参考值。
为了便于对编码压缩质量进行控制,JPEG标准建议量化公式3-33改为下式:
{ I(u,v)?取整数8?F(u,v)} (3-35)
q?Q(u,v)其中q称为质量因素,改变q的大小可以改变编码压缩的程度。
7. 之字形扫描
图3.8中之字形扫描是把量化后的8×8二维DCT系数转换为一维数据序列,以便进行熵编码。因此之字形扫描,又称之字形行走,是把二维数据变成一维数据的一种方法。之字形扫描如图3.14所示。由图3.14可见,量化后的8×8DCT系数矩阵左上角的元素代表DCT的直流系数,其余63个元素代表交流分量系数,之字形扫描按照DC0,AC01,AC10,AC20,AC11,AC02,?,AC07,AC70,?,AC77的次序进行。这个次序正好是从低频分量到高频分量的排列。
DCAC10AC20AC01AC07AC70图3.14 之字形扫描
AC77 每一子块中的直流系数反映了该子块图象中包含的直流成分的大小。通常它和相邻子块图象的直流系数有较大的相关性,所以对直流分量首先采用差分编码,即只对本子块图象与前一个子图象的直流差值进行编码,如图3.15所示。图中DCi,
DCi?1分别代表子图象Bi及Bi?1的直流系数,这二个相邻子图象的直流差分值为:
DC差分值 =DCi-DCi?1 (3-36)
321
在直流熵编码中,都是对DC差分值进行熵编码。
DCi-1DCiBi-1子图象DC差分值 =Bi子图象DCi-DC图3.15 直流差分编码
8. 熵编码器
图3.7中熵编码器的作用是对量化后DCT系数进行熵编码。熵编码是无失真编码,即对DCT的直流系数DC和交流系数AC进行编码和解码后,DC系数和AC系数可恢复原值。熵编码分两个步骤,第一步为中间熵编码;第二步是可变长度熵编码。以下分别叙述。 (1) 中间熵编码
中间熵编码也称行程编码,其编码方法如下。
我们知道量化后的AC系数中包含许多零值,所以把一串零值系数与相邻的非零AC系数组成一个数组,用符号1与符号 2一对符号表示。符号1中包含两个数据: 行程长度和位长。行程长度就是AC 系数中连续零的个数,位长就是后继非零AC 系数的幅值编码所需的比特数。符号2中只包含后继非零AC系数幅值的二进制表示。因此这一对符号可以表示如下:
(行程长度,位长) (幅值) 符号1 符号 2
对于直流系数DC,只对相邻两个子图象的DC差分值编码。由于它前面无零值,故表示DC差分值的符号1中没有行程长度,只有位长。符号2代表DC差分值的幅值。根据DC差分值的幅值可以由表3.4查得其位数。AC系数的位长可由表3.5查得。
表3.4 DC差分值的位长 表3.5 AC系数的位长
位长(size) 0 1 2 3 4 5 6 7 8 9 10 11 DC差分值 (DIFF values)? 0 -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-2047..-1024,1024..2047 位长(size) 0 1 2 3 4 5 6 7 8 9 10 AC系数幅值 (AC Amplitude) 0 -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
例如,DC差分值为9,则查表3.4得位长为4,故一对符号为 (4) (9)。再举一个AC
322
系数的例子。假设量化后的AC系数经之字形扫描变换成一维数组,其中一段数据为000-3,即连续三个零后,AC系数幅值为 -3。因而符号1 中行程为 3,符号 1中位长可由表3.5查得为2,符号 2中幅值为 -3。故AC数据000-3的中间熵编码为 (3,2)(-3)。
按JPEG标准,零行长度的范围为0 到15, 超过连续的15个零时,用符号(15,0)表示有16个连续零。此符号只能用3次,因为最多只有63个AC系数。AC系数量化后会出现很多零值,频率越高,零值越多。经常发现某一非零系数之后到结尾都是一大片的零值。显然这时,我们没有必要对这大片零值进行编码。所以在非零系数编码后加上一个专门符1(0,0)作为结束,其含义是8×8方块结束,英文缩写为EOB(End Of Block)。 (2) 可变长度熵编码
可变长度熵编码简称可变长度编码VLC,常用的可变长度编码有两种,一种为哈夫曼编码;另一种为算术编码。算术编码与哈夫曼编码相比,其压缩比要高5% 至10%,这是按JPEG标准经许多图象实验证实的,但是算术编码需要更高速的硬件,其复杂性超过哈夫曼编码甚多,故目前人们仍然喜欢采用哈夫曼编码。如上所述,哈夫曼编码基本原则是,出现概率高的信息符号用较少位的码字(短码表示),出现概率低的信息符号用较多位数的码字(长码)表示。这样可使平均码长最小,达到压缩的目的。此原则中包含了可变长度的含义。
在上面的中间熵编码中已经把DC和AC系数编码成符号1 和符号2。下面的任务是把它们再进行可变长度编码。实际上,对符号1的数据进行哈夫曼编码,对符号2中的数据实际上仍用二进制编码。但不是象通常的定长二进制编码,它的长度是可变的,因而也称可变长度整数VLI编码。但它不是哈夫曼编码。
对于哈夫曼编码,JPEG标准已制订了一系列哈夫曼码表,以供编码解码用。制表过程中还考虑了便于编码程序使计算机自动编码和解码,所以哈夫曼码表中的位数较长,然而这是便于计算机识别唯一解所必须的。这里列出的哈夫曼码表包括:表3.6亮度直流差分表,表3.7色度直流差分表,表3.8亮度交流系数表,表3.9色度交流系数表4个。另外还有表3.10正负值表。
表3.6 亮度DC系数表 表3.7 色度DC系表
位长(Size)01234567891011位数 位字?(Code Length)(Code Word)233333456789 00 010 011 100 101 110 1110 11110 111110 1111110 11111110 111111110位长(Size)01234567891011位数 位字?(Code Length)(Code Word)22234567891011 00 01 10 110 1110 11110 111110 1111110 11111110 111111110 1111111110 11111111110 323
表3.8 亮度AC系数表
行程/位长 位 数 码 字 (Run/Size) (Code Length) (Code Word)4 0/0(EOB)10102 0/1002 0/2013 0/31004 0/410115 0/5110107 0/611110008 0/71111100010 0/8111111011016 0/9111111111000001016 0/A11111111100000114 1/111005 1/2110117 1/311110019 1/411111011011 1/51111111011016 1/61111111000010016 1/71111111000010116 1/81111111000011016 1/91111111000011116 1/A11111110001000 行程/位长 位 数 码 字 (Run/Size) (Code Length) (Code Word) 2/1511100 2/2811111001 2/3101111110111 2/412111111110100 2/5161111111110001001 2/6161111111110001010 2/7161111111110001011 2/8161111111110001100 2/9161111111110001101 2/A161111111110001110 3/16111010 3/29111110111 3/312111111110101 3/4161111111110001111 3/5161111111110010000 3/6161111111110010001 3/7161111111110010010 3/8161111111110010011 3/9161111111110010100 3/A161111111110010101 4/16111011
表3.9 色度AC系数表
行程/位长 位 数 码 字 (Run/Size) (Code Length) (Code Word) 0/0(EOB)2 0/12 0/23 0/34 0/45 0/55 0/66 0/77 0/89 0/910 0/A12 1/14 1/26 1/38 1/49 1/511 1/612 1/716 1/816 1/916 1/A16 行程/位长 位 数 码 字 (Run/Size) (Code Length) (Code Word)11010 2/111110111 2/21111110111 2/3111111110110 2/4111111111000010 2/51111111110001100 2/61111111110001101 2/71111111110001110 2/81111111110001111 2/91111111110000000 2/A111011 3/1111111000 3/211111111000 3/31111111110111 3/41111111110010001 3/51111111110010010 3/61111111110010011 3/71111111110010011 3/81111111110010100 3/91111111110010110 3/A1111010 4/1
324
表3.10 正负值表
位长(Size)振幅(Amplitude)码字(Code Word)(binary)-0,100,01,10,11000,...,011,100,...1110000,...,0111,1000,...,111101234...0-1,1-3,-2,2,3-7,...,-4,...7-15,...,-8,8,...,15......16 32768-
综上所述,符号1的数据(行程,位长),可查表3.6至表3.9即得到哈夫曼码。符号2中的数据幅值可查表3.10进行编码。但需注意,幅值的正负值对应不同的码字,正值的左边第一位均为1,负值的左边第一位均为零,这是便于计算机识别正负值。
9. 数据交换格式
图3.8中数据交换格式单元的作用是把可变长熵编码数据流转换成便于交换、存储和解码的统一的交换格式,如图3.16所示图中包含一帧图象的压缩数据。以下按图中4行的层次分层叙述。
压缩图象数据SOI帧EOI[表/杂项]帧首扫描1[DNL段][扫描2][扫描末][表/杂项]扫描首[ ECS0熵编码0RST0ECS末-1RST ]末-1熵编码末ECS末 末>图3.16 数据交换格式 (1) 图3.16 中第一行为压缩图象数据。图中SOI表示图象开始,中间方框表示 一帧图象数据,最后的EOI表示图象结束。SOI和EOI均称为标记符号,各占2字节(Byte)。 (2) 图3.16 中第二行说明帧内包含的数据内容。首先是表/杂项,其中表即为数据表,如量化表、哈夫曼DC 表和AC表等。表/杂项即为其它必要的信息。第二 325