JPEG文件编解码详解_第1页
JPEG文件编解码详解_第2页
JPEG文件编解码详解_第3页
JPEG文件编解码详解_第4页
JPEG文件编解码详解_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如有你有帮助,请购买下载,谢谢!JPEG文件编/解码详解(1 )JPEG (Joint Photographic Experts Group是联合图像专家小组的英文缩写。 它由国际电话与电报咨询委员会 CCITT (The International Telegraph and Telephone Consultative Committee与国际标准化组织ISO于1986年联合成立的 一个小组,负责制定静态数字图像的编码标准。小组一直致力于标准化工作,开发研制出连续色调、多级灰度、静止图像的 数字图像压缩编码方法,即JPEG算法。JPEG算法被确定为国际通用标准,具 适用范围广泛,除用于静态

2、图像编码外,还推广到电视图像序列的帧内图像压缩。 而用JPEG算法压缩出来的静态图片文件称为 JPEG文件,扩展名通常为*jpg、 *jpe*jpeg。JPEG专家组开发了两种基本的压缩算法、两种数据编码方法、四种编码模式。 具体如下: 比缩算法:有损的离散余弦变换(Discrete Cosine Transform, DCT);无损的预测技术压缩。数据编码方法:哈夫曼编码;算术编码;编码模式:基于DCT顺序模式:编/解码通过一次扫描完成;基于DCT递进模式:编/解码需要多次扫描完成,扫描效果从粗糙到精细, 逐级递进;无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值; 层次模式:图

3、像在多个空间多种分辨率进行编码,可以根据需要只对低 分辨率数据作解码,放弃高分辨率信息。在实际应用中,JPEG图像使用的是离散余弦变换、哈夫曼编码、顺序模式。JPEG压缩编码算法的主要计算步骤如下:(0) 8*8 分块。(1)正向离散余弦变换(FDCT)。量化(quantization)。Z字形编码gzag scan)(4)使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码。(5)使用行程长度编码(RLE)对交流系数(AC)进行编码。(6)嫡编码。笔者在实践过程中查阅了大量的资料,发现大多数书籍资料和网上资料都是 从编码角度分析JPEG的编/解码方式,并且都只是介绍编码过程中的主要方法

4、。 所以,本文从解码角度详细分析JPEG的编/解码过程,并且加入许多笔者实践过 程中遇到的问题和解决方法,希望从另一个角度说明问题,以更好帮助读者结合 他资料解决问题。不过,介绍解码过程之前,首先要了解 JPEG文件中数据的存储格式。一、JPEG文件格式介绍JPEG文件使用的数据存储方式有多种。 最常用的格式称为JPEG文件交换格如有你有帮助,请购买下载,谢谢!式(JPEG File Interchange Format JFIF)。而JPEG文件大体上可以分成两个部 分:标记码(Tag)和压缩数据。标记码由两个字节构成,其前一个字节是固定值0 xFF,后一个字节则根据不同意义有不同数值。在每

5、个标记码之前还可以添加数目不限的无意义的0 xFF填充,也就说连续的多个0 xFF可以被理解为一个0 xFF,并表示一个标记码的开始。 而在一个完整的两字节的标记码后, 就是该标记码对应的压缩数据流, 记录了关 文件的诸种信息。常用的标记有 SO!、APP0、DQT、SOF0、DHT、DRI、SOS、EOI。注意,soi等者Qs记的名称TH文件中,益丽是而亢而形而现。例如SOI的标记代码为0 xFFD8,即在JPEG文件中的如果出现数据 0 xFFD8,则 表示此处为一个SOI标记。本文附录列出一张完整的JPEG定义的标记表,供读者查阅。这里仅列出几0常用标记的标记代码、占用字节长度和表示的意

6、义。SOI , Start of Image,图像开始标记代码2字节 固定值0 xFFD8APP0 , Application ,应用程序保留标记 0标记代码包含9个具体字段:数据长度标识符版本号号1.2X和Y的密度单位厘米X方向像素密度Y方向像素密度缩略图水平像素数目缩略图垂直像素数目缩略图RGB位图位图数据2字节 固定值0 xFFE02字节9个字段的总长度即不包括标记代码,但包括本字段5字节 固定值0 x4A,即字符串“JFIF02字节 一般是0 x0102,表示JFIF的版本可能会有其他数值代表其他版本1字节只有三个值可选0:无单位;1:点数/英寸;2:点数/2字节取值范围未知2字节取值

7、范围未知1字节取值范围未知1字节取值范围未知长度可能是3的倍数 缩略图RGB本标记段可以包含图像的一个微缩版本,存为 24位的RGB像素。如果 没有微缩图像(这种情况更常见),则字段 缩略图水平像素数目”和字 段缩略图垂直像素数目”的值均为00APPn , Application ,应用程序保留标记 n,其中n=115(任选)标记代码2字节 固定值0 xFFE10 xFFF包含2个具体字段: 数据长度2字节2个字段的总长度即不包括标记代码,但包括本字段如有你有帮助,请购买下载,谢谢!详细信息数据长度-2字节 内容不定例如,Adobe Photoshop生成的JPEG图像中就用了 APP1和AP

8、P13两 个标记段分别存储了一幅图像的副本。DQT , Define Quantization Table,定义量化表标记代码2字节固定值0 xFFDB包含9个具体字段:数据长度2字节字段和多个字段的总长度即不包括标记代码,但包括本字段量化表数据长度-2字节精度及量化表ID 1字节 高4位:精度,只有两个可选值0: 8 位;1: 16 位低4位:量化表ID,取值范围为03b)表项 (64止度+1)字节例如8位精度的量化表其表项长度为64 X (0+1) =64字节本标记段中,字段可以重复出现,表示多个量化表,但最多只能出现4koSOF0 , Start of Frame,帧图像开始标记代码包含

