还剩37页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
多媒体通信毕业设计论文目录TOC\o1-3\h\u目录1摘要2Abstract
31.设计要求
42.JPEG图像压缩原理
52.1图像压缩技术简介
52.2JPEG图像压缩基本原理
62.
1.1颜色空间转换以及图像分量采样
62.
1.2离散余弦变换(DCT)
92.
2.3系数量化
102.
2.4Zigzag扫描排序
112.
2.5DC系数调制编码
122.
2.6AC系数调制编码
132.
2.7霍夫曼编码
152.3JPEG压缩要求
162.4JPEG解码原理
163.基于MATLAB的算法实现
213.1JPEG压缩设计
213.2基于DCT变换系统设计
223.3量化程序设计
233.4Z扫描系统设计
243.4霍夫曼编码设计
254.仿真
265.总结
286.参考文献29附录130附录233摘要图像的数字化表示使得图像信号可以高质量地传输,并便于图像的检索、分析、处理和存储但是数字图像的表示需要大量的数据,必须进行数据的压缩因此图像压缩编码技术的研究显得特别有意义,也正是由于图像压缩编码技术及传输技术的不断发展、更新,推动了现代多媒体技术应用的迅速发展本设计在研究JPEG压缩编码对图像数据压缩的基本原理的基础上,设计了JPEG仿真方案和程序实现流程,根据流程图编写了JPEG压缩编码的仿真程序,并利用MATLAB软件对仿真程序进行了调试,验证了JPEG压缩编码对图像数据压缩的可行性通过运行JPEG仿真程序输出了原图像,重建图像,以及二者的差值图像,通过直观比较,发现经过JPEG仿真程序压缩后的图像仍有很好的视觉效果通过对输出的压缩比,峰值信噪比等参数的研究,科学的论证了JPEG压缩编码对图像数据巨大的压缩效果以及良好的压缩质量实验结果表明基于DCT变换的JPEG图像压缩方法简单、方便既能保证有较高的压缩比,又能保证有较好的图像质量,应用MATLAB仿真出来的结果较好的反应了其编码算法原理关键词JPEG,DCT,MATLAB,图像压缩AbstractDigitalimagesthatmakehigh-qualityimagesignalcanbetransmittedandtofacilitateimageretrievalanalysisprocessingandstorage.Butthedigitalimagesthatrequirelargeamountsofdatathedatamustbecompressed.Thereforeimagecompressioncodingtechnologyresearchisparticularlymeaningfulandbecausetheimagecompressiontechnologyandtransmissiontechnologycontinuestodevelopupdateandpromotetheapplicationofmodernmultimediatechnologytodeveloprapidly.IhaveJPEGcompressionin-depthstudyonthebasicprinciplesofimagedatacompressionbasedonJPEGemulatorhandsdrawnflowchartflowchartwaspreparedaccordingtoJPEGcompressionsimulationprogramandthesimulationprogramusingMATLABsoftwarewasdebuggedtoverifytheJPEGcompressionofimagedatacompressionisfeasible.SimulationprogrambyrunningtheoutputoftheoriginalJPEGimagereconstructedimageandthedifferencebetweenthetwoimagesbyvisualcomparisonfoundthroughsimulationprogramcompressedJPEGimageisstillverygoodvisualeffects.CompressionratioontheoutputpeaksignaltonoiseratioandotherparametersofthestudyscientificproofoftheJPEGimagedatacompressioncodingofthegreatcompressionandgoodcompressionquality.Keywords:JPEGHuffmanDCTquantizationMATLABsimulation
1.
2.设计要求图像通信之前需要进行数据量压缩,编程实现JPEG图像压缩标准的主要环节,完成压缩和解压过程,计算压缩比要求将彩色图像进行颜色空间转换、对不同的颜色分量进行不同的采样、对于3个分量进行8×8的DCT变换、对DCT系数矩阵按照JPEG推荐的量化表进行量化;对量化后的系数进行Z形扫描,最后进行熵编码,形成码流,计算比特数,和压缩比解压从量化后的DCT系数表开始逆向进行通过分析知道本次设计要求主要是对图像进行压缩处理,涉及了JPEG图像压缩的环节,掌握其过程原理
2.JPEG图像压缩原理
2.1图像压缩技术简介图像压缩是减少表示数字图像时需要的数据量图像数据的压缩基于两点
(1)图像信息存在着很大的冗余度,数据之间存在着相关性,如相邻像素之间色彩的相关性等
(2)人眼是图像信息的接收端因此,可利用人的视觉对于边缘急剧变化不敏感(视觉掩盖效应),以及人眼对图像的亮度信息敏感、对颜色分辨率弱的特点实现高压缩比,而解压缩后的图像信号仍有着满意的主观质量
1.图像压缩的基本原理图像数据之所以能被压缩,就是因为数据中存在着冗余图像数据的冗余主要表现为图像中相邻像素http://baike.baidu.com/view/
575.htm间的相关性引起的空间冗余;图像序列中不同帧之间存在相关性引起的时间冗余;不同彩色平面或频谱带的相关性引起的频谱冗余数据压缩http://baike.baidu.com/view/
286827.htm的目的就是通过去除这些数据冗余http://baike.baidu.com/view/
575274.htm来减少表示数据所需的比特数由于图像数据量的庞大在存储http://baike.baidu.com/view/
87682.htm、传输、处理时非常困难因此图像数据的压缩就显得非常重要信息时代带来了“信息爆炸”,使数据量大增,因此,无论传输或存储都需要对数据进行有效的压缩在遥感技术中,各种航天探测器采用压缩编码技术,将获取的巨大信息送回地面图像压缩是数据压缩技术http://baike.baidu.com/view/
1320634.htm在数字图像上的应用,它的目的是减少图像数据中的冗余信息从而用更加高效的格式存储和传输数据
2.图像压缩基本方法图像压缩可以是有损数据压缩http://baike.baidu.com/view/
583477.htm也可以是无损数据压缩http://baike.baidu.com/view/
583473.htm对于如绘制的技术图、图表或者漫画优先使用无损压缩http://baike.baidu.com/view/
156047.htm,这是因为有损压缩http://baike.baidu.com/view/
128147.htm方法,尤其是在低的位速http://baike.baidu.com/view/
1129.htm条件下将会带来压缩失真如医疗图像或者用于存档的扫描图像等这些有价值的内容的压缩也尽量选择无损压缩http://baike.baidu.com/view/
156047.htm方法有损方法非常适合于自然的图像,例如一些应用中图像的微小损失是可以接受的(有时是无法感知的),这样就可以大幅度地减小位速http://baike.baidu.com/view/
1129.htm无损图像压缩方法有行程长度编码http://baike.baidu.com/view/
1624827.htm熵编码法http://baike.baidu.com/view/
2076005.htm如LZW这样的自适应字典算法有损压缩http://baike.baidu.com/view/
128147.htm方法有将色彩空间化减到图像中常用的颜色所选择的颜色定义在压缩图像头的调色板http://baike.baidu.com/view/
1120949.htm中,图像中的每个像素http://baike.baidu.com/view/
575.htm都用调色板中颜色索引表示这种方法可以与抖动en:dithering一起使用以模糊颜色边界色度抽样http://baike.baidu.com/view/
411182.htm,这利用了人眼对于亮度变化的敏感性远大于颜色变化,这样就可以将图像中的颜色信息减少一半甚至更多变换编码http://baike.baidu.com/view/
3658770.htm,这是最常用的方法首先使用如离散余弦变换http://baike.baidu.com/view/
391624.htm(DCT)或者小波变换http://baike.baidu.com/view/
586841.htm这样的傅立叶相关变换,然后进行量化和用熵编码法http://baike.baidu.com/view/
2076005.htm压缩分形压缩http://baike.baidu.com/view/
893310.htm(en:Fractalcompression)
2.2JPEG图像压缩基本原理图2-1JPEG图像压缩基本原理图
2.
1.1颜色空间转换以及图像分量采样工具箱用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=rgb2ntscrgb_image同上理IPT函数ntsc2rgb用于实现ntsc转换为RGB rgb_image=ntsc2rgbyiq_imageYCbCr彩色空间YCbCr1Cb是蓝色分量和一个彩色空间广泛用于数字电视在这种格式中,亮度信息单个分量Y来表示,彩色信息用俩个色差Cb和Cr来储存分量Cb是蓝色分量和一个参考值的差,分量Cr是红色分量和一个参考值的差JPEG采用的是YCrCb颜色空间,而BMP采用的是RGB颜色空间,要想对BMP图片进行压缩,首先需要进行颜色空间的转换YCrCb颜色空间中,Y代表亮度,CrCb则代表色度和饱和度也有人将CbCr两者统称为色度,三者通常以YUV来表示,即用U代表Cb,用V代表CrRGB和YCrCb之间的转换关系如下所示Y=
0.299R+
0.587G+
0.114BCb=-
0.1687R-
0.3313G+
0.5B+128Cr=
0.5R=
0.418G-
0.0813B+128(式2-2)一般来说,C值包括CbCr应该是一个有符号的数字但这里通过加上128,使其变为8位的无符号整数,从而方便数据的存储和计算R=Y+
1.402Cr-128G=Y-
0.34414Cb-128-
0.71414Cr-128B=Y+
1.772Cb-128(式2-3)通过以上的算法可以得到转换函数ycbcr_image=rgb2ycbcrrgb_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分量要比CbCr分量重要的多在BMP图片中,RGB三个分量各采用一个字节进行采样,也就是我们常听到的RGB888的模式;而JPEG图片中,通常采用两种采样方式YUV411和YUV422,它们所代表的意义是YCbCr三个分量的数据取样比例一般是411或者422(411含义就是在2x2的单元中,本应分别有4个Y,4个U,4个V值,用12个字节进行存储经过4:1:1采样处理后,每个单元中的值分别有4个Y、1个U、1个V,只要用6个字节就可以存储了)这样的采样方式,虽然损失了一定的精度但也在人眼不太察觉到的范围内减小了数据的存储量当然,JPEG格式里面也允许将每个点的UV值都记录下来;由于后面的DCT变换是是对8x8的子块进行处理的,因此,在进行DCT变换之前必须把源图象数据进行分块源图象中每点的3个分量是交替出现的,先要把这3个分量分开,存放到3张表中去然后由左及右,由上到下依次读取8x8的子块,存放在长度为64的表中,即可以进行DCT变换注意,编码时,程序从源数据中读取一个8x8的数据块后,进行DCT变换,量化,编码,然后再读取、处理下一个8*8的数据块图2-2矩阵分块图
2.
1.2离散余弦变换(DCT)DCT(DiscreteCosineTransform,离散余弦变换),是码率压缩中常用的一种变换编码方法任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义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实现图像的二维离散余弦变换其语法格式为 1B=dct2A返回图像A的二维离散余弦变换值,其大小与A相同且各元素为离散余弦变换的系数B(K1,k2 2B=dct2A,in,n或B=dct2A[m,n]如果m和n比图像A大,在对图像进行二维离散余弦变换之前,先将图像A补零至m*n如果m和n比图像A小则进行变换之前,将图像A剪切 idct2可以实现图像的二维离散余弦反变换,其语法格式为 B=idct2A;B=idct2A,m,n或B=idct2A,[m,n]图像数据块分割后,即以MCU为单位顺序将DU进行二维离散余弦变换对以无符号数表示的具有P位精度的输入数据,在DCT前腰减去2P-1转换成有符号数;而在IDCT后,应加上2P-1,,转换成无符号数对每个8×8的数据块DU进行DCT后,得到的64个系数代表了该图像块的频率成分,其中低频分量集中在左上角,高频分量分布在右下角系数矩阵左上角的称为直流(DC)系数,它代表了该数据块的平均值;其余63个称为交流(AC)系数
2.
2.3系数量化图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容在JPEG算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表前者细量化,后者粗量化下图给出JPEG的亮度量化表和色度量化表,该量化表是从广泛的实验中得出的当然,你也可以自定义量化表表2-1亮度量化值表1611101624405161121214192658605514131624405769561417222951878062182237566810910377243555648110411392496478871031211201017292959811210010399表2-2色度量化值表17182447999999991821266699999999242656999999999947669999999999999999999999999999999999999999999999999999999999999999999999999999这两张表依据心理视觉阀制作对8bit的亮度和色度的图象的处理效果不错量化表是控制JPEG压缩比的关键,这个步骤除掉了一些高频量损失了很多细节信息但事实上人眼对高频信号的敏感度远没有低频信号那么敏感所以处理后的视觉损失很小,从上面的量化表也可以看出,低频部分采用了相对较短的量化步长,而高频部分则采用了相对较长的量化步长,这样做,也是为了在一定程度上得到相对清晰的图像和更高的压缩率另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程,而大量的图象信息被包含在低频率空间中,经过DCT处理后在高频率部分将出现大量连续的零
2.
2.4Zigzag扫描排序DCT系数量化后,用Z(zigzag)形扫描将其变成一维数列,这样做的目的是有利于熵编码,Z形扫描的顺序如图2-2所示图2-2zig-zag扫描示意图DCT将一个8x8的数组变换成另一个8x8的数组.但是内存里所有数据都是线形存放的如果我们一行行的存放这64个数字每行的结尾的点和下行开始的点就没有什么关系所以JPEG规定按如下图中的数字顺序依次保存和读取64个DCT的系数值表3-3DCT系数值这样数列里的相邻点在图片上也是相邻的了不难发现,这种数据的扫描、保存、读取方式,是从8*8矩阵的左上角开始,按照英文字母Z的形状进行扫描的,一般将其称之为Zigzag扫描排序如下图所示图2-3z扫描示意图
2.
2.5DC系数调制编码在做DC编码之前,还必须对DC值进行脉冲差值运算,8×8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大根据这个特点,才使用了差分脉冲调制编码(DPCM)技术,对相邻图像块之间量化DC系数的差值(Delta)进行编码,Delta=DC00k-DC00k-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差值二进制代码表3-
4、3-5给出了Y、CbCr矩阵的DC差值霍夫曼编码表表3-4Y矩阵DC差值参考表DC差值二进制码的码长Huffman识别码的码长Huffman识别码0200130102301133100431015311064111075111108611111097111111010811111110119111111110表3-5Cb、Cr矩阵DC差值参考表二进制码的码长Huffman识别码的码长Huffman识别码
02001201221033110441110551111066111110771111110881111111099111111110101011111111101111111111111102.
2.6AC系数调制编码由于霍夫曼编码的对象是整数,所以在做霍夫曼编码之前,还得对量化后的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-4图2-4完整AC编码图完整的AC编码码串包括三部分
(1)的位置记录“0”的个数;
(2)的位置为霍夫曼识别码;
(3)的位置的AC值的二进制代码值这样的一个码串才算是一个完整的AC霍夫曼码串将直流元素转换成与上一个之差之后,接下来将DCT块重新排序成Zig-Zag序列,再后,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位开始的较小的位计数进行编码
2.
2.7霍夫曼编码Huffman编码过程的几个步骤l)将信号源的符号按照出现概率递减的顺序排列(注意,一定要递减)2)将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率3)重复进行步骤1和2直到概率相加的结果等于1为止4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码 下面我举个简单例子: 一串信号源S={s1s2s3s4s5}对应概率为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.3JPEG压缩要求1达到或接近当前压缩比与图像保真度的技术水平,与原始图像相比,人的视觉难以区分2能适用于任何种类的连续色调的图像,且长宽比都不受限制,同时也不受限于景物内容、图像复杂度3压缩以后的数据,对于图像数据的存储来说,节省了存储空间,使得原有的存储设备,能够用来存储更多的信息而对图像的传输而言,则减少了传输率,节省了传输时间,解决了数据量大和带宽有限的问题
2.4JPEG解码原理
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个可选的取值,0X000X010X100X11,分别表示DC直流0号表,DC直流1号表,AC交流0号表,AC交流1号表;不同位数的码字数量;前面提到JPEG中的Huffman编码表是按照编码长度的位数以表格的形式保存的,而且,Huffman编码表的位数只能是1--16位,因此,这里用16个字节来分别表示1--16位的每种位长的编码在Huffman树中的个数编码内容;该字段记录了Huffman树中各个叶子节点的权重,上一个字段(不同位数的码字数量)的16个数值之和,就是本字段的长度,也就是Huffman树中叶子节点的个数这里,我们不妨以下面一段Huffman表的数据为例来说明情况(均以16进制表示)11000202000501060100000000000000000001110221033141125161718191221332以上数据串中第一行代表了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个叶子节点按照从小到大的顺序排列,即,权值依次为
011122133141...读取到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系数是以(AB)的中间形式进行编码的其中的A代表了B的二进制编码位数,B则利用VLI进行编码另外,8*8的图像块经过DCT变换之后得到的8*8的系数矩阵,经过Huffman编码及RLE编码之后,写入编码数据的时候,DC系数也是被写在数据流最前面的因此,解码的时候,DC系数也是最先被读取出来,假设,我们一次性读入了若干个字节长度的数据其中的第一个字节代表了DC系数的Huffman编码,通过查找DC系数的Huffman表(亮度表或色度表),得到该Huffman编码所在的组编号,该编号就是DC系数中间格式(AB)中的A,也就是B的位数例如,A=2,就代表B采用2位二进制数进行编码这样一来,读取接下来的A位二进制数,将其译码为十进制,就得到了DC系数的差值将该差值与上一个DC系数值相加,就得到了真正的当前DC系数的值处理完DC系数之后,接下来进行AC系数的译码工作,显然,这里依然需要读取一个Huffman编码,通过查找AC系数的Huffman编码表,进行解码,我们得到AB的数据对,其中的A代表了0的个数,而B则代表了后面数据的位数例如,
(23)就代表了当前AC系数之前有2个0,下一个需要读取的二进制数据是3位需要提醒的是,
(00)代表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=AτFA其中A为矩阵对上面的公式进行变形Y=FAf=ATYfT=ATYT=YTA其中F为数据块经分析可知,完成一次DCT逆变换需要4步1压缩数据块(8×8)F矩阵与矩阵A(8×8)相乘,得到矩阵Y(8×8);2对矩阵Y进行转秩得到(8×8)YT3YT再与矩阵A相乘得到8×8的矩阵ft4对ft进行转秩得到f这里的f即为经过DCT逆变换之后得到的时域的原始图像;DCT逆变换的流程图如下所示图2-5DCT逆变换A矩阵乘法器的作用是实现输入矩阵和A矩阵的相乘注意A矩阵在乘法的右边iDCT变换的对象是8×8的数据单元,既输入数据共64个,按行输入,每8个数据为一行每输入一行数据就分别和A矩阵的每一列进行乘加运算,每完成一次这样的乘加运算就输出一次结果比如,输入第一行数据,分别和A矩阵的各列相乘,按顺序输出8个结果,这8个结果就是输出矩阵的第一行;当输入第二行数据时,同样输出8个结果,这8个结果是输出矩阵的第二行所以经过第一次矩阵乘法之后得到的是Y矩阵转秩就是对64个数据进行重新排列,例如,对于矩阵M而言,将其第一行第二列的数据M
(12)跟其第一列第二行的数据M
(21)进行互换,如下表所示左边为未转秩的数据顺序,右边为转秩之后的数据顺序
5.颜色转换BMP图片是以RGB颜色空间进行保存的,因此,将JPEG解码为BMP必须进行颜色模式的转换另外,由于DCT要求的定义域对称,所以,在编码的时候将RGB的数值范围从
[0255]统一减去128,将数值范围转换到[-128127]的范围内因此,解码的时候,必须为每个颜色分量加上128另外需要注意的是,通过解码变换之后得到的RGB的值有可能超过255或者小于0;如果小于0,就截断为0,如果大于255,就截取为
2553.基于MATLAB的算法实现
3.1JPEG压缩设计简单说明要将一幅彩色图像进行压缩编码,首先将图像RGB分量转化为亮度分量和色差分量,然后将图像分成8×8的象素块,用正向二维DCT把每个块转变成64个DCT系数值其中1个数值是直流DC系数即8×8空域图像子块的平均值其余的63个是交流AC系数接下来对DCT系数进行Zig-Zag扫描和Huffman编码,实现了图像压缩
3.2基于DCT变换系统设计此部分可分为三个过程原始图像的载入,颜色模式转换及采样以及DCT变换
3.3量化程序设计图像文件的显示在MATLAB中,可以调用image函数来显示图像,其语法格式为ImageCimage是用来显示附标图像,即显示的图像上有x、y坐标轴的显示,可以看到图像的像素大小量化过程是控制JPEG压缩比的关键这个步骤除掉了一些高频量,损失了很高细节但事实上人眼对高空间频率远没有低频敏感所以处理后的视觉损失很小另一个重要原因是所有的图片的点与点之间会有一个色彩过渡的过程大量的图象信息被包含在低空间频率中经过量化处理后,在高空间频率段,将出现大量连续的零
3.4Z扫描系统设计矢量中有许多连续的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;EOBEOB是一个结束标记,表示后面都是0了用0,0表示EOB.但是,如果这组数字不以0结束,那么就不需要EOB
3.4霍夫曼编码设计 霍夫曼编码部分fori=1:numres{i}=blanks260;cd=blanks260;start=num;c=i;p=htc.pare;whilep0ifhtp.lch==ccdstart=0;Elsecdstart=1;endc=p;p=htc.pare;start=start-1;end
4.仿真
5.总结运行JPEG仿真程序结果显示,JPEG压缩编码对图像数据确实可以做到大幅度的压缩,而且压缩后的图片质量尚可通过本次仿真,我们可以发现JPEG压缩编码在对静态图像处理中的表现非常优秀,这也正是JPEG之所以具有强大生命力的原因所在本设计主要介绍了JPEG的编码该程序的编码部分能把一张BMP格式的图象进行JEPG编码,压缩成以二进制形式保存的文件论文叙述的图像压缩编码算法,采用了JPEG的核心离散余弦变换算法DCT是正交变换,它可以将8*8图像的空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,因此它在软件中容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像在这次课程设计的整个过程中,收获主要有以下几点1开始编程前,一定要了解系统意图,做好规划2很好地实现了理论知识与实践的结合把以往所学的专业知识和编程思想应用到了实际设计当中,比较顺利地解决了综合设计中遇到的一些问题同时对所学的理论知识也有了更深刻、更系统的了解同时也增强了运用所学知识解决实际问题的能力3通过这次课程设计,很好的领会了程序设计的思想4这次课程设计中,虚心向老师和其它同学请教,与其团结协作,很好地培养了我的团队精神和协作能力通过学习和交流,看到了别人的优点,也发现了自己的不足,以后要进一步完善自己,总的说来,通过这次课程设计锻炼了自己查阅资料、阅读和使用软件的能力,对各种软件的应用和操作能力,以及编程能力确实学到不少知识,得到很好的锻炼
6.参考文献
[1]扬帆.数字图像处理与分析[M].北京航空航天大学出版社.
2007.10
[2]傅祖芸.信息论基础理论与应用[M].电子工业出版社.
2007.5
[3]刘玮,王红星.图像的无损压缩编码方法及JPEG标准模式[J].现代电子技术.
2002.5
[4]严剑.离散余弦变换在图像压缩中的应用[J].计算机与现代化.19964
[5]贾铸.算术编码方法在图像压缩编码中的应用[J].电视技术.
1999.5
[6]于晓宇,傅志中,唐学怡.JPEG标准下图像压缩算法的研究与实现[J].计算机与现代化.19964
[7]王成优.侯正信.JPEG图像压缩编码及其MATLAB仿真实现[J].电子测量技术.
2007.1
[8]孙即祥.图像压缩与投影重建[M].科学出版社.
2005.1
[9]邱磊.JPEG算法研究及实现[J].ComputerEraNo.92009
[10]陈思思,王耀楠.基于DSP的JPEG图像压缩编码的实现[J].计算机测量与控制.
2008.1附录1%*****************图像颜色空间变换*******************************%x=imreadD:\船.jpg;figure1subplot221imshowx;title原始图像;ycbcrx=rgb2ycbcrxa=ycbcrxsubplot222imshowa[];titleycbcr彩色空间;yiqx=rgb2ntscxb=yiqx;subplot223imshowb[];titlentsc彩色空间x=doublex;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=cat3YUV;subplot224imshowc[];titleyuv彩色空间%***************************************%亮度量化表LQT=[1611101624405161;1212141926586055;1413162440576956;1417222951878062;182237566810910377;243555648110411392;49647887103121120101;7292959811210010399];%色度量化表CQT=[1718244799999999;1821266699999999;2426569999999999;4766999999999999;9999999999999999;9999999999999999;9999999999999999;9999999999999999];%******************************************%******************************************%彩色图像分块采样D=doublex;a1=rgb2ycbcrD;Y=a1::1;Cr=a1::2;Cb=a1::3;[MN]=sizeY;Y_last_Z=0;Cr_last_Z=0;Cb_last_Z=0;Y_jpeg2=;Cr_jpeg2=;Cb_jpeg2=;fori=0:M/8-1forj=0:N/8-1S1=Y1+8*i:8*i+11+8*j:8*j+1;%分割成8*8处理S2=Cr1+8*i:8*i+11+8*j:8*j+1;S3=Cb1+8*i:8*i+11+8*j:8*j+1;A1=dct2S1;%DCTA2=dct2S2;A3=dct2S3;B1=roundA
1./LQT;%亮度量化B2=roundA
2./CQT;%色度量化B3=roundA
3./CQT;%色度量化%亮度量化的逆变换C4=roundB
1.*LQT;C5=roundB
2.*CQT;C6=roundB
3.*CQT;%DCT逆变换S4=idct2C4;S5=idct2C5;S6=idct2C6;%分块重组Y1+8*i:8*i+11+8*j:8*j+1=S4;Cr1+8*i:8*i+11+8*j:8*j+1=S5;Cb1+8*i:8*i+11+8*j:8*j+1=S6;%**********************************************************%Zigzag扫描Z1=ZigzagB1;Z2=ZigzagB2;Z3=ZigzagB3;%*********************************************************%Huffman编码%*****************************%直流分量编码(DC_HuffmanDCH_Y=DC_HuffmanZ11Y_last_Z1;DCH_Cr=DC_HuffmanZ21Cr_last_Z2;DCH_Cb=DC_HuffmanZ31Cb_last_Z2;%交流分量编码AC_HUffmanACH_Y=AC_HuffmanZ12:end1;ACH_Cr=AC_HuffmanZ22:end2;ACH_Cb=AC_HuffmanZ32:end2;Y_last_Z=Z11;Cr_last_Z=Z21;Cb_last_Z=Z31;Y_jpeg2=[Y_jpeg2DCH_YACH_Y];Cr_jpeg2=[Cr_jpeg2DCH_CrACH_Cr];Cb_jpeg2=[Cb_jpeg2DCH_CbACH_Cb];endendfigure2subplot231;imshowA1;titleY采样后DCT;subplot232;imshowA1;titlecr采样后DCT;subplot233;imshowA1;titlecb采样后DCT;subplot234;imshowB1;titleY亮度量化;subplot235;imshowB2;titlecr色度量化;subplot236;imshowB3;titlecb色度量化;jpeg2=[Y_jpeg2Cr_jpeg2Cb_jpeg2];rate2=8*M*N*3/lengthjpeg2;%压缩比%****************************************figure3;subplot131;imshowY;title解压的Y分量图像;subplot132;imshowCr;title解压的Cr分量图像;subplot133;imshowCb;title解压的Cb分量图像;a1::1=Y;a1::2=Cr;a1::3=Cb;figure4;imshowYCbCr;title解压的YCbCr的图像;x1=ycbcr2rgbYCbCr;figure5imshowx1附录2AC_huffmanfunctionACH=AC_HuffmanACn;%亮度AC系数码表T1={10100001100101111010111100011111000111111011011111111100000101111111110000011;110011011111100111111011011111110110111111111000010011111111100001011111111110000110111111111000011111111111100010000;111001111100111111101111111111101001111111110001001111111111000101011111111100010111111111110001100111111111000110111111111100011100;11101011111011111111111010111111111100011111111111110010000111111111001000111111111100100101111111110010011111111111001010011111111100101010;1110111111111000111111111001011011111111100101111111111110011000111111111001100111111111100110101111111110011011111111111001110011111111100111010;111101011111110111111111111001111011111111100111111111111110100000111111111010000111111111101000101111111110100011111111111010010011111111101000010;1111011111111110110111111111010011011111111101001111111111110101000111111111010100111111111101010101111111110101011111111111010110011111111101011010;11111010111111110111111111111010111011111111101011111111111110110000111111111011000111111111101100101111111110110011111111111011010011111111101101010;111111000111111111000000111111111011011011111111101101111111111110111000111111111011100111111111101110101111111110111011111111111011110011111111101111010;1111110011111111110111110111111111011111111111111110000001111111111000001111111111100001011111111110000111111111111000100111111111100010111111111110001100;1111110101111111111000111111111111100100011111111110010011111111111001010111111111100101111111111110011001111111111001101111111111100111011111111110011110;11111110011111111111010000111111111101000111111111110100101111111111010011111111111101010011111111110101011111111111010110111111111101011111111111110110000;11111110101111111111011001111111111101101011111111110110111111111111011100111111111101110111111111110111101111111111011111111111111110000011111111111000010;111111110001111111111100010111111111110001111111111111001001111111111100101111111111110011011111111111001111111111111101000111111111110100111111111111010100;11111111111010111111111111101100111111111110110111111111111011101111111111101111111111111111000011111111111100011111111111110010111111111111001111111111111101000;111111110011111111111110101111111111111011011111111111101111111111111111000111111111111100111111111111110101111111111111011111111111111110011111111111111011111111111111111};%色度AC系数码表T2={00011001010110001100111100011110001111101001111110110111111110100;1011111001111101101111101011111111011011111111010111111111100010001111111110001001111111111000101011111111100010110;11010111101111111110111111111110110111111111000010111111111000110011111111100011011111111110001110111111111000111111111111100100000;110101111101111111110111111111101101111111110010001111111111001001011111111100100111111111110010100111111111001010111111111100101100;111010111110110111111111001011111111111100110001111111110011001111111111001101011111111100110111111111110011100111111111001110111111111100111100;1110111111111001111111111001111111111111101000001111111110100001111111111010001011111111101000111111111110100100111111111010010111111111101000100;111100111111110111111111111010011111111111101010001111111110101001111111111010101011111111101010111111111110101100111111111010110111111111101011100;111101011111111000111111111010111111111111101100001111111110110001111111111011001011111111101100111111111110110100111111111011010111111111101101100;111110011111111110110111111111111011100011111111101110011111111110111010111111111011101111111111101111001111111110111101111111111011111011111111101111110;1111101111111111111000000111111111100000111111111110000101111111111000011111111111100010011111111110001011111111111000110111111111100011111111111110010000;1111110001111111111001001111111111100101011111111110010111111111111001100111111111100110111111111110011101111111111001111111111111101000011111111110100010;1111110011111111111010010111111111101001111111111110101001111111111010101111111111101011011111111110101111111111111011000111111111101100111111111110110100;1111110101111111111011011111111111101110011111111110111011111111111011110111111111101111111111111111000001111111111100001111111111110001011111111111000110;111111110011111111111100100111111111110010111111111111001101111111111100111111111111110100011111111111010011111111111101010111111111110101111111111111011000;111111111000001111111111101101111111111110111011111111111011111111111111110000111111111111000111111111111100101111111111110011111111111111010011111111111101010;1111111010111111111000011111111111111011011111111111101111111111111111000111111111111100111111111111110101111111111111011111111111111110011111111111111011111111111111111};%RLC行程编码k=0;j=1;fori=1:63ifACi==0k15%非零系数前的零个数小于15k=k+1;elseifk==15%非零个数为15RLCj=15;RLCj+1=0;else%没有零在前面RLCj=k;RLCj+1=ACi;endk=0;j=j+2;endend%最后一个数是零ifAC63==0RLCj=0;RLCj+1=0;end%之前有若干组15个连零whilelengthRLC2ifRLClengthRLC==0RLClengthRLC-2==0RLC=RLC1:lengthRLC-2;RLClengthRLC-1=0;elsebreakendendACH=;fori=1:2:lengthRLCNNNN=RLCi;ifRLCi+1==0SSSS=0;elseifabsRLCi+1==1SSSS=1;elseifabsRLCi+1=2absRLCi+1=3SSSS=2;elseifabsRLCi+1=4absRLCi+1=7SSSS=3;elseifabsRLCi+1=8absRLCi+1=15SSSS=4;elseifabsRLCi+1=16absRLCi+1=31SSSS=5;elseifabsRLCi+1=32absRLCi+1=63SSSS=6;elseifabsRLCi+1=64absRLCi+1=127SSSS=7;elseifabsRLCi+1=128absRLCi+1=255SSSS=8;elseifabsRLCi+1=256absRLCi+1=511SSSS=9;elseifabsRLCi+1=512absRLCi+1=1023SSSS=10;end%%求前缀码S1ifn==1ifNNNN==0|NNNN==15S1=charT1NNNN+1SSSS+1;elseS1=charT1NNNN+1SSSS;endelseifNNNN==0|NNNN==15S1=charT2NNNN+1SSSS+1;elseS1=charT2NNNN+1SSSS;endend%%求尾码S2ifRLCi==0RLCi+1==0S2=;elseifRLCi+1=0S2=dec2binRLCi+1;elseS2=dec2binabsRLCi+1;fori=1:lengthS2ifS2i==1S2i=0;elseS2i=1;endendendendACH=[ACHS1S2];end%%DC_Huffman.mfunctionDCH=DC_HuffmanZlast_Zn;%亮度码字T1={00010011100101110111011110111110111111011111110111111110};%色度码字T2={000110110111011110111110111111011111110111111110111111111011111111110};DIFF=Z-last_Z;ifDIFF==0SSSS=0;elseifabsDIFF==1SSSS=1;elseifabsDIFF=2absDIFF=3SSSS=2;elseifabsDIFF=4absDIFF=7SSSS=3;elseifabsDIFF=8absDIFF=15SSSS=4;elseifabsDIFF=16absDIFF=31SSSS=5;elseifabsDIFF=32absDIFF=63SSSS=6;elseifabsDIFF=64absDIFF=127SSSS=7;elseifabsDIFF=128absDIFF=255SSSS=8;elseifabsDIFF=256absDIFF=511SSSS=9;elseifabsDIFF=512absDIFF=1023SSSS=10;elseifabsDIFF=1024absDIFF=2047SSSS=11;end%前缀码ifn==1S1=charT1SSSS+1;elseS1=charT2SSSS+1;end%后缀码ifDIFF=0S2=dec2binabsDIFF;elseS2=dec2binabsDIFF;fori=1:lengthS2ifS2i==0;S2i=1;elseS2=0;endendendDCH=[S1S2];functionZ=ZigzagS;%Zigzag表ZT=[015614152728;2471316262942;38121725304143;911182431404453;1019233239455254;2022333846515560;2134374750565961;3536484957586263];Z=zeros164;fori=1:8forj=1:8ZZTij+1=Sij;endend输入图像色彩转换图像分块Dct量化dc系数ac系数块间DPCMZ字型扫描Huffman编码Huffman编码DC哈夫曼表压缩数据AC哈夫曼表解码码表反量化量化表IDCT恢复的图像数据量化表12563478……Y矩阵CbCr123……816M8M/28M/28M/28M/2eq\o\ac○1eq\o\ac○2eq\o\ac○3AC编码码串开始输入一幅原始图像根据量化表,对变换系数进行量化分成8*8像素块,分别做DCT变换对经扫描得到的DC和AC系数分别进行Huffman熵编码得到整个图像编码后的比特序列,并计算压缩比特率对DC和AC系数分别进行Huffman熵编码结束对量化后的变化系数进行Zig—Zag扫描开始载入原始图像是YUVRGB-YUV设置压缩比设置原始图像已对原始图像进行8*8分块对图像进行分块显示压缩后的图像进行DCT反变换重排系数块设置压缩比保留系数求出DCT系数的排列矩阵进行DCT变换结束NYYN开始结束计算矢量距离的子函数进行分块处理设置码书的大小设置码字的大小求出图像像素的行数和列数装入和显示原始图像开始产生顺序递增地址数据写入数据存储器是否写满一个数据块扫描地址表输出符合Zig-Zag顺序的地址数据按扫描顺序输出数据结束NY开始结束装入Huffman数据使左分支编码为1,右分支编码为0将消息添加到队列的最后为N-1消息重新进行排列做准备遍历至原始消息,即叶子节点,输出读码字分别遍历左右分支节点获得Huffman码字将最后两个出现概率最小的消息合成一个消息将N个消息进行排序初始化原始消息数排序列表初始化码字初始化为0。