图形图像 吴嘉慧 (中山大学信息科学与技术学院计算机系,广州510006) 摘要:JPEG文件是当前网络最为流行的图像文件格式,具有高压缩比、多种质量选择等特征。 从解码角度详细分析JPEG压缩算法,而j}常规的从编码的角度,给出实践过程中遇到的 问题和解决方法。 关键词:JPEG解码;图像压缩算法;行程编码;离散余弦变换;哈夫曼编码 引 言 ]PEG(Joint Photographic Experts Group)是联合 图像数据解码过程之用。 ●从图像数据流读取一个最小编码单元(MCU), 并提取出里边的各个颜色分量单元。关于如何从数据 图像专家小组的英文缩写,负责制定静态数字图像的 编码标准。该小组开发出连续色调、多级灰度、静止图 流中把一个个连续存储的MCU分割开来,以及如何 从各个MCU中将多个颜色分量分割开来。 , ●将颜色分量单元从数据流恢复成矩阵数据。利 用文件头给出的哈夫曼表.对分割出来的颜色分量单 像的数字图像压缩编码方法。即JPEG算法。用JPEG 算法压缩出来的静态图片文件称为JPEG文件,扩展 名通常为*.jpg、女.jpe女.jpeg。 对于图像压缩,JPEG专家组开发了多种压缩算 法、编码方法和编码模式。在实际应用中,JPEG图像 元进行解码,把其恢复成8x8的数据矩阵。 ●8x8的数据矩阵进一步解码。此部分解码工作 使用的是离散余弦变换、哈夫曼编码和顺序模式。 由于具有高压缩比、多种质量选择等良好特征, JPEG图像格式已经在网络上流行多年。JPEG编解码 中文资料大都从编码角度分析。如果从编码角度学 习。很可能由于利用已有图像解码软件无法显示编码 生成的图片而陷入困境.而从解码角度认识JPEG格 式,由于已存在一个正确的编码图像,通过用解码的 以8x8的数据矩阵为单位。其中包括相邻矩阵的直流 系数差分解码、利用文件头给出的量化表反量化数据、 反Zig-zag编码、隔行正负纠正、反向离散余弦变换等 5个步骤。最终输出仍然是一个8x8的数据矩阵。 ●颜色系统YCrCb向RGB转换。将一个MCU 的各个颜色分量单元解码结果整合起来,将图像颜色 系统从YCrCb向RGB转换。 图像与正确图像对比,从而更容易发现自身错误。修 正对JPEG格式的理解。 ●排列整合各个MCU的解码数据。不断读取数 据流中的MCU并对其解码.直至读完所有MCU为 止.将各MCU解码后的数据正确排列成完整的图像。 本文从解码角度详细分析JPEG压缩算法。并且给 出实践过程中遇到的问题和解决方法,展示一个宏观 的JPEG数据组织方式。列举一些解码中的细节事项。 1解码过程的概述 JPEG图像文件解码步骤大概如下: 现 代 2 读入文件的相关信息 计 按照JPEG文件数据存储方式,把要解码的文件 算 的相关信息读出。参考方法是设计一系列的结构体对 机 ^ 应各个标记,并存储标记内的信息。以下给出读取过 程中最容易出错的哈夫曼树的建立过程。 (1)读出哈夫曼表数据 ●从文件头读出文件的相关信息。JPEG文件数 据分为文件头和图像数据两大部分,其中文件头记录 总 第 二 了图像的版本、长宽、采样因子、量化表、哈夫曼表等 重要信息。所以解码前必须将文件头信息读出,以备 五 在标记段DHT内,包含了一个或者多个的哈夫 五 (1)理论说明 期 MODERN COMPUTER 2oo7.3 o 维普资讯 http://www.cqvip.com
图形图像 曼表。对于单个哈夫曼表,应该包括三部分: ●哈夫曼表ID和表类型: 0)【00表示DC直流0号表; OxO1表示DC直流1号表; OxlO表示AC交流0号表; Oxl1表示AC交流1号表。 ②举例说明 继续以上面的例子说明问题。 ●由于没有1位的码字.所以第一个码字的位数 为2,即码字为00; ●由于2位的码字有两个,所以第二个码字位数 仍为2,即码字为00+1=01: ●第三个码字为3位,比第二个码字长1位,所 以第三个码字为:01+1=10.然后再添1个…0,得 100; ●不同位数的码字数量 JPEG文件的哈夫曼编码只能是1~16位。这个字 段的16个字节分别表示1~16位的码字的个数。 ●编码内容 这个字段记录了哈夫曼树中各个叶子结点的权。 所以.上一字段的16个数值之和就应该是本字段的 长度。也就是哈夫曼树中叶子结点个数。 ●…… 3 初步了解图像数据流的结构 (1)理论说明 ②举例说明 以下面一段哈夫曼表数据举例说明(数据全部以 16进制表示): l1 00 02 02 00 05 O1 06 O1 00 00 00 00 00 分析图像数据流的结构,以一个从宏观到微观的 顺序来作详细剖析,即: 数据流一最小编码单元一数据单元与颜色分 量一颜色分量单元。 ●在图片像素数据流中,信息可以被分为一段段 00 01 l1 02 21 03 31 41 12 51 61 71 81 91 22 13 32 最小编码单元(Minimum Coded Unit。MCU)数据流。 所谓MCU,是图像中一个正方矩阵像素的数据。这些 矩阵的大小是这样确定的: 查阅标记SOFO得到图像不同颜色分量的采样 因子。大多图片的采样因子为4:1:1或1:1:1。记三个 第一个划线部分为哈夫曼表ID和表类型,其值 Oxl1表示此部分描述的是AC交流1号表;第二个划 线部分为不同位数的码字的数量,具体意义为:没有 1位和4位的哈夫曼码字.2位和3位的码字各有2 个,5位码字有5个,6位和8位码字各有1个,7位 码字各有6个.没有9位或以上的码字;第三个划线 分量中水平采样因子最大值为Hmax,垂直采样因子 最大值为Vmax,则单个MCU矩阵的宽就是Hmaxx8 像素,高就是Vmax ̄8像素。 如果整幅图像的宽度和高度不是MCU宽度和高 度的整数倍,那么编码时会用某些数值填充进去,保 证解码过程中MCU的完整性。 部分为编码内容。由第二划线部分数据知道。此哈夫 曼树有17个叶子结点.即本字段应该有17个字节。 这段数据表示17个叶子结点按从小到大排列,其权 值依次为0、1、11、2、21、3、31、41…… (2)建立哈夫曼树 另外,在数据流中。MCU的排列方法是从左到 右,从上到下。 ●每个MCU又分为若干个数据单元。数据单元 的大小必定为8x8。 JPEG文件与BMP文件有所不同,它把图片分 成Y、Cr、Cb三张子图.然后分别压缩。三个颜色分 量的采样因子可能一样(如1:1:1),也可能不一样 (如4:1:1)。 ①理论说明 建立哈夫曼树的具体方法为: ●第一个码字必定为0。 如果第一个码字位数为1,则码字为0; 如果第一个码字位数为2,则码字为00; 如此类推。 ●从第二个码字开始。 现 代 计 算 机 ^ 每个MCU内部,数据的顺序是Y,Cr、Cb。如果一 个颜色分量有多个数据单元,则顺序是从左到右,从 上到下。 (2)举例说明 下面通过一幅32pxx35px的图像,对上面两个问 题作具体说明。 如果它和前面的码字位数相同,则当前码字为它 总 第 前面的码字加1; 二 如果它的位数比它前面的码字位数大,则当前码 期 五 字是前面的码字加1后再在后边添若干个0.直至满 五 足位数长度为止。 MODERN COMPUTER 2007-3 维普资讯 http://www.cqvip.com
图形图像 分组成:1个直流分量和63个交流分量。 解码的过程其实就是哈夫曼树的查找过程。 首先查阅标记段SOS中的颜色分量信息。可以 得出各个颜色分量对应使用的直流分量和交流分量 使用的哈夫曼树编号。一般来说, Y分量:直流分量:直流0号哈夫曼树,交流分 量:交流0号哈夫曼树; Cr分量:直流分量:直流1号哈夫曼树,交流分 量:交流1号哈夫曼树; 图1整张完整的图像 图2将图像的MCU1放大 Cb分量:直流分量:直流1号哈夫曼树。交流分 量:交流1号哈夫曼树。 颜色分量单元内部综合运用了RLE行程编码和 图I中灰色部分为实际图像大小(32px ̄35px); 粗虚线表示各个MCU的分界;细虚线表示MCU内部 数据单元的分界。 假设此图的采样因子为4:I:I,即(2x2):(1x1): 哈夫曼编码来压缩数据。每个像素的数据流由两部分 构成:编码和数值。具体读入单个颜色分量单元的步 骤如下: (1x1)。此时,Hmax=2,Vmax=2。所以,MCU的宽为16 像素,高为16像素。图像实际的宽刚好是2个MCU, 但高则稍稍大于2个MCU的高度,所以要补足3行 MCU。 ①从此颜色分量单元的起点为单位读人,直到读 入编码与该分量的直流哈夫曼树的某个码字一致,然 后用查得该码字对应的权值。权值表示该直流分量数 值的二进制位数。也就是接下来需要读入的位数。 在数据流中,MCU的顺序是MCU1一MCU2一 MCU3—}MCU4- MCU5—}MCU6。 ②继续读入位数据,直到读人的编码与该分量交 流哈夫曼树的某个码字一致,然后查得该码字对应的 权值。权值的高4位表示当前数值前面有多少个连续 每个MCU又分为4个数据单元。采样因子4:1:1 表示Y分量的水平和垂直方向都是每2个像素采样 2次:Cr分量和Cb分量的水平和垂直方向都是每2 的零,低4位表示该交流分量数值的二进制位数。也 就是接下来需要读人的位数。 个像素采样1次。因此,Y分量取满256个采样点;Cr 分量和Cb分量各自只有64个采样点.取法如图2的 灰色点。 ③不断重复步骤②,直到满足交流分量数据结束 的条件。结束条件有两个。只要满足其中一个即可: ●当读入码字的权值为零,表示往后的交流变量 全部为零: ●已经读人63个交流分量。 如果以MCU1说明MCU数据的次序。则依次为 Y1、Y 、Y5、Y6、Cr。 Cb 。图2中全部256个点均是Y 的采样点,灰色部分为Cr分量和Cr分量的采样点。 对于整张图片来说.数据流的数据依次是: ④各个数值的译码按表1进行。 表1数值编码对照表 编码长度 1 2 3 【Y1、Y2、Y5、Y6、Crl Cb1 、 ,、Y4、Y7、Y8、Cr3478、 Cbws]、[Y9、Yl0、Yl3、Yl4、C 虬01Ⅲ、Cb9l0l3l4]、…… 编码数值(二进制) 0.1 00,01,10,11 000,001,010,011,100,101,110,111 -实际数值(十进制) ・4颜色分量单元的内部解码 (1)理论说明 1,1 3.-2,2,3 - 4 0o0峨 ,Ol11,1000,…,1111 -《 《5,6,7 15, .,遗& ,l5 31 16,1 ,31 5 6 7 00000,,01111,10000,….,11111 ・--63 ,-32,32’ ,63 12.7’… 4'64,..…,127 255,…,-128,128 ,255 “颜色分量单元”约定为说明问题而建立的概念. 指的是MCU中某个颜色分量中的一个8x8数据块. 8 9 10 11 -I5l1 .. --,-256,256,… 511 现 代 计 例 ̄n_lc面提到的Y1、Cr。 Cb 256都是一个颜色分量单 元。 12 13 14 15 . -m23,.. ,-512,512,.. ,1023 2047,…,-1024,1024, ,2047 4095,....,-20鹅,20鹅,..,4O95 8191, ..,・柏96,4096,.. ,8191 -算 机 ^ -161i3,…,81-92,8192, 32767’ ,16383 -,1品84.16384… 32767 图像数据流是以位(bit)为单位存储信息的。并 且内部的数据都是在编码时通过正向离散余弦变换 (FDCT)得到的结果,所以颜色分量单元应该由两部 (2)举例说明 某个颜色分量单元数据如下: D3 5E 6E 4D 35 F5 8A 总 第 二 五 五 期 MODERN COMPUTER .3 ① 维普资讯 http://www.cqvip.com
●2 3 4 5 6 7 8 9mn ¨ 若1 ̄2-"进制表示,并假设该颜色分量单元对应以 下直流哈夫曼树(表2)和交流哈夫曼树(表3),则可 将各个以位为单位的数据流拆分如下: ! lll1010 ll 00 01010 解码出来的直流变量数值只是当前颜色分量单元的 实际直流变量减去前一个颜色分量单元的实际直流 变量。而实际的交流变量应该为: DC.-DC ̄l+D册 2 2 3 3 5 5 5 5 5 6 7 7 7 7 7 ∞ 其中DitT为差分校正变量,也就是直接解码出来 的直流系数。 值~权一∞叭n眈 ∞ 甜 帆帆帆帆帆帆帆帆帆帆帆帆帆帆弧 "趴虬 权值 0x00 0x01 0I位 0xo7 表2直流哈夫曼树 码字 00 01 10 ll0 ll10 注意,3个颜色分量的直流变量是分开进行差分 编码的。也就是说,1张图片有3个直流校正变量。另 外,当数据流中出现标记RSTn,则3个颜色分量的直 流差分校正变量D证都需要重新复位到0。 0xle 表3交流哈夫曼树 序号码字长度码字 6 反量化 不同的颜色分量使用不同的量化表,这个可以从标 记段SOF中的颜色分量信息字段查得。一般是Y分量 使用量化表0,而Cr、Cb两个分量共同使用量化表1。 反量化的过程比较简单。只需要对8x8的颜色分量 单元的64个值逐一乘以对应的量化表内位置相同的值 即可。图像内全部的颜色分量单元都要进行反量化。 7 反Z1 g-Zaq编码 如果将反量化后的每个8 8颜色分量单元的每 读人数据流并对照直流哈夫曼树.第一个哈夫曼 个元素编号,如下图3,那么反Zig—zag编码的过程就 是把矩阵元素按图4重新排列。 1 2 3 4 5 6 7 8 9 l0 ll i2 l3 l4 l5 l6 编码为110,其权值为7,所以往后读入7位数据 1001101,译码成数值为77。因为颜色分量单元只有 一个直流分量,所以下一个是首个交流分量。 继续读人数据流并对照交流哈夫曼树,得哈夫曼 编码为01,其权值为1,所以它的前面没有零,并往后 读入1位数据1,译码成数值为1。如此类推,最后读 到哈夫曼编码0o.其权值为0.满足交流变量结束条 件。最后剩余的01010对本颜色分量单元来说是冗余 的,它可能属于下一个颜色分量单元。 实际上,这段数据译码为: 77,(0,1),(0,5),(0,一6),(0,一3),(5,1),(2,3) l7 l8 l9 2 2l 22 23 24 25 26 27 28 29 3O 3I 32 33 34 35 36 3j 38 39 40 4l 犍 43 懿 垂5 46 7 48 筠 鞠 5i 52 53 54 55 57 58 59 ∞ Sl 62 63 64 图3将颜色分量单元元素编码 图4反Zig-zag编码 关于量化和反Zig—zag编码的先后顺序,不同资 料有不同的见解。经过实践,解码的过程中应该直接 用文件提供的量化表反量化矩阵数据,再将其反Zig— zag编码才能正确解码。 因此,把它置于1个8x8的矩阵中如表4。 现 代 计 表4译码后的8x8矩阵 77 1 5 -6 _3 0 0 0 0 0 0 0 0 0 0 0 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 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 隔行的正负纠正 通过对已知图像进行JPEG编码压缩,然后和该 图的JPEG文件数据对比发现的问题。 算 机 ^ 总 第 二 实际上,就是必须对每个颜色分量单元的奇数行 5直流系数的差分编码 (每个颜色分量单元有8行,假设把它按0、1、……、 6、7编出行号),即1、3、5、7行,进行取相反数操作 (正的变负,负的变正)O 五 每一种颜色分量内,相邻的两个颜色分量单元的 五 直流变量是以差分来编码的。也就是说。通过步骤3 期 @MODERN COMPUTER 2007j .维普资讯 http://www.cqvip.com
图形图像 9 反向离散余弦变换 文件中的数据是在编码时通过正向离散余弦变 换得到的结果,所以现在解码就必须将其反向离散余 弦变换(IDCT),就是把颜色分量单元矩阵中的频率 域数值向时空域转换。 设正负纠正后的频率域矩阵为Flu]Iv1。反向离散余 角16个值用于Y2,左下角16个值用于Y5,右下角 16个值用于Y6o对于Cb分量,道理一样。 另外,由于离散余弦变化要求定义域的对称,所 以在编码时把RGB的数值范围从[0,255]统一减去 128偏移成『_128,1271。因此解码时必须为每个分量 加上128。具体公式如下: R=Y+1.402xCb+128; G=Y-0.34414xCr-0.71414×Cb+128: B=Y+1.772×Cb+128: 弦变换后的矩阵为I【硼,其中0≤ ≤7。公式如下: ,[『]明每 磊(.|“I 0 0yl 其中: V 2 ・fCu]-V )】 还有一个问题。通过变换得出的R、G、B值可能 超出了其定义域。如果大于255,则截断为255;如果 小于0,则截断为0。 至此.每个MCU的解码已经完成。只要将每个 C(u)=— :(当u--O),C(u)=1(当u≠O); c(v)=士V 2 (当v--O)。C(u)=1(当v≠O); MCU组成一幅完整的图像就完成了一张JPEG图像 的解码了。 1 0 YC rCb向RGB转换 要在屏幕上显示图像,就必须以RGB模式表示 图像的颜色,所以。解码时需要把YCrCb模式向RGB 模式转换。 正如前面提到.并不是每种颜色分量的采样因子 都一样.所以转换时需要注意。由本文第3节对4:1:1 的采样因子的分析,可以知道一个MCU里有4个Y 分量单元,而Cr分量和Cb分量各自只有1个分量单 元。以图2为例,仅有的一个Cr分量单元应该平铺用 于4个Y分量单元。即左上角16个值用于Y1,右上 参考文献 f1】张益贞.Visual C++实现MPEG/JPEG编解码技术.北京:’ 人民邮电出版社,2002,11 [2]CCIT.Information Technology-Digital Compression and Conding of Continuous-ton Still Images-requiements and rGuidelines.http://www.wotsit.org/download.asp?f=itu- 1150PDF(访问日期:2007—1—1) [3】云风.JPEG简易文档V2.11.http://rtomados.bokee.corn/ 2442419.html(访问日期:2006—12-30) (收稿日期:2007-01-08) Solution of J PEG I mage Decoding WU Jia—hui (Coilege of Ifnormation Science and Technology,Sun Yat-sen University,Guangzhou 510006 China) 现 Abstract:JPEG images are widely used in Internet.owing tO its hish compression ratio and multi—quality Analyses the JPEG compression algorihm in detailts of JPEG files from the view of decoding instead of encoding,dicusses some problems and solutions encountered in practice. 代 计 算 机 ^ Key words:JPEGDecoding;ImageCompressionAlgorihm;RunLengtthEncoding;DiscreteCosineTransform; HuffmanEncoding 总 第 二 五 五 期 MODERN COMPUTER舢.3 @
因篇幅问题不能全部显示,请点此查看更多更全内容