9、9个具体字段:数据长度精度位图像高度 就必须02字节 固定值0 xFFC02字节 遗六个字段的总长度即不包括标记代码,但包括本字段1字节 每个数据样本的位数通常是8位,一般软件都不支持 12位和162字节 图像高度(单位:像素),如果不支持DNL图像宽度 就必须0颜色分量数为3颜色分量信息2字节图像宽度(单位:像素),如果不支持DNL1字节 只有3个数值可选1:灰度图;3: YCrCb 或 YIQ; 4: CMYK而JFIF中使用YCrCb,故这里颜色分量数恒颜色分量数M字节(通常为9字节)a)颜色分量ID1字节水平/垂直采样因子1字节 高4位:水平采样因子低4位:垂直采样因子c) 量化表1字

10、节(曾经看到某资料把这两者调转了)当前分量使用的量化表的ID本标记段中,字段应该重复出现,有多少个颜色分量(字段),就 出现多少次(一般为3次)。如有你有帮助,请购买下载,谢谢!DHT , Difine Huffman Table ,定义哈夫曼表标记代码2字节固定值0 xFFC4包含2个具体字段:数据长度2字节字段和多个字段的总长度即不包括标记代码,但包括本字 段哈夫曼表数据长度-2字节a)表ID和表类型1字节 高4位:类型,只有两个值可选0: DC直流;1: AC交 流低4位:哈夫曼表ID,注意,DC表和AC表分 开编码b)不同位数的码字数量16字节c)编码内容16个不同位数的码字数量之和(

11、字节)本标记段中,字段可以重复出现(一般 4次),也可以致出现1次。 例如,Adobe Photoshop生成的JPEG图片文件中只有1个DHTB记段,里 边包含了 4个哈夫曼表;而 Macromedia Fireworks 生成的JPEG图片文件 则有4个DHTB记段,每个DHT标记段只有一个哈夫曼表。DRI , Define Restart Interval,定义差分编码累计复位的间隔标记代码2字节 固定值0 xFFDD包含2个具体字段:数据长度2字节 固定值0 x0004,两个字段的总长度即不包括标记代码,但包括本字段MCU块的单元中的重新开始间隔2字节设其值为n,则表示每n个MCU块就

