DC值和63个AC值构成,编码时对DC值和AC值用不同的哈夫曼编码表,对亮度和色度也需用不同的哈夫曼编码表,所以必须使用四张不同的哈夫曼编码表,才能完成JPEG编码。
1.DC编码:
在做DC编码之前,还必须对DC值进行脉冲差值运算,8×8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大。根据这个特点,才使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码,
Delta=DC(0, 0)k-DC(0, 0)k-1
具体做法是在Y、Cb、Cr频率系数矩阵中,后一个8×8块的DC值减去前一个8×8块的DC作为后一个8×8块新的DC值,并保留后一个8×8块的DC原值,用于后一个8×8块的差值DC运算,亦即每次后一个8×8块的DC值减去的是第一个8×8块的原来DC值,而不是经运算后的差值。
DC编码=哈夫曼识别码(或称标志码)+DC差值二进制代码
表2-3、2-4给出了Y、Cb Cr矩阵的DC差值哈夫曼编码表。
表2-3 Y矩阵DC差值参考表
DC差值二进制码的码长 Huffman识别码的码长 Huffman识别码 0 2 00 1 3 010 2 3 011 3 3 100 4 3 101 5 3 110 6 4 1110 7 5 11110 8 6 111110 9 7 1111110 10 8 11111110 11 9 111111110 表2- 4 Cb、Cr矩阵DC差值参考表
二进制码的码长 Huffman识别码的码长 Huffman识别码 0 2 00 1 2 01 2 2 10 3 3 110 4 4 1110 5 5 11110 6 6 111110 7 7 1111110 8 8 11111110 9 9 111111110 10 10 1111111110 11 11 11111111110
2.AC编码:
由于哈夫曼编码的对象是整数,所以在做哈夫曼编码之前,还得对量化后的DCT系数矩阵进行取整。经过取整以后,每一个8×8块中,有大量的AC系数的值为0。为了把尽可能多的其值为0的AC系数串在一起,以利于第四步的AC编码及提高压缩比,还必须把YcbCr矩阵中的每一个8×8块中的64个元素进行"Z"字形排序,这样就可以做到把尽可能多的0串在一起。
AC编码的原理和方法跟DC相似,所不同的是AC编码中多了一项RLE压缩编码,前面说到经过量化取整以后,有许多AC值为0,并经过"Z"字形排序,把原可能多的0串行在一起。在这里RLE压缩编码的就是用一个数值表示为0的AC值前有几个AC值为0。例如,在[M,N]这一组RLE编码中,N表示不为0的AC值,M则表示在这不为0的AC值,N之前0的个数,M最多只能为15,如果AC数据值N之前有17个AC值为0,则先以[15,0]代表有16个值为0,再以[1,N]表示N前有一个值为0,如果在某个AC数据值之后(该值不为0),所有AC值皆为0,则这串数据可以用[0,0]表示。
做完RLE压缩后,再对不为0的AC值进行哈夫曼编码,跟DC值一样进行,只不过用的是另两张哈夫曼编码表,完整的AC编码如图2-7:
图2-7 完整AC编码图
完整的AC编码码串包括三部分:(1)的位置记录"0"的个数;(2)的位置为哈夫曼识别码;(3)的位置的AC值的二进制代码值这样的一个码串才算是一个完整的AC哈夫曼码串。
将直流元素转换成与上一个之差之后,接下来将DCT块重新排序成Zig-Zag序列,再后,JPEG用一个熵编码机制送出元素,输出带有建立在其中的RLE,它是编码机制的主要部分,基本上,熵编码输出包括三个单词的序列,不断重复直到块结束,三个单词如下:
1.行程长度--DCT输出矩阵中,当前元素之前的连续0 的个数
2.位计数 --后面跟着的幅度值所用的位数
3.幅度 --DCT系数的幅度
行程长度和位计数这两个值的组合,形成了输出的代码。位计数是将幅度可变长度整型编码所使用的位数目。
可变长度整型数编码利用了DCT的输出应该由大多数较小的数值所组成的事实,因此我们想用较少的位数目进行编码。下面是位计数及用这个数目编码的系数幅度:
位计数 幅度
1 -1,1
2 -3到-2, 2到3
3 -7到-4, 4到7
4 -15到-8, 8到15
5 -31到-16,16到31
6 -63到-32,32到63
7 -127到-63,64到127
8 -255到-128,128到-255
9 -511到-256,256到511
10 -1023到-512,512到1023
要注意的是每一个位计数编码高低值的对称序列,中间跳过的值用表中从1位开始的较小的位计数进行编码。
2.3 Huffman编码简介
霍夫曼(Huffman)编码是1952年为文本文件而建立,是一种统计编码。属于无损压缩编码。霍夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。这样,处理全部信息的总码长一定小于实际信息的符号长度。
Huffman编码过程的几个步骤:
l)将信号源的符号按照出现概率递减的顺序排列。(注意,一定要递减)
2)将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。
3)重复进行步骤1和2直到概率相加的结果等于1为止。
4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。
5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。
下面我举个简单例子:
一串信号源S={s1,s2,s3,s4,s5}对应概率为p={40,30,15,10,5},(百分率)
按照递减的格式排列概率后,根据第二步,会得到一个新的概率列表,依然按照递减排列,注意:如果遇到相同概率,合并后的概率放在下面!最后概率最大的编码为0,最小的编码为1,所以,编码结果为:
s1=1
s2=00
s3=010
s4=0110
s5=0111
霍夫曼编码具有如下特点:
1 编出来的码都是异字头码,保证了码的唯一可译性。
2 由于编码长度可变。因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。
3 编码长度不统一,硬件实现有难度。
4 对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;若信号源符号的概率相等,则编码效率最低。
5 由于0与1的指定是任意的,故由上述过程编出的最佳码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。限于篇幅原因,在此就不再详述。
2.4 小结
通过分析JPEG压缩的过程,认识到JPEG的目的是为了给出一个适用于连续色调图像的压缩方法,使之满足以下三个要求[3]:
1 达到或接近当前压缩比与图像保真度的技术水平,与原始图像相比,人的视觉难以区分
2 能适用于任何种类的连续色调的图像,且长宽比都不受限制,同时也不受限于景物内容、图像复杂度。
3 压缩以后的数据,对于图像数据的存储来说,节省了存储空间,使得原有的存储设备, 能够用来存储更多的信息。而对图像的传输而言,则减少了传输率,节省了传输时间,解决了数据量大和带宽有限的问题。
在整个压缩过程中,最难的部分就是第四步,哈夫曼编码用程序实现起非常繁琐,必须判断一个个DC(AC)的值,以及转换成二进制代码后的码长,再去对照哈夫曼编码表进行编码,比如对一个DC值编码,首先得先判断该DC的值在哪段范围内,在某一段范围内的数值,其二进制代码长相等。并要让程序知道该DC的值到底为多少,然后才能进行编码。
第3章 基于 MATLAB的算法实现
在计算机数字图像文件常用格式中,作为静止图像压缩编码技术国际标准推出的JPEG(Joint Photo-graphic Experts Group)格式是一种称为联合图像专家组的图像压缩格式,它适用于各种不同类型、不同分辨率要求的彩色和黑白静止图像.在JPEG各类图像压缩算法中,基于离散余弦变换(DCT,Discrete CosineTransform)的图像压缩编码过程称为基本顺序过程,它应用于绝大多数图像压缩场合,并且它能在图像的压缩操作中获得较
上一篇:
房屋租赁管理系统(word文档)
下一篇:
基于JSP邮件收发系统论文