JPEG编码过程详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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=1~15(任选)

◆ 标记代码2字节固定值0xFFE1~0xFFF

◆ 包含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,取值范围为0~3

b)表项(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

相关文档
最新文档