12、有一个RSTn标记。第一个标记是 RST0,第 二个是RST, RST7后再从RST0重复。如果没有本标记段,或间隔值为 0时,就表示不存在重开始间隔和标记 RSTSOS, Start of Scan,扫描开始12字节标记代码2字节固定值0 xFFDA包含2个具体字段:数据长度2字节 两个字段的总长度即不包括标记代码,但包括本字段如有你有帮助,请购买下载,谢谢!颜色分量数1字节 应该和SOW的字段的值相同,即:1:灰度图是;3: YCrCb 或 YIQ;4:CMYK而JFIF中使用YCrCb ,故这里颜色分量 数包为3颜色分量信息a)颜色分量ID 1字节b)直流/交流系数表号1字节 高4位:直

13、流分量使用的哈夫曼树编 号低4位:交流分量使用的哈夫曼树编号压缩图像数据a)谱选择开始1字节固定值0 x00b)谱选择结束1字节固定值0 x3Fc)谱选择1字节 在基本JPEG中总为00本标记段中,字段应该重复出现,有多少个颜色分量(字段),就出现多少次(一般为3次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以EOI标记表示结束。EOI , End of Image,图像结束 2字节标记代码2字节 固定值0 xFFD9这里补充说明一下,由于在JPEG文件中0 xFF具有标志性的意思,所 以在压缩数据流(真正的图像信息)中出现0 xFF,就需要作特

14、别处理。具体 方法是,在数据0 xFF后添加一个没有意义的0 x00。换句话说,如果在图 像数据流中遇到0 xFF,应该检测其紧接着的字符,如果是0 x00,则表示0 xFF是图像流的组成部分,需要进行译码;0 xD9,则与0 xFF组成标记EOI,则图像流结束,同时图像文件结束;0 xD00 xD7,则组成RSTn标记,则要忽视整个RSTn标记,即不对当前0 xFF和紧接的0 xDn两个字节进行译码,并按 RST标记的规则调整译 码变量;0 xFF,则忽视当前0 xFF,对后一个0 xFF再作判断;4)其他数值,则忽视当前0 xFF,并保留紧接的此数值用于译码。.、JPEG解码过程详解卜面来

15、详细讲述JPEG文件的解码过程.读入文件的相关信息按照上述的JPEG文件数据存储方式,把要解码的文件的相关信息一一读出, 为接下来的解码工作做好准备。参考方法是,设计一系列的结构体对应各个标记, 并存储标记内表示的信息。其中图像长宽、多个量化表和哈夫曼表、水平/垂直采样因子等多项信息比较重要。以下给出读取过程中的两个问题。1)整个文件的大体结构JFIF格式的JPEGt件(*jpg)的一般顺序为:SOI(0 xFFD8)APP0(0 xFFE0)APPn(0 xFFEn)可选如有你有帮助,请购买下载,谢谢!DQT(0 xFFDB) SOF0(0 xFFC0) DHT(0 xFFC4) SOS(0

16、 xFFDA) 压缩数据EOI(0 xFFD9)2)字的高低位问题JPEG文件格式中,一个字(16位)的存储使用的是 Motorola格式,而不是 ntel格式。也就是说,一个字的高字节(高8位)在数据流的前面,低字节(低 8位)在数据流的后面,与平时习惯的Intel格式不一样。.3)读出哈夫曼表数据a)理论说明在标记段DHT内,包含了一个或者多个的哈夫曼表。对于单一个哈夫曼表, 应该包括了三部分:哈夫曼表ID和表类型这个字节的值为一般只有四个 0 x00、0 x01、0 x10、0 x11。0 x00表示DC直流0号表;0 x01表示DC直流1号表;0 x10表示AC交流0号表;0 x11表

17、示AC交流1号表。不同位数的码字数量JPEG文件的哈夫曼编码只能是116位。这个字段的16个字节分别表 示116位的编码码字在哈夫曼树中的个数。编码内容这个字段记录了哈夫曼树中各个叶子结点的权。所以,上一字段(不 同位数的码字数量)的16个数值之和就应该是本字段的长度,也就是哈 夫曼树中叶子结点个数。b)举例说明以下面一段哈夫曼表数据举例说明(数据全部以16进制表示):1100 02020005010601000000000000000000 01110221033141125161 71 81 91 2:13 32红色部分(第1字节)为哈夫曼表ID和表类型,其值0 x11表示此部分数 据描述

