《本科毕业设计---多媒体通信.doc》由会员分享,可在线阅读,更多相关《本科毕业设计---多媒体通信.doc(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目录目录1摘要2Abstract31. 设计要求42. JPEG图像压缩原理52.1图像压缩技术简介52.2JPEG图像压缩基本原理62.1.1 颜色空间转换以及图像分量采样62.1.2离散余弦变换(DCT)92.2.3 系数量化102.2.4 Zigzag扫描排序112.2.5 DC系数调制编码122.2.6AC系数调制编码132.2.7 霍夫曼编码152.3 JPEG压缩要求162.4 JPEG解码原理163. 基于MATLAB的算法实现213.1 JPEG压缩设计213.2基于DCT变换系统设计223.3 量化程序设计233.4 Z扫描系统设计243.4 霍夫曼编码设计254. 仿真26
2、5. 总结286. 参考文献29附录130附录233摘要图像的数字化表示使得图像信号可以高质量地传输,并便于图像的检索、分析、处理和存储。但是数字图像的表示需要大量的数据,必须进行数据的压缩。因此图像压缩编码技术的研究显得特别有意义,也正是由于图像压缩编码技术及传输技术的不断发展、更新,推动了现代多媒体技术应用的迅速发展。本设计在研究JPEG压缩编码对图像数据压缩的基本原理的基础上,设计了JPEG仿真方案和程序实现流程,根据流程图编写了JPEG压缩编码的仿真程序,并利用MATLAB软件对仿真程序进行了调试,验证了JPEG压缩编码对图像数据压缩的可行性。通过运行JPEG仿真程序输出了原图像,重建
3、图像,以及二者的差值图像,通过直观比较,发现经过JPEG仿真程序压缩后的图像仍有很好的视觉效果。通过对输出的压缩比,峰值信噪比等参数的研究,科学的论证了JPEG压缩编码对图像数据巨大的压缩效果以及良好的压缩质量。实验结果表明基于DCT 变换的JPEG 图像压缩方法简单、方便,既能保证有较高的压缩比,又能保证有较好的图像质量,应用MATLAB仿真出来的结果较好的反应了其编码算法原理。关键词:JPEG,DCT,MATLAB,图像压缩AbstractDigital images that make high-quality image signal can be transmitted, and t
4、o facilitate image retrieval, analysis, processing and storage. But the digital images that require large amounts of data, the data must be compressed. Therefore, image compression coding technology research is particularly meaningful, and because the image compression technology and transmission te
5、chnology continues to develop, update and promote the application of modern multimedia technology to develop rapidly. I have JPEG compression in-depth study on the basic principles of image data compression based on JPEG emulator hands drawn flow chart, flow chart was prepared according to JPEG comp
6、ression simulation program, and the simulation program using MATLAB software was debugged to verify the JPEG compression of image data compression is feasible. Simulation program by running the output of the original JPEG image, reconstructed image, and the difference between the two images, by visu
7、al comparison, found through simulation program compressed JPEG image is still very good visual effects. Compression ratio on the output peak signal to noise ratio and other parameters of the study, scientific proof of the JPEG image data compression coding of the great compression and good compress
8、ion quality. Keywords:JPEG, Huffman, DCT, quantization, MATLAB simulation1. 设计要求图像通信之前需要进行数据量压缩,编程实现JPEG图像压缩标准的主要环节,完成压缩和解压过程,计算压缩比。 要求:将彩色图像进行颜色空间转换、对不同的颜色分量进行不同的采样、对于3个分量进行88的DCT变换、对DCT系数矩阵按照JPEG推荐的量化表进行量化;对量化后的系数进行Z形扫描,最后进行熵编码,形成码流,计算比特数,和压缩比。解压从量化后的DCT系数表开始逆向进行。通过分析知道本次设计要求主要是对图像进行压缩处理,涉及了JPEG图像
9、压缩的环节,掌握其过程原理。2. JPEG图像压缩原理2.1图像压缩技术简介图像压缩是减少表示数字图像时需要的数据量图像数据的压缩基于两点:(1)图像信息存在着很大的冗余度,数据之间存在着相关性,如相邻像素之间色彩的相关性等。(2)人眼是图像信息的接收端。因此,可利用人的视觉对于边缘急剧变化不敏感(视觉掩盖效应),以及人眼对图像的亮度信息敏感、对颜色分辨率弱的特点实现高压缩比,而解压缩后的图像信号仍有着满意的主观质量。1.图像压缩的基本原理图像数据之所以能被压缩,就是因为数据中存在着冗余。图像数据的冗余主要表现为:图像中相邻像素间的相关性引起的空间冗余;图像序列中不同帧之间存在相关性引起的时间
10、冗余;不同彩色平面或频谱带的相关性引起的频谱冗余。数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。信息时代带来了“信息爆炸”,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。2.图像压缩基本方法图像压缩可以是有损数据压缩也可以是无损数据压缩。对于如绘制的技术图、图表或者漫画优先使用无损压缩,这是因
11、为有损压缩方法,尤其是在低的位速条件下将会带来压缩失真。如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速。无损图像压缩方法有:行程长度编码熵编码法如 LZW 这样的自适应字典算法有损压缩方法有:将色彩空间化减到图像中常用的颜色。所选择的颜色定义在压缩图像头的调色板中,图像中的每个像素都用调色板中颜色索引表示。这种方法可以与 抖动(en:dithering)一起使用以模糊颜色边界。色度抽样,这利用了人眼对于亮度变化的敏感性远大于颜色变化,这样就可以
12、将图像中的颜色信息减少一半甚至更多。变换编码,这是最常用的方法。首先使用如离散余弦变换(DCT)或者小波变换这样的傅立叶相关变换,然后进行量化和用熵编码法压缩。分形压缩(en:Fractal compression)。2.2JPEG图像压缩基本原理输入图像色彩转换图像分块Dct量化dc系数 ac系数块间DPCMZ字型扫描Huffman编 码Huffman编 码DC哈夫曼表压缩数据AC哈夫曼表解 码码 表反量化量化表IDCT恢复的图像数据量化表图2-1JPEG图像压缩基本原理图2.1.1 颜色空间转换以及图像分量采样工具箱用RGB图像中直接描述颜色,或者在索引图像中间接描述颜色,此时,彩色映射使
13、用RGB格式来储存。然而,还有其他的色彩空间(又称彩色模型),他们的应用有时会更加方便或更加恰当。其中包括NTSC、YCbCr、HSV、CMY、CMYK和YUV色彩空间。NTSC色彩空间:NTSC彩色制式在美国用于电视系统。这种形式的有点是灰度信息和彩色信息是分离的,所以同一个信号既可以用于彩色电视,又可以用于黑白电视机。在NTSC制式中,图像数据是有三部分组成的:亮度Y、色调I和饱和度Q,其中字母YIQ选择常常是按照惯例进行的。亮度分量描述灰度信息的,其他俩个分量携带电视信号的彩色信息。YIQ这几个分量都是利用如下变换从一副RGB分量中得到的:Y=0.229R+0.587G+0.114BI=
14、0.596R-0.274G-0.322BQ=0.211R-0.523G+0.312B (式2-1)根据以上可以得到rgb2ntsc可执行这样的变换yiq_image=rgb2ntsc(rgb_image)同上理:IPT函数ntsc2rgb用于实现ntsc转换为RGB:rgb_image=ntsc2rgb(yiq_image)YCbCr彩色空间:YCbCr1Cb是蓝色分量和一个彩色空间广泛用于数字电视。在这种格式中,亮度信息单个分量Y来表示,彩色信息用俩个色差Cb和Cr来储存。分量Cb是蓝色分量和一个参考值的差,分量Cr是红色分量和一个参考值的差。JPEG采用的是YCrCb颜色空间,而BMP采用
15、的是RGB颜色空间,要想对BMP图片进行压缩,首先需要进行颜色空间的转换。YCrCb颜色空间中,Y代表亮度,Cr,Cb则代表色度和饱和度(也有人将Cb,Cr两者统称为色度),三者通常以Y,U,V来表示,即用U代表Cb,用V代表Cr。RGB和YCrCb之间的转换关系如下所示: Y = 0.299R+0.587G+0.114B Cb = -0.1687R-0.3313G+0.5B+128Cr = 0.5R=0.418G-0.0813B+128 (式2-2) 一般来说,C 值 (包括 Cb Cr) 应该是一个有符号的数字, 但这里通过加上128,使其变为8位的无符号整数,从而方便数据的存储和计算。
16、R = Y+1.402(Cr-128) G = Y-0.34414(Cb-128)-0.71414(Cr-128)B = Y+1.772(Cb-128) (式2-3)通过以上的算法可以得到转换函数ycbcr_image=rgb2ycbcr(rgb_iage)输入的图像可以是uint8类、uint16类或者double类。输出图像和输出图像是相同类别。YUV色彩空间:YUV色彩空间和YCrCb类似,其计算方法如下:Y = 0.299*R + 0.587*G + 0.114*B;U = -0.147*R - 0.289*G + 0.436*B;V = 0.615*R - 0.515*G - 0.1
17、00*B; (式2-4)数据分块采样:在彩色图像中,JPEG分别压缩图像的每个彩色分量。虽然JPEG可以压缩通常的红绿蓝分量,但在YCbCr空间的压缩效果会更好。这是因为人眼对色彩的变化敏感,因而对色彩的编码可以比对亮度的编码粗糙些。这主要体现在不同的采样频率和量化精度上,因此,编码前一般先将图像从RGB空间转换到YCbCr空间。研究发现,人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。因此,我们可以认为Y分量要比Cb,Cr分量重要的多。在BMP图片中,RGB三个分量各采用一个字节进行采样,也就是我们常听到的RGB888的模式;而JPEG图片中,通常采用两种采样方式:YUV411和YUV
18、422,它们所代表的意义是Y,Cb,Cr三个分量的数据取样比例一般是4:1:1或者4:2:2(4:1:1含义就是:在2x2的单元中,本应分别有4个Y,4个U,4个V值,用12个字节进行存储。经过4:1:1采样处理后,每个单元中的值分别有4个Y、1个U、1个V,只要用6个字节就可以存储了)。这样的采样方式,虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量。当然,JPEG格式里面也允许将每个点的U,V值都记录下来;由于后面的DCT变换是是对8x8的子块进行处理的,因此,在进行DCT变换之前必须把源图象数据进行分块。源图象中每点的3个分量是交替出现的,先要把这3个分量分开,存放到3
19、张表中去。然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表中,即可以进行DCT变换。注意,编码时,程序从源数据中读取一个8x8的数据块后,进行DCT变换,量化,编码,然后再读取、处理下一个8*8的数据块。1 2 5 63 4 7 8Y矩阵 Cb Cr1 2 3 8 16 M 8 M/2 8 M/2 8M/2 8M/2图2-2矩阵分块图2.1.2离散余弦变换(DCT)DCT(Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT
20、是先将整体图像分成N*N的像素块,然后针对N*N的像素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换。正向离散余弦变换计算公式:反向离散余弦变换计算公式:DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余。变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规律在频域上减少量化比特数,达到压缩的目的。图像经DCT变换以后,DCT系数之间的相关性就会变小。而且大部分
21、能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。为此,发送者首先将输入图像分解为8*8或16*16块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换。最后将操作完成后所有的块拼接起来构成一幅单一的图像。对于一般的图像而言,大多数DCT系数值都接近于0,所以去掉这些系数不会对重建图像的质量产生较大影响。因此,利用DCT进行图像压缩确实可
22、以节约大量的存储空间。在实验中,先将输入的原始lena图像分为8*8块,然后再对每个块进行二维DCT变换。MATLAB图像处理上具箱中提供的二维DCT变换及DCT反变换函数如下。dct2实现图像的二维离散余弦变换。其语法格式为:(1)B=dct2(A) 返回图像A的二维离散余弦变换值,其大小与A相同且各元素为离散余弦变换的系数B(K1,k2)。(2)B=dct2(A,in,n)或B=dct2(A,m,n) 如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至m*n如果m和n比图像A小。则进行变换之前,将图像A剪切。idct2可以实现图像的二维离散余弦反变换,其语法格式为:B
23、=idct2(A);B=idct2(A,m,n)或B=idct2(A,m,n)。图像数据块分割后,即以MCU为单位顺序将DU进行二维离散余弦变换。对以无符号数表示的具有P位精度的输入数据,在DCT前腰减去2P-1 ,转换成有符号数;而在IDCT后,应加上2P-1,转换成无符号数。对每个 88的数据块DU进行DCT后,得到的64个系数代表了该图像块的频率成分,其中低频分量集中在左上角,高频分量分布在右下角。系数矩阵左上角的称为直流(DC)系数,它代表了该数据块的平均值;其余63个称为交流(AC)系数。2.2.3 系数量化图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶
24、段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在JPEG算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后者粗量化。 下图给出JPEG的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。当然,你也可以自定义量化表。表2-1 亮度量化值表1611101624405161 12 121419265
25、8605514131624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399表2-2 色度量化值表17182447999999991821266699999999242656999999999947669999999999999999999999999999999999999999999999999999999999999999999999999999这两张表依据心理视觉阀制作, 对 8bit 的亮度和色度的图象的处理效果不错。量化表是控制 JPE
26、G 压缩比的关键,这个步骤除掉了一些高频量, 损失了很多细节信息。但事实上人眼对高频信号的敏感度远没有低频信号那么敏感。所以处理后的视觉损失很小,从上面的量化表也可以看出,低频部分采用了相对较短的量化步长,而高频部分则采用了相对较长的量化步长,这样做,也是为了在一定程度上得到相对清晰的图像和更高的压缩率。另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程,而大量的图象信息被包含在低频率空间中,经过DCT处理后, 在高频率部分, 将出现大量连续的零。2.2.4 Zigzag扫描排序DCT系数量化后,用Z(zigzag)形扫描将其变成一维数列,这样做的目的是有利于熵编码,Z形扫描的顺序如
27、图2-2 所示: 图2-2 zig-zag扫描示意图 DCT 将一个 8x8 的数组变换成另一个 8x8 的数组. 但是内存里所有数据都是线形存放的, 如果我们一行行的存放这 64 个数字, 每行的结尾的点和下行开始的点就没有什么关系, 所以 JPEG 规定按如下图中的数字顺序依次保存和读取64 个DCT的系数值。表3-3DCT系数值 这样数列里的相邻点在图片上也是相邻的了。不难发现,这种数据的扫描、保存、读取方式,是从8*8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为Zigzag扫描排序。如下图所示: 图2-3 z扫描示意图2.2.5 DC系数调制编码在做DC编码之前,还
28、必须对DC值进行脉冲差值运算,88图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻88图像块的DC系数值变化不大。根据这个特点,才使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码,DeltaDC(0, 0)k-DC(0, 0)k-1具体做法是在Y、Cb、Cr频率系数矩阵中,后一个88块的DC值减去前一个88块的DC作为后一个88块新的DC值,并保留后一个88块的DC原值,用于后一个88块的差值DC运算,亦即每次后一个88块的DC值减去的是第一个88块的原来DC值,而不是经运算后的差值。DC编码哈夫曼识别码(或称
29、标志码)DC差值二进制代码 表3-4、3-5给出了Y、Cb Cr矩阵的DC差值霍夫曼编码表。表3-4 Y矩阵DC差值参考表DC差值二进制码的码长Huffman识别码的码长Huffman识别码0200130102301133100431015311064111075111108611111097111111010811111110119111111110表3-5 Cb、Cr矩阵DC差值参考表二进制码的码长Huffman识别码的码长Huffman识别码02001201221033110441110551111066111110771111110881111111099111111110101011
30、111111101111111111111102.2.6AC系数调制编码由于霍夫曼编码的对象是整数,所以在做霍夫曼编码之前,还得对量化后的DCT系数矩阵进行取整。经过取整以后,每一个88块中,有大量的AC系数的值为0。为了把尽可能多的其值为0的AC系数串在一起,以利于第四步的AC编码及提高压缩比,还必须把YcbCr矩阵中的每一个88块中的64个元素进行“Z”字形排序,这样就可以做到把尽可能多的0串在一起。AC编码的原理和方法跟DC相似,所不同的是AC编码中多了一项RLE压缩编码,前面说到经过量化取整以后,有许多AC值为0,并经过“Z”字形排序,把原可能多的0串行在一起。在这里RLE压缩编码的就
31、是用一个数值表示为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-4: AC编码码串图2-4完整AC编码图完整的AC编码码串包括三部分:(1)的位置记录“0”的个数;(2)的位置为霍夫
32、曼识别码;(3)的位置的AC值的二进制代码值这样的一个码串才算是一个完整的AC霍夫曼码串。将直流元素转换成与上一个之差之后,接下来将DCT块重新排序成ZigZag序列,再后,JPEG用一个熵编码机制送出元素,输出带有建立在其中的RLE,它是编码机制的主要部分,基本上,熵编码输出包括三个单词的序列,不断重复直到块结束,三个单词如下:1.行程长度DCT输出矩阵中,当前元素之前的连续0 的个数2.位计数 后面跟着的幅度值所用的位数3.幅度 DCT系数的幅度行程长度和位计数这两个值的组合,形成了输出的代码。位计数是将幅度可变长度整型编码所使用的位数目。可变长度整型数编码利用了DCT的输出应该由大多数较
33、小的数值所组成的事实,因此我们想用较少的位数目进行编码。下面是位计数及用这个数目编码的系数幅度: 位计数 幅度 1 1,12 3到2, 2到33 7到4, 4到74 15到8, 8到155 31到16,16到316 63到32,32到637 127到63,64到1278 255到128,128到2559 511到256,256到51110 1023到512,512到1023要注意的是每一个位计数编码高低值的对称序列,中间跳过的值用表中从1位开始的较小的位计数进行编码。2.2.7 霍夫曼编码Huffman编码过程的几个步骤:l)将信号源的符号按照出现概率递减的顺序排列。(注意,一定要递减)2)将
34、最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。3)重复进行步骤1和2直到概率相加的结果等于1为止。4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。 下面我举个简单例子: 一串信号源Ss1,s2,s3,s4,s5对应概率为p40,30,15,10,5,(百分率)按照递减的格式排列概率后,根据第二步,会得到一个新的概率列表,依然按照递减排列,注意:如果遇到相同概率,合并后的概率放在下面!最后概率最大的编码为0,最小的编码为1,所以,编码结果为: s1=1 s2=00 s3=0
35、10 s4=0110 s5=0111霍夫曼编码的特点:1 编出来的码都是异字头码,保证了码的唯一可译性。2 由于编码长度可变。因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。3 编码长度不统一,硬件实现有难度。4 对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100的编码效率;若信号源符号的概率相等,则编码效率最低。5 由于0与1的指定是任意的,故由上述过程编出的最佳码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。限于篇幅原因,在此就不再详述。2.3 JPEG压缩要求1 达到或接近当前压缩比与图像保真度的技术水平,与原始图像相比,人的视觉难以区分
36、2 能适用于任何种类的连续色调的图像,且长宽比都不受限制,同时也不受限于景物内容、图像复杂度。3 压缩以后的数据,对于图像数据的存储来说,节省了存储空间,使得原有的存储设备, 能够用来存储更多的信息。而对图像的传输而言,则减少了传输率,节省了传输时间,解决了数据量大和带宽有限的问题。2.4 JPEG解码原理1.读入文件按照JFIF文件格式,将JPEG文件相关的字段信息一一读取出来,并进行相应的解析。例如,图像的宽度、高度、量化表、Huffman表、水平/垂直采样因子等。一般而言,JFIF格式文件的读取顺序依次为:SOI字段;APP0字段;APPn字段;DQT字段;SOFO字段;DHT字段;SO
37、S字段;压缩数据字段;EOI字段;读取JPEG文件相关信息的时候,有两点需要特别注意:由于JPEG中以0XFF来做为特殊标记符,因此,如果某个像素的取值为0XFF,那么实际在保存的时候,是以0XFF00来保存的,从而避免其跟特殊标记符0XFF之间产生混淆。所以,在读取文件信息的时候,如果遇0XFF00,就必须去除后面的00;即,将0XFF00当做0XFF;JPEG文件中,一个字(16位)的存储是采用了Motorola格式(big-endian),而不是我们常用的Intel格式(little-endian)。因此,如果需要的话,请在处理之间进行依次高低字节的转换。2.霍夫曼码构建在标记码DHT之
38、后,包含了一个或者多个Huffman表(通常是4个表)。对于一个Huffman表而言,它包含了以下三部分内容:表ID和表类型;1个字节;仅有4个可选的取值,0X00,0X01,0X10,0X11,分别表示DC直流0号表,DC直流1号表,AC交流0号表,AC交流1号表;不同位数的码字数量;前面提到,JPEG中的Huffman编码表是按照编码长度的位数以表格的形式保存的,而且,Huffman编码表的位数只能是1-16位,因此,这里用16个字节来分别表示1-16位的每种位长的编码在Huffman树中的个数。编码内容;该字段记录了Huffman树中各个叶子节点的权重,上一个字段(不同位数的码字数量)的
39、16个数值之和,就是本字段的长度,也就是Huffman树中叶子节点的个数。这里,我们不妨以下面一段Huffman表的数据为例来说明情况(均以16进制表示):11 00 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以上数据串中第一行代表了Huffman表ID、表类型、不同位数的码字数量信息;第一行的第一个字节0X11代表了表的ID和类型是AC交流1号表;第一行的第2到第17字节代表了不同位数码字的数量。即,第2个字节00表示没有位数为1的编码;第3个和第
40、4个字节的02表示位数为2和位数为3的编码各有两个;第5个字节的00表示没有位数为5的编码。此外,通过这些数据我们发现,此Huffman树有0+2+2+0+5+1+6+1=17个叶子节点。第二行为编码的内容,表明17个叶子节点按照从小到大的顺序排列,即,权值依次为0,1,11,2,21,3,31,41.读取到Huffman表的数据之后,就需要构建Huffman树了。其具体规则如下 (a)第一个编码的数字必定为0;如果第一个编码的位数为1,就被编码为0;如果第一个编码的位数为2,就被编码为00;如果第一个编码的位数为3,就被编码为000。 (b)从第二个编码开始,如果它和它前面编码具有相同的位数
41、,则当前编码是它前面的编码加1;如果它的编码位数比它前面的编码位数大,则当前编码时它前面的编码加1之后再在后面添加若干个0,直到满足编码位数的长度为止。还是以上面的数据为例:第一行的第2个字节00表示没有位数为1的编码;第一行的第3个字节02表示位数为2的编码有2个;由于没有位数为1的编码,因此这里位数为2的编码中的第一个为00,第二个为00+1=01;第一行的第4个字节02表示位数为3的编码有2个;因此,这里位数为3的编码中的第一个为01+1=10,然后添加1个“0”,得到100;位数为3的编码中的第二个为100+1=101;以此类推。特别提醒的是,如果中间有某个位数的编码缺失,例如,没有4
42、位的编码,则应该在3位的编码后面加1,添加2个“00”补足5位,形成下一个5位编码。3.系数解码DC系数是以(A,B)的中间形式进行编码的。其中的A代表了B的二进制编码位数,B则利用VLI进行编码。另外,8*8的图像块经过DCT变换之后得到的8*8的系数矩阵,经过Huffman编码及RLE编码之后,写入编码数据的时候,DC系数也是被写在数据流最前面的。因此,解码的时候,DC系数也是最先被读取出来,假设,我们一次性读入了若干个字节长度的数据。其中的第一个字节代表了DC系数的Huffman编码,通过查找DC系数的Huffman表(亮度表或色度表),得到该Huffman编码所在的组编号,该编号就是D
43、C系数中间格式(A,B)中的A,也就是B的位数。例如,A=2,就代表B采用2位二进制数进行编码。这样一来,读取接下来的A位二进制数,将其译码为十进制,就得到了DC系数的差值。将该差值与上一个DC系数值相加,就得到了真正的当前DC系数的值。处理完DC系数之后,接下来进行AC系数的译码工作,显然,这里依然需要读取一个Huffman编码,通过查找AC系数的Huffman编码表,进行解码,我们得到(A,B)的数据对,其中的A代表了0的个数,而B则代表了后面数据的位数。例如,(2,3)就代表了当前AC系数之前有2个0,下一个需要读取的二进制数据是3位。需要提醒的是,(0,0)代表EOB,即8*8块的编码结束。接着,读取B位二进制数据,进行译码,我们就得到了AC系数的值。如此反复循环,直到遇到EOB,或者读取了63个AC系数,我们就完成了一个8*8块的系数矩阵的译码工作。4.反量化 反Zig-zag扫描 DCT逆变换在译码得到了8*8的系数矩阵之后,我们需要进行反量化工作。该步骤,就是将前一个步骤得到的8*8系数矩阵分别乘以8