资源描述
目录目录1摘要2Abstract31. 设计要求42. JPEG图像压缩原理52.1图像压缩技术简介52.2JPEG图像压缩根本原理66910111213152.3 JPEG压缩要求162.4 JPEG解码原理163. 基于MATLAB的算法实现213.1 JPEG压缩设计213.2基于DCT变换系统设计223.3 量化程序设计233.4 Z扫描系统设计243.4 霍夫曼编码设计254. 仿真265. 总结286. 参考文献29附录130附录233摘要图像的数字化表示使得图像信号可以高质量地传输,并便于图像的检索、分析、处理和存储。但是数字图像的表示需要大量的数据,必须进行数据的压缩。因此图像压缩编码技术的研究显得特别有意义,也正是由于图像压缩编码技术及传输技术的不断开展、更新,推动了现代多媒体技术应用的迅速开展。本设计在研究JPEG压缩编码对图像数据压缩的根本原理的根底上,设计了JPEG仿真方案和程序实现流程,根据流程图编写了JPEG压缩编码的仿真程序,并利用MATLAB软件对仿真程序进行了调试,验证了JPEG压缩编码对图像数据压缩的可行性。通过运行JPEG仿真程序输出了原图像,重建图像,以及二者的差值图像,通过直观比较,发现经过JPEG仿真程序压缩后的图像仍有很好的视觉效果。通过对输出的压缩比,峰值信噪比等参数的研究,科学的论证了JPEG压缩编码对图像数据巨大的压缩效果以及良好的压缩质量。实验结果说明基于DCT 变换的JPEG 图像压缩方法简单、方便,既能保证有较高的压缩比,又能保证有较好的图像质量,应用MATLAB仿真出来的结果较好的反响了其编码算法原理。关键词:JPEG,DCT,MATLAB,图像压缩AbstractDigital images that make high-quality image signal can be transmitted, and to 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 technology 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 compression 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 visual 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 compression quality. Keywords:JPEG, Huffman, DCT, quantization, MATLAB simulation1. 设计要求图像通信之前需要进行数据量压缩,编程实现JPEG图像压缩标准的主要环节,完成压缩和解压过程,计算压缩比。 要求:将彩色图像进行颜色空间转换、对不同的颜色分量进行不同的采样、对于3个分量进行88的DCT变换、对DCT系数矩阵按照JPEG推荐的量化表进行量化;对量化后的系数进行Z形扫描,最后进行熵编码,形成码流,计算比特数,和压缩比。解压从量化后的DCT系数表开始逆向进行。通过分析知道本次设计要求主要是对图像进行压缩处理,涉及了JPEG图像压缩的环节,掌握其过程原理。2. JPEG图像压缩原理2.1图像压缩技术简介图像压缩是减少表示数字图像时需要的数据量图像数据的压缩基于两点:1图像信息存在着很大的冗余度,数据之间存在着相关性,如相邻像素之间色彩的相关性等。2人眼是图像信息的接收端。因此,可利用人的视觉对于边缘急剧变化不敏感视觉掩盖效应,以及人眼对图像的亮度信息敏感、对颜色分辨率弱的特点实现高压缩比,而解压缩后的图像信号仍有着满意的主观质量。1.图像压缩的根本原理图像数据之所以能被压缩,就是因为数据中存在着冗余。图像数据的冗余主要表现为:图像中相邻像素间的相关性引起的空间冗余;图像序列中不同帧之间存在相关性引起的时间冗余;不同彩色平面或频谱带的相关性引起的频谱冗余。数据压缩的目的就是通过去除这些数据冗余来减少表示数据所需的比特数。由于图像数据量的庞大,在存储、传输、处理时非常困难,因此图像数据的压缩就显得非常重要。信息时代带来了“信息爆炸,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩。在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面。图像压缩是数据压缩技术在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据。2.图像压缩根本方法图像压缩可以是有损数据压缩也可以是无损数据压缩。对于如绘制的技术图、图表或者漫画优先使用无损压缩,这是因为有损压缩方法,尤其是在低的位速条件下将会带来压缩失真。如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩方法。有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的有时是无法感知的,这样就可以大幅度地减小位速。无损图像压缩方法有:行程长度编码熵编码法如 LZW 这样的自适应字典算法有损压缩方法有:将色彩空间化减到图像中常用的颜色。所选择的颜色定义在压缩图像头的调色板中,图像中的每个像素都用调色板中颜色索引表示。这种方法可以与 抖动(en:dithering)一起使用以模糊颜色边界。色度抽样,这利用了人眼对于亮度变化的敏感性远大于颜色变化,这样就可以将图像中的颜色信息减少一半甚至更多。变换编码,这是最常用的方法。首先使用如离散余弦变换DCT或者小波变换这样的傅立叶相关变换,然后进行量化和用熵编码法压缩。分形压缩en:Fractal compression。2.2JPEG图像压缩根本原理输入图像色彩转换图像分块Dct量化dc系数 ac系数块间DPCMZ字型扫描Huffman编 码Huffman编 码DC哈夫曼表压缩数据AC哈夫曼表解 码码 表反量化量化表IDCT恢复的图像数据量化表图2-1JPEG图像压缩根本原理图工具箱用RGB图像中直接描述颜色,或者在索引图像中间接描述颜色,此时,彩色映射使用RGB格式来储存。然而,还有其他的色彩空间又称彩色模型,他们的应用有时会更加方便或更加恰当。其中包括NTSC、YCbCr、HSV、CMY、CMYK和YUV色彩空间。NTSC色彩空间:NTSC彩色制式在美国用于电视系统。这种形式的有点是灰度信息和彩色信息是别离的,所以同一个信号既可以用于彩色电视,又可以用于黑白电视机。在NTSC制式中,图像数据是有三局部组成的:亮度Y、色调I和饱和度Q,其中字母YIQ选择常常是按照惯例进行的。亮度分量描述灰度信息的,其他俩个分量携带电视信号的彩色信息。YIQ这几个分量都是利用如下变换从一副RGB分量中得到的:Y=0.229R+0.587G+0.114BI=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采用的是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位的无符号整数,从而方便数据的存储和计算。 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.100*B; 式2-4数据分块采样:在彩色图像中,JPEG分别压缩图像的每个彩色分量。虽然JPEG可以压缩通常的红绿蓝分量,但在YCbCr空间的压缩效果会更好。这是因为人眼对色彩的变化敏感,因而对色彩的编码可以比对亮度的编码粗糙些。这主要表达在不同的采样频率和量化精度上,因此,编码前一般先将图像从RGB空间转换到YCbCr空间。研究发现,人眼对亮度变换的敏感度要比对色彩变换的敏感度高出很多。因此,我们可以认为Y分量要比Cb,Cr分量重要的多。在BMP图片中,RGB三个分量各采用一个字节进行采样,也就是我们常听到的RGB888的模式;而JPEG图片中,通常采用两种采样方式:YUV411和YUV422,它们所代表的意义是Y,Cb,Cr三个分量的数据取样比例一般是4:1:1或者4:2:24: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张表中去。然后由左及右,由上到下依次读取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矩阵分块图DCTDiscrete Cosine Transform,离散余弦变换,是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT是先将整体图像分成N*N的像素块,然后针对N*N的像素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而解码过程那么需要反向离散余弦变换。正向离散余弦变换计算公式:反向离散余弦变换计算公式:DCT编码属于正交变换编码方式,用于去除图像数据的空间冗余。变换编码就是将图像光强矩阵(时域信号)变换到系数空间(频域信号)上进行处理的方法。在空间上具有强相关的信号,反映在频域上是在某些特定的区域内能量常常被集中在一起,或者是系数矩阵的分布具有某些规律。我们可以利用这些规律在频域上减少量化比特数,到达压缩的目的。图像经DCT变换以后,DCT系数之间的相关性就会变小。而且大局部能量集中在少数的系数上,因此,DCT变换在图像压缩中非常有用,是有损图像压缩国际标准JPEG的核心。从原理上讲可以对整幅图像进行DCT变换,但由于图像各部位上细节的丰富程度不同,这种整体处理的方式效果不好。为此,发送者首先将输入图像分解为8*8或16*16块,然后再对每个图像块进行二维DCT变换,接着再对DCT系数进行量化、编码和传输;接收者通过对量化的DCT系数进行解码,并对每个图像块进行的二维DCT反变换。最后将操作完成后所有的块拼接起来构成一幅单一的图像。对于一般的图像而言,大多数DCT系数值都接近于0,所以去掉这些系数不会对重建图像的质量产生较大影响。因此,利用DCT进行图像压缩确实可以节约大量的存储空间。在实验中,先将输入的原始lena图像分为8*8块,然后再对每个块进行二维DCT变换。MATLAB图像处理上具箱中提供的二维DCT变换及DCT反变换函数如下。dct2实现图像的二维离散余弦变换。其语法格式为:(1)B=dct2(A) 返回图像A的二维离散余弦变换值,其大小与A相同且各元素为离散余弦变换的系数BK1,k2)。(2)B=dct2(A,in,n)或B=dct2(A,m,n) 如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至m*n如果m和n比图像A小。那么进行变换之前,将图像A剪切。idct2可以实现图像的二维离散余弦反变换,其语法格式为:B=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系数。图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个那么是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保存了整数近似值,也就再度损失了一些数据内容。在JPEG算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后者粗量化。 以下图给出JPEG的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的。当然,你也可以自定义量化表。表2-1 亮度量化值表1611101624405161 12 1214192658605514131624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399表2-2 色度量化值表17182447999999991821266699999999242656999999999947669999999999999999999999999999999999999999999999999999999999999999999999999999这两张表依据心理视觉阀制作, 对 8bit 的亮度和色度的图象的处理效果不错。量化表是控制 JPEG 压缩比的关键,这个步骤除掉了一些高频量, 损失了很多细节信息。但事实上人眼对高频信号的敏感度远没有低频信号那么敏感。所以处理后的视觉损失很小,从上面的量化表也可以看出,低频局部采用了相对较短的量化步长,而高频局部那么采用了相对较长的量化步长,这样做,也是为了在一定程度上得到相对清晰的图像和更高的压缩率。另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程,而大量的图象信息被包含在低频率空间中,经过DCT处理后, 在高频率局部, 将出现大量连续的零。DCT系数量化后,用Zzigzag形扫描将其变成一维数列,这样做的目的是有利于熵编码,Z形扫描的顺序如图2-2 所示: 图2-2 zig-zag扫描示意图 DCT 将一个 8x8 的数组变换成另一个 8x8 的数组. 但是内存里所有数据都是线形存放的, 如果我们一行行的存放这 64 个数字, 每行的结尾的点和下行开始的点就没有什么关系, 所以 JPEG 规定按如以下图中的数字顺序依次保存和读取64 个DCT的系数值。表3-3DCT系数值 这样数列里的相邻点在图片上也是相邻的了。不难发现,这种数据的扫描、保存、读取方式,是从8*8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为Zigzag扫描排序。如以下图所示: 图2-3 z扫描示意图在做DC编码之前,还必须对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编码哈夫曼识别码或称标志码DC差值二进制代码 表3-4、3-5给出了Y、Cb Cr矩阵的DC差值霍夫曼编码表。表3-4 Y矩阵DC差值参考表DC差值二进制码的码长Huffman识别码的码长Huffman识别码0200130102301133100431015311064111075111108611111097111111010811111110119111111110表3-5 Cb、Cr矩阵DC差值参考表二进制码的码长Huffman识别码的码长Huffman识别码0200120122103311044111055111106611111077111111088111111109911111111010101111111110111111111111110由于霍夫曼编码的对象是整数,所以在做霍夫曼编码之前,还得对量化后的DCT系数矩阵进行取整。经过取整以后,每一个88块中,有大量的AC系数的值为0。为了把尽可能多的其值为0的AC系数串在一起,以利于第四步的AC编码及提高压缩比,还必须把YcbCr矩阵中的每一个88块中的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-4: AC编码码串图2-4完整AC编码图完整的AC编码码串包括三局部:1的位置记录“0的个数;2的位置为霍夫曼识别码;3的位置的AC值的二进制代码值这样的一个码串才算是一个完整的AC霍夫曼码串。将直流元素转换成与上一个之差之后,接下来将DCT块重新排序成ZigZag序列,再后,JPEG用一个熵编码机制送出元素,输出带有建立在其中的RLE,它是编码机制的主要局部,根本上,熵编码输出包括三个单词的序列,不断重复直到块结束,三个单词如下:1.行程长度DCT输出矩阵中,当前元素之前的连续0 的个数2.位计数 后面跟着的幅度值所用的位数3.幅度 DCT系数的幅度行程长度和位计数这两个值的组合,形成了输出的代码。位计数是将幅度可变长度整型编码所使用的位数目。可变长度整型数编码利用了DCT的输出应该由大多数较小的数值所组成的事实,因此我们想用较少的位数目进行编码。下面是位计数及用这个数目编码的系数幅度: 位计数 幅度 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位开始的较小的位计数进行编码。Huffman编码过程的几个步骤:l将信号源的符号按照出现概率递减的顺序排列。注意,一定要递减2将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。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=010 s4=0110 s5=0111霍夫曼编码的特点:1 编出来的码都是异字头码,保证了码的唯一可译性。2 由于编码长度可变。因此译码时间较长,使得霍夫曼编码的压缩与复原相当费时。3 编码长度不统一,硬件实现有难度。4 对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,到达100的编码效率;假设信号源符号的概率相等,那么编码效率最低。5 由于0与1的指定是任意的,故由上述过程编出的最正确码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。限于篇幅原因,在此就不再详述。2.3 JPEG压缩要求1 到达或接近当前压缩比与图像保真度的技术水平,与原始图像相比,人的视觉难以区分2 能适用于任何种类的连续色调的图像,且长宽比都不受限制,同时也不受限于景物内容、图像复杂度。3 压缩以后的数据,对于图像数据的存储来说,节省了存储空间,使得原有的存储设备, 能够用来存储更多的信息。而对图像的传输而言,那么减少了传输率,节省了传输时间,解决了数据量大和带宽有限的问题。2.4 JPEG解码原理1.读入文件按照JFIF文件格式,将JPEG文件相关的字段信息一一读取出来,并进行相应的解析。例如,图像的宽度、高度、量化表、Huffman表、水平/垂直采样因子等。一般而言,JFIF格式文件的读取顺序依次为:SOI字段;APP0字段;APPn字段;DQT字段;SOFO字段;DHT字段;SOS字段;压缩数据字段;EOI字段;读取JPEG文件相关信息的时候,有两点需要特别注意:由于JPEG中以0XFF来做为特殊标记符,因此,如果某个像素的取值为0XFF,那么实际在保存的时候,是以0XFF00来保存的,从而防止其跟特殊标记符0XFF之间产生混淆。所以,在读取文件信息的时候,如果遇0XFF00,就必须去除后面的00;即,将0XFF00当做0XFF;JPEG文件中,一个字16位的存储是采用了Motorola格式big-endian,而不是我们常用的Intel格式little-endian。因此,如果需要的话,请在处理之间进行依次上下字节的转换。2.霍夫曼码构建在标记码DHT之后,包含了一个或者多个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树中各个叶子节点的权重,上一个字段不同位数的码字数量的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个和第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从第二个编码开始,如果它和它前面编码具有相同的位数,那么当前编码是它前面的编码加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位的编码,那么应该在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编码所在的组编号,该编号就是DC系数中间格式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*8的量化矩阵即可。JPEG编码过程中,为了编码方便,采用了Zig-zag扫描,因此,这里需要进行反Zig-zag扫描,重新排列8*8的反量化系数矩阵。反Zig-zag扫描的输入时8*8矩阵,输出依然是8*8矩阵,只不过,数据的排列方式有所不同而已。DCT变换,将原始图像变换到频域,而DCT逆变换,就是要将数据从频域变换回时域。DCT逆变换的计算公式为:DCT逆变换的公式,可以改写为:f=AFA 其中A为矩阵: 对上面的公式进行变形Y =FAf =AT YfT =(AT Y)T =YT A其中F为数据块。经分析可知,完成一次DCT逆变换需要4步:1:压缩数据块88F矩阵与矩阵A88相乘,得到矩阵Y88;2:对矩阵Y进行转秩得到88YT3:YT再与矩阵A相乘得到88的矩阵ft 4:对ft 进行转秩得到f,这里的f即为经过DCT逆变换之后得到的时域的原始图像; DCT逆变换的流程图如下所示:图2-5 DCT逆变换 A矩阵乘法器的作用是实现输入矩阵和A矩阵的相乘。注意A矩阵在乘法的右边。 iDCT变换的对象是8 8的数据单元,既输入数据共64个,按行输入,每8个数据为一行。每输入一行数据就分别和A矩阵的每一列进行乘加运算,每完成一次这样的乘加运算就输出一次结果。比方,输入第一行数据,分别和A矩阵的各列相乘,按顺序输出8个结果,这8个结果就是输出矩阵的第一行;当输入第二行数据时,同样输出8个结果,这8个结果是输出矩阵的第二行。所以经过第一次矩阵乘法之后得到的是Y矩阵。 转秩就是对64个数据进行重新排列,例如,对于矩阵M而言,将其第一行第二列的数据M1,2跟其第一列第二行的数据M2,1进行互换,如下表所示:左边为未转秩的数据顺序,右边为转秩之后的数据顺序。5.颜色转换BMP图片是以RGB颜色空间进行保存的,因此,将JPEG解码为BMP必须进行颜色模式的转换。另外,由于DCT要求的定义域对称,所以,在编码的时候将RGB的数值范围从0,255统一减去128,将数值范围转换到-128,127的范围内。因此,解码的时候,必须为每个颜色分量加上128。另外需要注意的是,通过解码变换之后得到的RGB的值有可能超过255或者小于0;如果小于0,就截断为0,如果大于255,就截取为255。3. 基于MATLAB的算法实现3.1 JPEG压缩设计开 始输入一幅原始图像根据量化表,对变换系数进行量化分成8*8像素块,分别做DCT变换对经扫描得到的DC和AC系数分别进行Huffman熵编码得到整个图像编码后的比特序列,并计算压缩比特率对DC和AC系数分别进行Huffman熵编码结 束对量化后的变化系数进行ZigZag扫描简单说明:要将一幅彩色图像进行压缩编码,首先将图像RGB 分量转化为亮度分量和色差分量,然后将图像分成88的象素块,用正向二维DCT 把每个块转变成64 个DCT 系数值,其中1 个数值是直流(DC)系数,即88 空域图像子块的平均值,其余的63 个是交流(AC)系数,接下来对DCT 系数进行Zig-Zag 扫描和Huffman 编码,实现了图像压缩。3.2基于DCT变换系统设计开 始载入原始图像是YUV?RGB-YUV设置压缩比设置原始图像已对原始图像进行8*8分块?对图像进行分块显示压缩后的图像进行DCT反变换重排系数块设置压缩比保存系数求出DCT系数的排列矩阵进行DCT变换结 束NYYN此局部可分为三个过程:原始图像的载入,颜色模式转换及采样以及DCT变换3.3 量化程序设计开 始结 束计算矢量距离的子函数进行分块处理设置码书的大小设置码字的大小求出图像像素的行数和列数装入和显示原始图像图像文件的显示。 在MATLAB中,可以调用image函数来显示图像,其语法格式为: Image(C)image是用来显示附标图像,即显示的图像上有x、y坐标轴的显示,可以看到图像的像素大小。量化过程是控制 JPEG 压缩比的关键。 这个步骤除掉了一些高频量, 损失了很高细节。 但事实上人眼对高空间频率远没有低频敏感。所以处理后的视觉损失很小。另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程。 大量的图象信息被包含在低空间频率中。 经过量化处理后, 在高空间频率段, 将出现大量连续的零。3.4 Z扫描系统设计开 始产生顺序递增地址数据写入数据存储器是否写满一个数据块?扫描地址表输出符合Zig-Zag顺序的地址数据按扫描顺序输出数据结 束NY矢量中有许多连续的 0,可以使用 RLE 来压缩掉这些 0。假设有一组矢量(64 个的后 63 个,已按z字形扫描得到) 是57,45,0,0,0,0,23,0,-30,-16,0,0,1,0,0,0, 0 , 0 ,0 , 0,0经过 RLC 压缩后就是(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-16) ; (2,1) ; EOB,EOB 是一个结束标记, 表示后面都是 0 了,用 (0,0) 表示 EOB.但是, 如果这组数字不以 0 结束, 那么就不需要 EOB。3.4 霍夫曼编码设计开 始结 束装入Huffman数据使左分支编码为1,右分支编码为0将消息添加到队列的最后为N-1消息重新进行排列做准 备遍历至原始消息,即叶子节点,输出读码字分别遍历左右分支节点获得Huffman码字将最后两个出现概率最小的消息合成一个消息将N个消息进行排序初始化原始消息数排序列表初始化码字初始化为0霍夫曼编码局部:for i=1:numresi=blanks(260);cd=blanks(260);start=num;c=i;p=ht(c).pare;while(p0)if(ht(p).lch=c)cd(start)=0;Else cd(start)=1;end c=p;p=ht(c).pare;start=start-1;end4. 仿真 5. 总结运行JPEG仿真程序结果显示,JPEG压缩编码对图像数据确实可以做到大幅度的压缩,而且压缩后的图片质量尚可。通过本次仿真,我们可以发现JPEG压缩编码在对静态图像处理中的表现非常优秀,这也正是JPEG之所以具有强大生命力的原因所在。本设计主要介绍了JPEG的编码。该程序的编码局部能把一张BMP格式的图象进行JEPG编码,压缩成以二进制形式保存的文件。论文表达的图像压缩编码算法,采用了JPEG的核心离散余弦变换算法。DCT是正交变换,它可以将8*8图像的空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,因此它在软件中容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。在这次课程设计的整个过程中,收获主要有以下几点:1)开始编程前,一定要了解系统意图,做好规划。2)很好地实现了理论知识与实践的结合。把以往所学的专业知识和编程思想应用到了实际设计当中,比较顺利地解决了综合设计中遇到的一些问题。同时对所学的理论知识也有了更深刻、更系统的了解。同时也增强了运用所学知识解决实际问题的能力。3)通过这次课程设计,很好的领会了程序设计的思想。4)这次课程设计中,虚心向老师和其它同学请教,与其团结协作,很好地培养了我的团队精神和协作能力。通过学习和交流,看到了别人的优点,也发现了自己的缺乏,以后要进一步完善自己,总的说来,通过这次课程设计锻炼了自己查阅资料、阅读和使用软件的能力,对各种软件的应用和操作能力,以及编程能力。确实学到不少知识,得到很好的锻炼。6. 参考文献1 扬帆.数字图像处理与分析M.北京航空航天大学出版社.2022. 102 傅祖芸.信息论:根底理论与应用M.电子工业出版社.2022.53 4 严剑. 离散余弦变换在图像压缩中的应用J. 计算机与现代化. 1996, 45 贾铸.算术编码方法在图像压缩编码中的应用J. 电视技术. 1999.56 于晓宇,傅志中,唐学怡. JPEG标准以下图像压缩算法的研究与实现J. 计算机与现代化. 1996, 47 8 9 邱磊. JPEG算法研究及实现J. Computer Era No.9 2022 10 陈思思,王耀楠. 基于DSP的JPEG图像压缩编码的实现J.计算机测量与控制. 2022.1附录1%*图像颜色空间变换*%x=imread(D:船.jpg); figure(1)subplot(2,2,1)imshow(x);title(原始图像);ycbcrx=rgb2ycbcr(x)a=ycbcrxsubplot(2,2,2)imshow(a,);title(ycbcr彩色空间);yiqx=rgb2ntsc(x)b=yiqx;subplot(2,2,3)imshow(b,);title(ntsc彩色空间)x=double(x);R=x(:,:,1);G=x(:,:,2);B=x(:,:,3);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.100*B;c=cat(3,Y,U,V);subplot(2,2,4)imshow(c,);title(yuv彩色空间)%*%亮度量化表 LQT=16 11 10 16 24 40 51 61; 12 12 14 19 26 58 60 55; 14 13 16 24 40 57 69 56; 14 17 22 29 51 87 80 62; 18 22 37 56 68 109 103 77; 24 35 55 64 81 104 113 92; 49 64 78 87 103 121 120 101; 72 92 95 98 112 100 103 99; %色度量化表 CQT=17 18 24 47 99 99 99 99; 18 21 26 66 99 99 99 99; 24 26 56 99 99 99 99 99; 47 66 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99; 99 99 99 99 99 99 99 99;
展开阅读全文