18、的是AC交流1号表。蓝色部分(217字节)为不同位数的码字的数量。这16个数值实际意义为: 没有1位和4位的哈夫曼码字;2位和3位的码字各有2个;5位 码享有5个;6位和8位码字各有1个;7位码字各有6个;没有 9位或以上的码字。绿色部分(1834字节)为编码内容。由蓝色部分数据知道,此哈夫曼树有 0+2+2+0+5+1+6+1=17个叶子结点,即本字段应该有 17个字节。这段数据表示17个叶子结点按从小到大排列,其权值依次为0、1、如有你有帮助,请购买下载,谢谢!11、2、21、3、31、414)建立哈夫曼树a)理论说明在读出哈夫曼表的数据后,就要建立哈夫曼树。具体方法为:1)第一个码字必定

19、为00如果第一个码字位数为1,则码字为0;如果第一个码字位数为2,则码字为00;如此类推。2)从第二个码字开始,如果它和它前面的码字位数相同,则当前码字为它前面的码字加1;如果它的位数比它前面的码字位数大,则当前码字是前面的码字加1后再在后边添若干个0,直至满足位数长度为止。b)举例说明继续以上边的例子说明问题。由于没有1位的码字,所以第一个码字的位数为2,即码字为00;由于2位的码字有两个,所以第二个码字位数仍为 2,即码字为00+1=01;第三个码字为3位,比第二个码字长1位,所以第三个码字为:01+1=10,然后再添1个“0”,得100;如此类推,最后得到这个哈夫曼树如下:序 号码字长

20、度码字权值r 12000 x0022010 x01331000 x11431010 x02r 55111000 10 x2165110010 x0375110100 x3185110110 x4195111000 x121061110100 x5111711101100 x6112711101110 x7113711110000 x8114711110010 x9115711110100 x2216711110110 x131780 x32特别注意的是,如果中间有某个位数的码字缺失,例如没有4位码字,则应该在3位码字加1后,添加“ 00”补足5位,形成下一个5位码字。在准备好所有的图片信息后,

21、就可以对图片数据进行解码了。如有你有帮助,请购买下载,谢谢!.初步了解图像数据流的结构1)理论说明分析图像数据流的结构,笔者准备以一个从宏观到微观的顺序为读者详细剖析, 即:数据流最小编码单元数据单元与颜色分量。在图片像素数据流中,信息可以被分为一段接一段的最小编码单元(Minimum Coded Unit, MCU )数据流。所谓 MCU ,是图像中一个正方 矩阵像素的数据。矩阵的大小是这样确定的:查阅标记SOFO,可以得到图像不同颜色分量的采样因子,即 Y、Cr、 Cb三个分量各自的水平采样因子和垂直采样因子。大多图片的采样因子为 4: 1: 1 或 1: 1: 1。其中,4: 1: 1

22、即(2*2) : (1*1) : (1*1) ); 1: 1: 1即(1*1) : (1*1) : (1*1)。记三个分量中水平采样因子最大值为 Hmax,垂直采样因子最大值为Vmax,那么单个MCU矩阵的宽就是Hmax*8 像素,高就是Vmax*8像素。如果,整幅图像的宽度和高度不是 MCU宽度和高度的整数倍,那么编 码时会用某些数值填充进去,保证解码过程中MCU的完整性(解码完成后, 可直接忽视图像宽度和高度外的数据)。在数据流中,MCU的排列方法是从左到右,从上到下。每个MCU又分为若干个数据单元。数据单元的大小必定为8*8,所以每个MCU的数据单元个数为Hmax*Vmax。另外JPEG

23、的压缩方法与BMP文件有所不同,它不是把每个像素的颜 色分量连续存储在一起的,而是把图片分成 Y, Cr, Cb三张子图,然后分 别压缩。而三个颜色分量的采样密度(即采样因子)可能一样(例如 1:1: 1)也可能不一样(例如4: 1: 1)。每个MCU内部,数据的顺序是Y、Cr、Cb。如果一个颜色分量有多个数据 单元,则顺序是从左到右,从上到下。2)举例说明下面通过一幅32*35的图像,对上面两个问题列出两种采样因子的具体说明。图1整张完整的图像(4:1:1)图2将图像的MCU1放大图1及图3中灰色部分为实际图像大小(32Px*35px);粗虚线表示各个 MCU的分界;细虚线表示 MCU内部数

