




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 (0 8*8分块。(1 正向离散余弦变换 (FDCT。(2 量化 (quantization。(3 Z字形编码 (zigzag scan。(4 使用差分脉冲编码调制 (DPCM对直流系数 (DC进行编码。(5 使用行程长度编码 (RLE对交流系数 (AC进行编码。(6 熵编码。笔者在实践过程中查阅了大量的资料,发现大多数书籍资料和网上资料都 是从编码角度分析 JPEG 的编 /解码方式, 并且都只是介绍编码过程中的主要方 法。 所以, 本文从解码角度详细分析 JPEG 的编 /解码过程, 并且加入许多笔者 实践过程中遇到的问题和解决方法, 希望从另一个角度说明问题, 以更好帮助 读者结合其他
2、资料解决问题。不过,介绍解码过程之前,首先要了解 JPEG 文件中数据的存储格式。 在标记段 DHT 内,包含了一个或者多个的哈夫曼表。对于单一个哈夫曼 表,应该包括了三部分:z哈夫曼表 ID 和表类型这个字节的值为一般只有四个 0x00、 0x01、 0x10、 0x11。0x00表示 DC 直流 0号表;0x01表示 DC 直流 1号表;0x10表示 AC 交流 0号表;0x11表示 AC 交流 1号表。z不同位数的码字数量JPEG 文件的哈夫曼编码只能是 116位。这个字段的 16个字节分别 表示 116位的编码码字在哈夫曼树中的个数。z编码内容这个字段记录了哈夫曼树中各个叶子结点的权。
3、所以,上一字段(不 同位数的码字数量的 16个数值之和就应该是本字段的长度,也就是哈 夫曼树中叶子结点个数。b 举例说明以下面一段哈夫曼表数据举例说明(数据全部以 16进制表示: 1100 02 02 00 05 01 06 01 00 00 00 00 00 00 00 0000 01 11 02 21 03 31 41 12 51 61 71 81 91 22 13 32红色部分 (第 1字节为哈夫曼表 ID 和表类型,其值 0x11表示此部分数据 描述的是 AC 交流 1号表。蓝色部分 (217字节 为不同位数的码字的数量。 这 16个数值实际意义为:没有 1位和 4位的哈夫曼码字; 2
4、位和 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第一个码字必定为 0。如果第一个码字位数为 1,则码字为 0;如果第一个码字位数为 2,则码字为 00;如此类推。2从第二个码字开始
5、,如果它和它前面的码字位数相同,则当前码字为它前面的码字加 1; 如果它的位数比它前面的码字位数大,则当前码字是前面的码字加 1后 再在后边添若干个 0,直至满足位数长度为止。b 举例说明继续以上边的例子说明问题。由于没有 1位的码字, 所以第一个码字的位数为 2, 即码字为 00; 由于 2位的码字有两个, 所以第二个码字位数仍为 2, 即码字为 0 0+1=01;第三个码字为 3位, 比第二个码字长 1位, 所以第三个码字为:0 1+1=10,然后再添 1个“ 0”,得 100;如此类推,最后得到这个哈夫曼树如下:序 号 码字长度码字 权值 0x00 0x010x110x020x210x0
6、30x310x410x120x5111101100x6111101110x7111110000x8111110010x9111110100x221111011032特别注意的是,如果中间有某个位数的码字缺失,例如没有 4位码字,则 应该在 3位码字加 1后,添加“ 00”补足 5位,形成下一个 5位码字。在准备好所有的图片信息后,就可以对图片数据进行解码了。2.初步了解图像数据流的结构1理论说明分析图像数据流的结构,笔者准备以一个从宏观到微观的顺序为读者详细剖 析,即:数据流 Æ最小编码单元 Æ数据单元与颜色分量。a 在图片像素数据流中,信息可以被
7、分为一段接一段的最小编码单元(Mi nimum Coded Unit, MCU 数据流。所谓 MCU ,是图像中一个正方矩阵 像素的数据。矩阵的大小是这样确定的:查阅标记 SOF0,可以得到图像不同颜色分量的采样因子,即 Y 、 Cr 、 C b 三个分量各自的水平采样因子和垂直采样因子。 大多图片的采样因子为 4: 1:1或 1:1:1。其中, 4:1:1即(2*2:(1*1:(1*1; 1:1: 1即(1*1:(1*1:(1*1。记三个分量中水平采样因子最大值为 Hm ax ,垂直采样因子最大值为 Vmax ,那么单个 MCU 矩阵的宽就是 Hmax*8像素,高就是 Vmax*8像素。如果
8、,整幅图像的宽度和高度不是 MCU 宽度和高度的整数倍,那么编 码时会用某些数值填充进去, 保证解码过程中 MCU 的完整性 (解码完成后, 可直接忽视图像宽度和高度外的数据。在数据流中, MCU 的排列方法是从左到右,从上到下。b 每个 MCU 又分为若干个数据单元。数据单元的大小必定为 8*8,所以每 个 MCU 的数据单元个数为 Hmax*Vmax。另外 JPEG 的压缩方法与 BMP 文件有所不同, 它不是把每个像素的颜 色分量连续存储在一起的,而是把图片分成 Y , Cr , Cb 三张子图,然后分 别压缩。而三个颜色分量的采样密度(即采样因子可能一样(例如 1:1: 1也可能不一样
9、(例如 4:1:1。每个 MCU 内部,数据的顺序是 Y 、 Cr 、 Cb 。如果一个颜色分量有多个数 据单元,则顺序是从左到右,从上到下。2举例说明下面通过一幅 32*35的图像,对上面两个问题列出两种采样因子的具体说 明。图 1 整张完整的图像(4:1:1 图 2 将图像的 MCU1放大图 1及图 3中灰色部分为实际图像大小(32px*35px;粗虚线表示各个 MCU 的分界;细虚线表示 MCU 内部数据单元的分界。a 采样因子为 4:1:1此时, Hmax=max(2, 1, 1 =2, Vmax=max(2, 1, 1 =2。所以, MCU 的宽为 Hmax*8=16像素,高为 Vm
10、ax*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 分量的水平和垂直方向都是每 2个像素 采样 1次。因此,在一个 MCU 来里边, Y 分量有 256个采样点,即 4个完 整
11、的数据单元; Cr 分量和 Cb 分量各自只有 64个采样点。如果以 MCU1说明 MCU 数据的次序,则依次为 Y 1 、 Y 2 、 Y 5 、 Y 6 、 C r 1256 、 Cb 1256 。图 2中全部 256个点均是 Y 的采样点,红色部分为 Cr 分量 和 Cr 分量的采样点。换句话说,对于整张图片来说,数据流的数据依次是:Y1 、 Y 2 、 Y 5 、 Y 6 、 Cr 1256 、 Cb 1256 、 Y3 、 Y 4 、 Y 7 、 Y 8 、 Cr 3478 、 Cb 34 78 、 Y9 、 Y 10 、 Y 13 、 Y 14 、 Cr 9101314 、 Cb
12、9101314 、图 3 整张完整的图像(1:1:1b 采样因子为 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ÆMCU2 0。每个 MCU 又分为 Hmax*Vmax=1*1=1个数据单元,也
13、就是一个数据单 元就是一个 MCU 。 由于采样因子是 1:1:1, 即 (1*1 :(1*1 :(1*1 , 所以 Y 分量、 Cr 分量和 Cb 分量的水平和垂直方向都是每 1个像素采样 1次, 也就是图象的每一个像素都是采样点。 因此, 在一个 MCU 来里边, Y 分量、 Cr 分量和 Cb 分量各自有 64个采样点。有因此,对于整张图片来说,数据流的数据依次是:Y1 、 Cr 1、 Cb 1、 Y2 、 Cr 2 、 Cb 2 、 Y3 、 Cr 3、 Cb 3 、 Y19 、 Cr 19、 Cb 19、 Y20 、 Cr20、 Cb 20。3.颜色分量单元的内部解码1理论说明“颜色
14、分量单元”是笔者为说明问题而建立的概念,指的是 MCU 中某 个颜色分量中的一个 8*8数据块,例如上面提到的 Y 1 、 Cr 1、 Cb 1 都是一个 颜色分量单元。图像数据流是以位(bit 为单位存储信息的。并且内部的数据都是在编 码时通过正向离散余弦变换(FDCT 进行时空域向频率域变换而得到的结 果,所以对于每个颜色分量单元都应该由两部分组成:1个直流分量和 63个交流分量。解码的过程其实就是哈夫曼树的查找过程。首先查阅标记段 SOS 中的颜色分量信息, 可以得出各个颜色分量对应使 用的直流分量和交流分量使用的哈夫曼树编号。一般来说,Y 分量:直流分量:直流 0号哈夫曼树,交流分量:
15、交流 0号哈夫曼树; Cr 分量:直流分量:直流 1号哈夫曼树, 交流分量:交流 1号哈夫曼树; Cb 分量:直流分量:直流 1号哈夫曼树, 交流分量:交流 1号哈夫曼树。颜色分量单元内部综合运用了 RLE 行程编码和哈夫曼编码来压缩数据。 每 个像素的数据流由两部分构成:编码和数值, 并且两者基本以互相隔开方式出 现(除非该编码的权值为零。具体读入单个颜色分量单元的步骤如下:a 从此颜色分量单元数据流的起点开始一位一位的读入, 直到读入的编码与该 分量直流哈夫曼树的某个码字(叶子结点一致,然后用直流哈夫曼树查 得该码字对应的权值。权值(共 8位表示该直流分量数值的二进制位数, 也就是接下来需
16、要读入的位数。b 继续读入位数据, 直到读入的编码与该分量交流哈夫曼树的某个码字 (叶子 结点一致,然后用交流哈夫曼树查得该码字对应的权值。权值的高 4位 表示当前数值前面有多少个连续的零,低 4位表示该交流分量数值的二进 制位数,也就是接下来需要读入的位数。c 不断重复步骤 b ,直到满足交流分量数据结束的条件。而结束条件有两个, 只要满足其中一个即可:当读入码字的权值为零,表示往后的交流变量全部为零;已经读入 63个交流分量。d 各个数值的译码是按下表进行的:实际数值 编码长度编码0 0 -3,-2,2,3 2 00,01,10,11-7,-6,-5,-4,4,5,6,7 3 000,00
17、1,010,011,100,101,110,111 -15, ,-8,8, ,15 4 0000, ,0111,1000, ,1111 -31, ,-16,16, ,31 5 00000, ,01111,10000, ,11111 -63, ,-32,32, ,63 6 -127, ,-64,64, ,127 7 -255, ,-128,128, ,255 8 -511, ,-256,256, ,511 9 -1023, ,-512,512, ,1023 10-2047, ,-1024,1024, ,2047 11-4095, ,-2048,2048, ,4095 12-8191, ,-409
18、6,4096, ,8191 13-16383, ,-8192,8192, ,16383 14-32767, ,-16384,16384, ,32767 152举例说明下面举例说明以上几点。某个颜色分量单元数据如下:D3 5E 6E 4D 35 f5 8A若以二进制表示,则为:1101 0011 0101 1110 0110 1110 0100 1101 0011 0101 1111 0101 1000 10 10假设该颜色分量单元对应以下直流哈夫曼树和交流哈夫曼树,则可将各 个以位为单位的数据流拆分如下:110 1001101 01 1 11001 101 11001 001 101 00 1
19、1010 1 1111010 11 00 0 1010直流哈夫曼树 交流哈夫曼树序 号 码字长度码字 权值0x000x010x020x070x1e0x2e序号码字长度码字 权值 0x00 0x01详细说明一下:读入数据流并对照直流哈夫曼树,第一 个哈夫曼编码为 110,其权值为 6,所以往 后读入 6位数据“1001101”,译码成数值 为 77。因为每个颜色分量单元只有一个直 流分量,所以下一个就是第一个交流分量 了。 0x71 0x81 0x91 0x22 0x13 0x32继续读入数据流并对照交流哈夫曼树,得哈夫曼编码为 01,其权值为 1, 所以它的前面没有零,并往后读如 1位数据“1
20、”,译码成数值为 1。如此往 复, 最后读到哈夫曼编码 “ 00” , 其权值为 0, 所以满足交流变量结束条件 (最 后剩余的“01010”对本颜色分量单元来说是冗余的,它可能属于下一个颜色 分量单元。实际上,这段数据译码为:77,(0, 1,(0, 5,(0, -6,(0, -3,(5, 1,(2, 3 因此,把它置于 1个 8*8的矩阵中应为:77-6-34.直流系数的差分编码把所有的颜色分量单元按颜色分量(Y 、 Cr 、 Cb 分类。每一种颜色分 量内,相邻的两个颜色分量单元的直流变量是以差分来编码的。也就是说, 通过步骤 3解码出来的直流变量数值只是当前颜色分量单元的实际直流变量减
21、去前一个颜色分量单元的实际直流变量。 也就是说, 当前直流变量要通 过前一个颜色分量单元的实际(非解码直流分量来校正:DCn=DCn-1+Diff其中 Diff 为差分校正变量,也就是直接解码出来的直流系数。但如果当 前颜色分量单元是第一个单元,则解码出来的直流数值就是真正的直流变 量。再次提醒的是, 3个颜色分量的直流变量是分开进行差分编码的。也就 是说,为 1张图片解码时应设置 3个独立的直流校正变量。另一个问题是, 当数据流中出现标记 RSTn ,则 3个颜色分量的直流差分校正变量 Diff 都需 要重新复位到 0。5.反量化不同的颜色分量使用不同的量化表, 这个可以从标记段 SOF 中
22、的颜色分 量信息字段查得。一般是 Y 分量使用量化表 0,而 Cr 、 Cb 两个分量共同使 用量化表 1。反量化的过程比较简单。 只需要对 8*8的颜色分量单元的 64个值逐一乘 以对应的量化表内位置相同的值则可。 图像内全部的颜色分量单元都要进行 反量化。6. 反 Zig-zag 编码如果将反量化后的每个 8*8颜色分量单元的每个元素编号,如下图 4, 那么各反 Zig-zag 编码的过程就是把矩阵元素按图 5重新排列。图 4 将颜色分量单元元素编码 图 5 反 Zig-zag 编码关于量化和反 Zig-zag 编码的先后顺序, 笔者查阅的几份资料有不同的见 解。 经过实践试验, 解码的过
23、程中, 是应该直接用文件提供的量化表反量化 矩阵数据,再将其反 Zig-zag 编码才能正确解码。7.隔行的正负纠正这个问题比较特别,因为在笔者认真阅读的几份资料中都没有提及此问 题。而是笔者通过对已知图像进行 JPEG 编码压缩,然后和该图的 JPEG 文 件数据对比发现的问题。具体原因不明。实际上,就是必须对每个颜色分量单元的奇数行(每个颜色分量单元有 8行,假设把它按 0、 1、 6、 7编出行号,即 1、 3、 5、 7行,进行 取相反数操作(正的变负,负的变正。8.反离散余弦变换之前提到,文件中的数据是在编码时通过正向离散余弦变换(FDCT 进行时空域向频率域变换而得到的结果, 所以
24、现在解码就必须将其反向离散 余弦变换(IDCT ,就是把颜色分量单元矩阵中的频率域数值向时空域转 换。并且,原来的频率域的矩阵大小为 8*8,则经过反向离散余弦变换后, 时空域的矩阵仍然是 8*8。设正负纠正后的频率域矩阵为 Fuv, 而反向离散余弦变换后的矩阵为 fij,其中 0u,v,i,j 7。具体使用的公式如下:,其中C (u =(当 u=0, C (u =1(当 u 0;C (v =(当 v=0, C (u =1(当 v 0;另外补充一下正向离散余弦变换的公式,用于编码:9. YCrCb 向 RGB 转换要在屏幕上显示图像,就必须以 RGB 模式表示图像的颜色。所以,解 码时需要把
25、YCrCb 模式向 RGB 模式转换。正如前面提到,并不是每种颜色分量的采样因子都一样,所以转换时需 要注意。如果采样因子是 1:1:1,则每一个像素点的 3个颜色分量都被采 样,所以没有问题。但 4:1:1的采样因子就不一样了。由 “初步了解图像 数据流的结构” 一节中对 4:1:1的采样因子的分析,可以知道一个 MCU里有 4 个Y分量单元,而Cr分量和Cb分量各自只有 1 个分量单元。以图 2 为 例,仅有的一个Cr分量单元(红色的 64 个采样点)应该平铺用于 4 个Y分 量单元,即左上角 16 个值用于Y1,右上角 16 个值用于Y2,左下角 16 个值 用于Y5,右下角 16 个值
26、用于Y6。换句话说,一个Cr采样点服务于 4 个Y采 样点。对于Cb分量,道理一样。 另外,由于离散余弦变化要求定义域的对称,所以在编码时把 RGB 的 数值范围从0,255统一减去 128 偏移成-128,127。因此解码时必须为每 个分量加上 128。具体公式如下: R=Y +1.402*Cb +128; +128; G=Y-0.34414*Cr -0.71414*Cb B=Y +1.772*Cb +128; 还有一个问题,通过变换得出的 R、G、B 值可能超出了其定义域,所 以要作出检查。如果大于 255,则截断为 255;如果小于 0,则截断为 0。 下面补充 RGB 模式向 YCrC
27、b 模式的公式: Y =0.299*R Cr= -0.1687*R Cb=0.5 *R +0.587*G +0.114*B ; - 0.3313*G +0.5*B +128; - 0.4187*G - 0.0813*B+128; 至此,每个MCU的解码已经完成。而每一个MCU如何组成一幅完整的图 像,请参考“初步了解图像数据流的结构”分析。 参考文献 1 李才伟,中山大学计算机系多媒体课程教学课件 2 张益贞,Visual C+实现 MPEG/JPEG 编解码技术北京:人民邮电出版社 3 CCIT,Information Technology-digital Compression and Conding of Continuous-ton Still Images-requi rements and Guidelines/download.asp?f=itu-1150PDF (访问日期:2007-1-1) 4 公子御风,JFIF文件格式即JPEG文件交换格式(JPEG File Interchonge Formathtt
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- pvc材料采购合同标准文本
- 三年级语文下册 第四单元 14《蜜蜂》教学实录 新人教版
- 业务测试合同标准文本
- 25吨吊车裸租合同标准文本
- 人教版初中历史与社会八年级上册 1.1.3 《古代印度》教学设计
- 书室合同标准文本
- 我国人工智能产业的金融支持效率及其影响因素研究
- 赣粤古道沿线聚落宏观时空演变及分布特征研究
- 以效果为导向的企业报告技巧与艺术
- 挤压Mg-7Sn合金的应力时效行为及组织演变
- 信用风险度量第六章-KMV模型课件
- 小学硬笔书法课教案(1-30节)
- 基于CAN通讯的储能变流器并机方案及应用分析报告-培训课件
- 医院清洁消毒与灭菌课件
- 消防安装工程施工方案Word版
- 软管管理规定3篇
- 关于对领导班子的意见和建议
- 【课件】学堂乐歌 课件-2022-2023学年高中音乐人音版(2019)必修音乐鉴赏
- 纳布啡在胃肠镜麻醉中的临床观察-课件
- 常用手术器械手工清洗
- 2022中西医执业医师实践技能疾病对照诊断内科
评论
0/150
提交评论