资源预览内容
第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
第9页 / 共17页
第10页 / 共17页
亲,该文档总共17页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
JPEG(Joint Photographic Experts Group )是联合图像专家小组的英文缩写。它由国际电话与电报咨询委员会CCITT(The International Telegraph and Telephone Consultative Committee)与国际标准化组织 ISO 于 1986 年联合成立的一个小组,负责制定静态数字图像的编码标准。小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的数字图像压缩编码方法,即 JPEG算法。JPEG 算法被确定为国际通用标准,其适用范围广泛,除用于静态图像编码外,还推广到电视图像序列的帧内图像压缩。而用 JPEG 算法压缩出来的静态图片文件称为 JPEG 文件,扩展名通常为*.jpg、*.jpe*.jpeg。JPEG 专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。具体如下:压缩算法:有损的离散余弦变换(Discrete Cosine Transform,DCT);无损的预测技术压缩。数据编码方法:哈夫曼编码;算术编码;编码模式:基于 DCT 顺序模式:编/解码通过一次扫描完成;基于 DCT 递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细,逐级递进;无损模式:基于 DPCM,保证解码后完全精确恢复到原图像采样值;层次模式:图像在多个空间多种分辨率进行编码,可以根据需要只对低分辨率数据作解码,放弃高分辨率信息。在实际应用中,JPEG 图像使用的是离散余弦变换、哈夫曼编码、顺序模式。JPEG 压缩编码算法的主要计算步骤如下:(0) 8*8 分块。(1) 正向离散余弦变换 (FDCT)。(2) 量化(quantization) 。(3) Z 字形编码(zigzag scan)。(4) 使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。(5) 使用行程长度编码 (RLE)对交流系数(AC)进行编码。(6) 熵编码。笔者在实践过程中查阅了大量的资料,发现大多数书籍资料和网上资料都是从编码角度分析 JPEG 的编/解码方式,并且都只是介绍编码过程中的主要方法。所以,本文从解码角度详细分析 JPEG 的编/ 解码过程,并且加入许多笔者实践过程中遇到的问题和解决方法,希望从另一个角度说明问题,以更好帮助读者结合其他资料解决问题。不过,介绍解码过程之前,首先要了解 JPEG 文件中数据的存储格式。一、JPEG 文件格式介绍JPEG 文件使用的数据存储方式有多种。最常用的格式称为 JPEG 文件交换格式(JPEG File Interchange Format,JFIF)。而 JPEG 文件大体上可以分成两个部分:标记码(Tag)和压缩数据。标记码由两个字节构成,其前一个字节是固定值 0xFF,后一个字节则根据不同意义有不同数值。在每个标记码之前还可以添加数目不限的无意义的 0xFF 填充,也就说连续的多个 0xFF 可以被理解为一个 0xFF,并表示一个标记码的开始。而在一个完整的两字节的标记码后,就是该标记码对应的压缩数据流,记录了关于文件的诸种信息。常用的标记有 SOI、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。注意,SOI 等都是标记的名称。在文件中,标记码是以标记代码形式出现。例如 SOI 的标记代码为 0xFFD8,即在 JPEG 文件中的如果出现数据 0xFFD8,则表示此处为一个 SOI 标记。本文附录列出一张完整的 JPEG 定义的标记表,供读者查阅。这里仅列出几个常用标记的标记代码、占用字节长度和表示的意义。 SOI,Start of Image,图像开始标记代码 2 字节 固定值 0xFFD8 APP0,Application ,应用程序保留标记 0标记代码 2 字节 固定值 0xFFE0包含 9 个具体字段: 数据长度 2 字节 9 个字段的总长度即不包括标记代码,但包括本字段 标识符 5 字节 固定值 0x4A46494600,即字符串 “JFIF0” 版本号 2 字节 一般是 0x0102,表示 JFIF 的版本号 1.2可能会有其他数值代表其他版本 X 和 Y 的密度单位 1 字节 只有三个值可选0:无单位;1:点数/英寸;2:点数/厘米 X 方向像素密度 2 字节 取值范围未知 Y 方向像素密度 2 字节 取值范围未知 缩略图水平像素数目 1 字节 取值范围未知 缩略图垂直像素数目 1 字节 取值范围未知 缩略图 RGB 位图 长度可能是 3 的倍数 缩略图 RGB 位图数据本标记段可以包含图像的一个微缩版本,存为 24 位的 RGB 像素。如果没有微缩图像(这种情况更常见),则字段“缩略图水平像素数目” 和字段“缩略图垂直像素数目”的值均为 0。 APPn,Application ,应用程序保留标记 n,其中 n=115(任选)标记代码 2 字节 固定值 0xFFE10xFFF包含 2 个具体字段: 数据长度 2 字节 2 个字段的总长度即不包括标记代码,但包括本字段 详细信息 数据长度-2 字节 内容不定例如,Adobe Photoshop 生成的 JPEG 图像中就用了 APP1 和 APP13 两个标记段分别存储了一幅图像的副本。 DQT,Define Quantization Table ,定义量化表标记代码 2 字节 固定值 0xFFDB包含 9 个具体字段: 数据长度 2 字节 字段和多个字段的总长度即不包括标记代码,但包括本字段 量化表 数据长度-2 字节a) 精度及量化表 ID 1 字节 高 4 位:精度,只有两个可选值0:8 位;1:16 位低 4 位:量化表 ID,取值范围为 03b) 表项 (64(精度+1)字节 例如 8 位精度的量化表其表项长度为 64(0+1 ) =64 字节本标记段中,字段可以重复出现,表示多个量化表,但最多只能出现4 次。 SOF0,Start of Frame,帧图像开始标记代码 2 字节 固定值 0xFFC0 包含 9 个具体字段: 数据长度 2 字节 六个字段的总长度即不包括标记代码,但包括本字段 精度 1 字节 每个数据样本的位数通常是 8 位,一般软件都不支持 12 位和 16 位 图像高度 2 字节 图像高度(单位:像素),如果不支持 DNL 就必须 0 图像宽度 2 字节 图像宽度(单位:像素),如果不支持 DNL 就必须 0 颜色分量数 1 字节 只有 3 个数值可选1:灰度图;3:YCrCb 或 YIQ;4:CMYK而 JFIF 中使用 YCrCb,故这里颜色分量数恒为 3颜色分量信息 颜色分量数3 字节(通常为 9 字节)a) 颜色分量 ID 1 字节 b) 水平 /垂直采样因子 1 字节 高 4 位:水平采样因子低 4 位:垂直采样因子(曾经看到某资料把这两者调转了)c) 量化表 1 字节 当前分量使用的量化表的 ID本标记段中,字段应该重复出现,有多少个颜色分量(字段),就出现多少次(一般为 3 次)。 DHT,Difine Huffman Table,定义哈夫曼表标记代码 2 字节 固定值 0xFFC4 包含 2 个具体字段:数据长度 2 字节 字段和多个字段的总长度即不包括标记代码,但包括本字段 哈夫曼表 数据长度-2 字节a) 表 ID 和表类型 1 字节 高 4 位:类型,只有两个值可选0:DC 直流;1:AC 交流低 4 位:哈夫曼表 ID,注意,DC 表和 AC 表分开编码b) 不同位数的码字数量 16 字节c) 编码内容 16 个不同位数的码字数量之和(字节)本标记段中,字段可以重复出现(一般 4 次),也可以致出现 1 次。例如,Adobe Photoshop 生成的 JPEG 图片文件中只有 1 个 DHT 标记段,里边包含了 4 个哈夫曼表;而 Macromedia Fireworks 生成的 JPEG 图片文件则有 4 个 DHT 标记段,每个 DHT 标记段只有一个哈夫曼表。 DRI,Define Restart Interval,定义差分编码累计复位的间隔标记代码 2 字节 固定值 0xFFDD 包含 2 个具体字段:数据长度 2 字节 固定值 0x0004,两个字段的总长度即不包括标记代码,但包括本字段MCU 块的单元中的重新开始间隔2 字节 设其值为 n,则表示每 n 个 MCU 块就有一个RSTn 标记。第一个标记是 RST0,第二个是RST1 等,RST7 后再从 RST0 重复。如果没有本标记段,或间隔值为 0 时,就表示不存在重开始间隔和标记RST SOS,Start of Scan ,扫描开始 12 字节标记代码 2 字节 固定值 0xFFDA包含 2 个具体字段:数据长度 2 字节 两个字段的总长度即不包括标记代码,但包括本字段颜色分量数 1 字节 应该和 SOF 中的字段的值相同,即:1:灰度图是;3: YCrCb 或 YIQ;4:CMYK。而 JFIF 中使用 YCrCb,故这里颜色分量数恒为 3颜色分量信息a) 颜色分量 ID 1 字节b) 直流 /交流系数表号 1 字节 高 4 位:直流分量使用的哈夫曼树编号低 4 位:交流分量使用的哈夫曼树编号 压缩图像数据a)谱选择开始 1 字节 固定值 0x00b)谱选择结束 1 字节 固定值 0x3Fc)谱选择 1 字节 在基本 JPEG 中总为 00本标记段中,字段应该重复出现,有多少个颜色分量(字段),就出现多少次(一般为 3 次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以 EOI 标记表示结束。 EOI,End of Image,图像结束 2 字节标记代码 2 字节 固定值 0xFFD9这里补充说明一下,由于在 JPEG 文件中 0xFF 具有标志性的意思,所以在压缩数据流( 真正的图像信息)中出现 0xFF,就需要作特别处理。具体方法是,在数据 0xFF 后添加一个没有意义的 0x00。换句话说,如果在图像数据流中遇到 0xFF,应该检测其紧接着的字符,如果是1)0x00,则表示 0xFF 是图像流的组成部分,需要进行译码;2)0xD9,则与 0xFF 组成标记 EOI,则图像流结束,同时图像文件结束;3)0xD00xD7, 则组成 RSTn 标记,则要忽视整个 RSTn 标记,即不对当前0xFF 和紧接的 0xDn 两个字节进行译码,并按 RST 标记的规则调整译码变量;3)0xFF,则忽视当前 0xFF,对后一个 0xFF 再作判断;4)其他数值,则忽视当前 0xFF,并保留紧接的此数值用于译码。二、 JPEG 解码过程详解下面来详细讲述 JPEG 文件的解码过程。1读入文件的相关信息按照上述的 JPEG 文件数据存储方式,把要解码的文件的相关信息一一读出,为接下来的解码工作做好准备。参考方法是,设计一系列的结构体对应各个标记,并存储标记内表示的信息。其中图像长宽、多个量化表和哈夫曼表、水平/垂直采样因子等多项信息比较重要。以下给出读取过程中的两个问题。1)整个文件的大体结构JFIF 格式的 JPEG 文件(*.jpg)的一般顺序为:SOI(0xFFD8)APP0(0xFFE0)APPn(0xFFEn)可选DQT(0xFFDB)SOF0(0xFFC0)DHT(0xFFC4)SOS(0xFFDA)压缩数据EOI(0xFFD9)2)字的高低位问题JPEG 文件格式中,一个字(16 位)的存储使用的是 Motorola 格式, 而不是 Intel 格式。也就是说 , 一个字的高字节(高 8 位)在数据流的前面, 低字节(低 8 位)
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号