24、据单元的分界。采样因子为4: 1: 1此时,Hmax=max (2, 1, 1) =2, Vmax=max (2, 1, 1) =2。所以, MCU的宽为Hmax*8=16像素,高为Vmax*8=16像素。图像实际的宽刚好 是2个MCU,但高则稍稍大于2个MCU的高度,所以要补足3行MCU。在数据流中,MCU的顺序是MCU1 MCU2 MCU3 MCU4 MCU5 MCU6。每个MCU又分为Hmax*Vmax=2*2=4个数据单元。由于采样因子是4: 1: 1,即(2*2) : (1*1) : (1*1),所以Y分量的水平和垂直方向都是 每2个像素采样2次;Cr分量和Cb分量的水平和垂直方向都

25、是每 2个像 素采样1次。因此,在一个 MCU来里边,Y分量有256个采样点,即4 个完整的数据单元;Cr分量和Cb分量各自只有64个采样点。如有你有帮助,请购买下载,谢谢!如果以MCU1说明MCU数据的次序,则依次为 Yi、丫2、丫5、丫6、 Cri256、Cbi256 o图2中全部256个点均是Y的采样点,红色部分为Cr分 量和Cr分量的采样点。换句话说,对于整张图片来说,数据流的数据依次是:丫1、丫2、丫5、丫6、Cri256、Cbl256 、丫3、丫4、丫7、丫8、C3478、Cb3478、 Y 9、丫10、丫13、丫14、Cr9i0i314、CbgiQi314 图3整张完整的图像(1

26、:1:1)米样因子为1 : 1 : 1如图 3。Hmax=max (1, 1, 1) =1, Vmax=max (1, 1, 1) =2。所以, MCU的宽为Hmax*8=8像素,高为Vmax*8=8像素。图像实际的宽刚好是 4个MCU,但高则稍稍大于4个MCU的高度,所以要补足5行MCU。在数据流中,MCU的顺序是:MCU1 MCU2 MCU3 MCU4 MCU18 MCU19 MCU20。每个MCU又分为Hmax*Vmax=1*1=1个数据单元,也就是一个数据单 元就是一个MCU o由于采样因子是1: 1: 1,即(1*1) : (1*1) : (1*1), 所以Y分量、Cr分量和Cb分量

27、的水平和垂直方向都是每1个像素采样1 次,也就是图象的每一个像素都是采样点。因此,在一个 MCU来里边,Y 分量、Cr分量和Cb分量各自有64个采样点。有因此,对于整张图片来说,数据流的数据依次是:Yi、Cri、Cbi、丫2、Cr2、Cb2、丫3、Cm Cb3、 Y19、C门9、Cbi9、Y20、Cr20、Cb2o。3.颜色分量单元的内部解码1)理论说明“颜色分量单元”是笔者为说明问题而建立的概念,指的是 MCU中某 个颜色分量中的一个8*8数据块,例如上面提到的Yi、Cri、Cbi都是一个 颜色分量单元。图像数据流是以位(bit)为单位存储信息的。并且内部的数据都是在编 码时通过正向离散余弦

28、变换(FDCT)进行时空域向频率域变换而得到的结 果,所以对于每个颜色分量单元都应该由两部分组成:1个直流分量和63个交流分量。解码的过程其实就是哈夫曼树的查找过程。首先查阅标记段SOS中的颜色分量信息,可以得出各个颜色分量对应使用的直流分量和交流分量使用的哈夫曼树编号。一般来说,Y分量:直流分量:直流0号哈夫曼树,交流分量:交流 0号哈夫曼树;Cr分量:直流分量:直流1号哈夫曼树,交流分量:交流1号哈夫曼树;Cb分量:直流分量:直流1号哈夫曼树,交流分量:交流1号哈夫曼 树。颜色分量单元内部综合运用了 RLE行程编码和哈夫曼编码来压缩数据。 每个 像素的数据流由两部分构成:编码和数值,并且两

29、者基本以互相隔开方式出现(除 非该编码的权值为零)。具体读入单个颜色分量单元的步骤如下:a)从此颜色分量单元数据流的起点开始一位一位的读入,直到读入的编码与 该分量直流哈夫曼树的某个码字(叶子结点)一致,然后用直流哈夫曼树如有你有帮助,请购买下载,谢谢!查得该码字对应的权值。权值(共 8位)表示该直流分量数值的二进制位 数,也就是接下来需要读入的位数。b)继续读入位数据,直到读入的编码与该分量交流哈夫曼树的某个码字(叶子结点)一致,然后用交流哈夫曼树查得该码字对应的权值。权值的高4位表示当前数值前面有多少个连续的零,低 4位表示该交流分量数值的二 进制位数,也就是接下来需要读入的位数。c)不断

30、重复步骤b,直到满足交流分量数据结束的条件。而结束条件有两个, 只要满足其中一个即可:当读入码字的权值为零,表示往后的交流变量全部为零;已经读入63个交流分量。d)各个数值的译码是按下表进行的:实际数值编 码 长 度编码00-1.110,1-3,-2,2,3200,01,10,11-7,-6,-5,-4,4,5,6,73000,001,010,011,100,101,110,111-15,-8,8,1540000,0111,1000, ,1111-31,-16,16,31500000,,01111,10000;,11111-63,-32,32,636-127,-64,64,1277-255,-

31、128,128,2558-511,-256,256,5119-1023,-512,512,102310-2047,-1024,1024,204711-4095,-2048,2048,409512-8191,-4096,4096,819113-16383,-8192,8192,1638314-32767,-16384,16384,32767152)举例说明下面举例说明以上几点。某个颜色分量单元数据如下:D3 5E 6E 4D 35 f5 8A若以二进制表示,则为:1101 0011 0101 1110 0110 1110 0100 1101 0011 0101 1111 0101 1000 10

32、10假设该颜色分量单元对应以下直流哈夫曼树和交流哈夫曼树,则可将各个以位为单位的数据流拆分如下:110 1001101 01 1 11001 101 11001 001 101 00 11010 1 1111010 11 00 01010直流哈夫曼树交流哈夫曼树序 号码字长 度码字权值12000 x0010页如有你有帮助,请购买下载,谢谢!22010 x0132100 x02431100 x0751 4111100 x1e65111100 x2e详细说明一下:读入数据流并对照直流哈夫曼树,第一个 哈夫曼编码为110,其权值为6,所以往后读 入6位数据“1001101”,译码成数值为77。 因为

33、每个颜色分量单元只有一个直流分量,所 以下一个就是第一个交流分量了。继续读入数据流并对照交流哈夫曼树,得 哈夫曼编码为01,其权值为1,所以它的前面 没有零,并往后读如1位数据“ 1”,译码成 数值为1。如此往复,最后读到哈夫曼编码“00”,其权值为0,所以满足交流变量结束 条件(最后剩余的“ 01010”对本颜色分量单 元来说是冗余的,它可能属于下一个颜色分量 单元)。实际上,这段数据译码为:77, (0, 1) , (0, 5) , (0, -6) , (0, -3) , (5, 1) , (2, 3)序码室长00F旗00昙度01:0 x01331000 x11431010 x025511

34、0000 x2165110010 x0375110100 x3185110110 x41951111000 x121061110100 x5111711101100 x611271111011110 x7113711110000 x8114711110010 x91157:11110100 x2216711110110 x131780 x32因此,把它置于1个8*8的矩阵中应为:7715-6-300000r 10 :0300 :00I 00 I0000 I000000000000000000:0000:。000I 00 I00I 00 I00000000JPEG文件编/解码详解.直流系数的差分

35、编码把所有的颜色分量单元按颜色分量(丫、Cr、Cb)分类。每一种颜色分 量内,相邻的两个颜色分量单元的直流变量是以差分来编码的。也就是说, 通过步骤3解码出来的直流变量数值只是当前颜色分量单元的实际直流变 量减去前一个颜色分量单元的实际直流变量。也就是说,当前直流变量要 通过前一个颜色分量单元的实际(非解码)直流分量来校正:DCn=DCn-1+Diff其中Diff为差分校正变量,也就是直接解码出来的直流系数。 但如果当 前颜色分量单元是第一个单元,则解码出来的直流数值就是真正的直流变11页如有你有帮助,请购买下载,谢谢!里。再次提醒的是,3个颜色分量的直流变量是分开进行差分编码的。也就 是说,

36、为1张图片解码时应设置3个独立的直流校正变量。另一个问题是, 当数据流中出现标记RSTn,则3个颜色分量的直流差分校正变量 Diff都需 要重新复位到00.反量化不同的颜色分量使用不同的量化表,这个可以从标记段SOF中的颜色分 量信息字段查得。一般是Y分量使用量化表0,而Cr、Cb两个分量共同使 用量化表1。反量化的过程比较简单。只需要对 8*8的颜色分量单元的64个值逐一 乘以对应的量化表内位置相同的值则可。图像内全部的颜色分量单元都要 进行反量化。.反Zig-zag编码如果将反量化后的每个8*8颜色分量单元的每个元素编号,如下图 4, 那么各反Zig-zag编码的过程就是把矩阵元素按图 5

37、重新排列。图4将颜色分量单元元素编码图5反Zig-zag 编码关于量化和反Zig-zag编码的先后顺序,笔者查阅的几份资料有不同的 见解。经过实践试验,解码的过程中,是应该直接用文件提供的量化表反 量化矩阵数据,再将其反Zig-zag编码才能正确解码。.隔行的正负纠正这个问题比较特别,因为在笔者认真阅读的几份资料中都没有提及此问 题。而是笔者通过对已知图像进行 JPEG编码压缩,然后和该图的JPEG文 件数据对比发现的问题。具体原因不明。实际上,就是必须对每个颜色分量单元的奇数行(每个颜色分量单元有8行,假设把它按0、1、6、7编出行号),即1、3、5、7行,进行 取相反数操作(正的变负,负的

38、变正)。.反离散余弦变换之前提到,文件中的数据是在编码时通过正向离散余弦变换(FDCT) 进行时空域向频率域变换而得到的结果,所以现在解码就必须将其反向离 散余弦变换(IDCT),就是把颜色分量单元矩阵中的频率域数值向时空域 转换。并且,原来的频率域的矩阵大小为8*8 ,则经过反向离散余弦变换后, 时空域的矩阵仍然是8*8。设正负纠正后的频率域矩阵为 Fuv,而反向离散余弦变换后的矩阵为 fij,其中0&u,v,i,j 70具体使用的公式如下:,其中C (u)=(当 u=0),C(u)=1 (当 uw0);C (v)=(当 v=0),C(u)=1 (当 vw0);另外补充一下正向离散余弦变换的

39、公式,用于编码:. YCrCb 向 RGB 转换要在屏幕上显示图像,就必须以 RGB模式表示图像的颜色。所以,解 码时需要把YCrCb模式向RGB模式转换。正如前面提到,并不是每种颜色分量的采样因子都一样,所以转换时需 要注意。如果采样因子是1: 1: 1,则每一个像素点的3个颜色分量都被采 样,所以没有问题。但4: 1: 1的采样因子就不一样了。由 “初步了解图12页如有你有帮助,请购买下载,谢谢!像数据流的结构” 一节中对4: 1: 1的采样因子的分析,可以知道一个MCU 里有4个Y分量单元,而Cr分量和Cb分量各自只有1个分量单元。以图 2为例,仅有的一个Cr分量单元(红色的64个采样点)应该平铺用于4 个Y分量单元,即左上角16个值用于Y1,右上角16个值用于Y2,左下 角16个值用于Y5,右下角16个值用于Y6。换句话说,一个Cr采样点服 务于4个Y采样点。对于Cb分量,道理一样。R=YG=Y-0.34414*CrB=Y还有一个问题,通过变换得出的另外,由于离散余弦变化要求定义域的对称,所以在编码时把 RGB的 数值范围从0, 255统一减去128偏移成卜128, 127。因此解码时必须为每 个分量加上128。具体公式如下: TOC o 1-5 h z +1.402*Cb+128;-0.71414*Cb +128;+1.772*Cb+128;R

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论