您的当前位置:首页JPEG图像压缩与解压

JPEG图像压缩与解压

2024-01-20 来源:乌哈旅游
武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

课程设计任务书

学生姓名: 专业班级: 指导教师: 工作单位: 信息工程学院

题 目: 通信工程应用技术综合训练与设计 初始条件:MATLAB软件,电脑,图像处理基础知识 要求完成的主要任务:

图像通信之前需要进行数据量压缩,编程实现JPEG图像压缩标准的主要环节,完成压缩和解压过程,计算压缩比。

要求:将彩色图像进行颜色空间转换、对不同的颜色分量进行不同的采样、对于3个分量进行8×8的DCT变换、对DCT系数矩阵按照JPEG推荐的量化表进行量化;对量化后的系数进行Z形扫描,最后进行熵编码,形成码流,计算比特数,和压缩比。解压从量化后的DCT系数表开始逆向进行。

时间安排:

序号 1 2 3 设 计 内 容 根据设计任务,确定实验方案 根据实验条件进行仿真,并对结果进行分析 撰写课程设计报告 合 计 所用时间 2天 7天 1天 2周

指导教师签名: 年 月 日

系主任(或责任教师)签名: 年 月 日

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

目 录

摘 要 .................................................................................. I ABSTRACT ............................................................................... II 1设计任务 .............................................................................. 1 1.1设计目的 .......................................................................... 1 1.2设计任务要求 ...................................................................... 1 1.3 设计工具 .......................................................................... 1 2 JPEG图像压缩和解压原理分析 ........................................................... 3 2.1图像压缩技术基础 .................................................................. 3 2.2 JPEG压缩编码基本原理 ............................................................. 3 2.2.1 颜色空间转换 数据分块及采样 .................................................. 3 2.2.2 二维离散余弦变换 .............................................................. 4 2.2.3 DCT系数的量化 ................................................................ 5 2.2.4 量化系数Z形扫描 .............................................................. 7 2.2.5 DC系数的编码 ................................................................. 9 2.2.6 AC系数的编码 ................................................................ 10 2.2.7 霍夫曼编码 ................................................................... 11 2.2.8组成位数据流 ................................................................. 11 2.3.JPEG解码原理 .................................................................... 14 2.3.1.读入文件 ..................................................................... 14 2.3.2.霍夫曼码构建 ................................................................. 14 2.3.3.系数解码 ..................................................................... 15 2.3.4.反量化 反Z形扫描 DCT逆变换 ............................................... 16 2.3.5.颜色转换 ..................................................................... 17 2.4 DCT图像压缩的模型 ............................................................... 18 3 JPEG图像压缩MATLAB仿真设计实现 ..................................................... 19 3.1程序流程图 ....................................................................... 19 3.1.1 数字图像文件的读写 ........................................................... 19 3.1.2 DCT变换的编程实现 ........................................................... 19 3.1.3量化程序设计 ................................................................. 23 3.1.4 Z形扫描设计 ................................................................. 23 4 仿真结果 ............................................................................. 24 4.1仿真过程图像 ..................................................................... 24 4.2 结果分析 ......................................................................... 24 小结 ................................................................................... 27 参考文献 ............................................................................... 28 程序: ................................................................................. 29

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

摘 要

随着科学技术的发展,图像压缩技术越来越引起人们的关注。为此从众多的图像压缩编码标准中选取了基于DCT变换的JPEG图像压缩编码算法进行研究,并通过对比分析各种软件特性选取了MATLAB进行实验仿真。

首先说明了图像压缩在现代通信中的必要性和可行性,然后讲述了MATLAB及其图像处理工具箱的相关知识,并对基于DCT变换的JPEG图像压缩算法进行了详细的研究,重点介绍了JPEG压缩编码的具体过程和方法 ,详细介绍了编码中DCT变换、量化、熵编码和霍夫曼编码等模块的原理和数学推导以及各模块的功能分析。最后应用MATLAB进行了实验仿真并分析结果得出结论。

实验结果表明基于DCT 变换的JPEG 图像压缩方法简单、方便,既能保证有较高的压缩比,又能保证有较好的图像质量,应用MATLAB仿真出来的结果较好的反应了其编码算法原理。

关键词:JPEG图像压缩;DCT;MATLAB;图像处理工具箱

I

武汉理工大学《通信工程应用技术课设》

Abstract

With the development of science and technology, image compression technology is increasingly a cause for concern . To do this , select from a large number of image compression coding standard DCT- based JPEG image compression coding algorithm research , and a variety of software features selected MATLAB simulation experiments by comparative analysis.

First, the necessity and feasibility of image compression in modern communication, and knowledge about the MATLAB and Image Processing Toolbox , and JPEG image compression algorithm based on DCT transform carried out a detailed study focuses on the JPEG specific processes and methods of compression , detailing the coding DCT, quantization , functional theory and mathematical derivation entropy coding and Huffman coding modules and each module analysis . Finally, the application of MATLAB simulation and experimental results of the analysis concluded .

Experimental results show that the JPEG image compression method based on DCT transform simple, convenient , can guarantee a higher compression ratio , but also ensures better image quality , the application of MATLAB simulation results come out better reflect the principles of the coding algorithm .

Keywords :JPEG image compression ; DCT; MATLAB; Image Processing Toolbox

II

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

1设计任务

1.1设计目的

通过课程设计,使学生加强对图像处理分析计算以及设计。进一步提高分析解决实际问题的能力,通过完成综合设计型和创新性实验及训练,创造一个动脑动手﹑独立开展设计的机会,锻炼分析﹑解决电子电路问题的实际本领,实现由课本知识向实际能力的转化;通过分析知道本次设计要求主要是对图像进行压缩处理,涉及了JPEG图像压缩的环节,掌握其过程原理

1.2设计任务要求

图像通信之前需要进行数据量压缩,编程实现JPEG图像压缩标准的主要环节,完成压缩和解压过程,计算压缩比。

图1-1图像通信

将彩色图像进行颜色空间转换、对不同的颜色分量进行不同的采样、对于3个分量进行8×8的DCT变换、对DCT系数矩阵按照JPEG推荐的量化表进行量化;对量化后的系数进行Z形扫描,最后进行熵编码,形成码流,计算比特数,和压缩比。解压从量化后的DCT系数表开始逆向进行。

1.3 设计工具

MATLAB是由美国MathWorks公司推出的计算机软件,经过多年的逐步发展与不断完善,现已成为国际公认的最优秀的科学计算与数学应用软件之一,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一个方便的、界面友好的用户环境,而且还具有可扩

1

武汉理工大学《通信工程应用技术课设》

展性特征。MATLAB中的数字图像是以矩阵形式表示的,矩阵运算的语法对MATLAB中的数字图像同样适用,这意味着MATLAB强大的矩阵运算能力对用于图像处理非常有利。 图像处理工具箱(Image Processing Toolbox)提供了一套全方位的参照标准算法和图形工具,用于进行图像处理、分析、可视化和算法开发。可进行图像压缩、空间转换、图像增强、特征检测、降噪、图像分割和图像配准等功能。工具箱中大部分函数均以开放式 MATLAB 语言编写,这意味着可以检查算法、修改源代码和创建自定义函数。本文利用MATLAB图像处理工具箱对基于DCT的JPEG图像压缩编码理论算法进行仿真,实验证明该软件功能强大,语言简洁易学,工具箱具有丰富的技术支持并集成了该领域专家的智慧,应用简单而效果良好。

2

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

2 JPEG图像压缩和解压原理分析

2.1图像压缩技术基础

图像数据的压缩基于两点:(1)图像信息存在着很大的冗余度,数据之间存在着相关性,如相邻像素之间色彩的相关性等。(2)人眼是图像信息的接收端。因此,可利用人的视觉对于边缘急剧变化不敏感(视觉掩盖效应),以及人眼对图像的亮度信息敏感、对颜色分辨率弱的特点实现高压缩比,而解压缩后的图像信号仍有着满意的主观质量。

从信号系统的角度理解,数据的压缩就是对原来信号进行某种变换。借助这种变换,信号的表达更经济,存储传输更为方便。从信息论角度理解,信号本身的具体表达形式不过是其内在携带信息的外在表象,一定的信息可以用各种形式加以体现,每种表达形式的表达效率并不相同,存在着信息冗余。数据压缩的目的就是寻找在一定约束条件下最为高效的信息表达方式。从压缩技术的角度理解,数据压缩一般分为:建模、去相关、量化、编码四道工序。

2.2 JPEG压缩编码基本原理

2.2.1 颜色空间转换 数据分块及采样

JPEG文件使用的颜色空间为1982年推荐的电视图像数字化标准CCIR 601(现为ITU-RB T.601)。在这个色彩空间中,每个分量、每个像素的电平规定为255级,用8位代码表示。JPEG只支持YCbCr颜色模式。其中Y代表亮度,Cb,Cr代表色度。全彩色图像RGB模式转换到YCbCr模式,用下组公式。

Y0.299R0.587G0.114BCr(RY)/1.402  Cb(BY)/1.772其逆变换为:

(2-1)

RY1.402Cr GY0.344Cb0.714Cr (2-2)

BY1.772CbJPEG是以8×8的块为单位来进行处理的,由于人眼对亮度Y的敏感度比色度CbCr的敏感度大的多,所以采用缩减取样的方式,通常采用YUV422取样,图2-1所示。

3

武汉理工大学《通信工程应用技术课设》

Cb Cb Cr Y Cr Y

图2-1 YUV422取样示意图

即对于16×16的块,Y取4个8×8的块,CbCr各取2个8×8的块。也有YUV411方式,Y取4个8×8的块,CbCr各取1个8×8的块。YUV422取样方式,数据减少1/3。YUV411取样方式,数据减少1/2。缩减取样一般采用图2-2所示方法。

„ a b c d e „ b' d'

图2-2 压缩取样示意图

2.2.2 二维离散余弦变换

DCT(Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT是先将整体图像分成N*N的像素块,然后针对N*N的像素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换。

在傅里叶级数展开式中,如果被展开的函数是实偶函数,那么,其傅里叶技术中只包含余弦项,在将其离散化由此可导出余弦变换,或称之为离散余弦变换(DCT,Discrete Cosine Transform)。

二维离散余弦正变换公式为

2N1N12x12y1ucosv (2-3) Fu,vcucvfx,ycosNx0y02N2N1式中,x,y,u,v0,1,,N1。c(u)c(v)21

4

u0,v0其它

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

二维离散余弦逆变换公式为

2N1N12x12y1fx,ycucvFu,vcosucosv (2-4)

Nu0v02N2N1u0,v0式中,x,y,u,v0,1,,N1。c(u)c(v)2

其它1JPEG采用的是8×8大小的子块的二维离散余弦变换。在编码器的输入端,把原始图像顺序地分割成一系列8×8的子块,子块的数值在-128到127之间。采用余弦变换获得64个变换系数。

变换公式,如式(2-5)所示。

7712x12y1Fu,vcucvfx,ycosucosv (2-5)

41616x0y01式中,x,y,u,v0,1,,7。c(u)c(v)21u0,v0其它

在MATLAB的图像处理工具箱中,可以直接调用dct2和idct2来实现二维离散余弦变换及其反变换。

DCT变换具有能量集中的性质,其低频分量都集中在左上角,高频分量分布在右下角(DCT变换实际上是空间域的低通滤波器)。由于该低频分量包含了图像的主要信息(如亮度),而高频与之相比,就不那么重要了,所以我们可以忽略高频分量,从而达到压缩的目的。将高频分量去掉,这就要用到量化,它是产生信息损失的根源。

2.2.3 DCT系数的量化

图像数据转换为DCT频率系数之后,还要进行量化阶段,才能进入编码过程。量化阶段需要两个8*8量化矩阵数据,一个是专门处理亮度的频率系数,另一个则是针对色度的频率系数,将频率系数除以量化矩阵的值之后取整,即完成了量化过程。当频率系数经过量化之后,将频率系数由浮点数转变为整数,这才便于执行最后的编码。不难发现,经过量化阶段之后,所有的数据只保留了整数近似值,也就再度损失了一些数据内容。在JPEG算法中,由于对亮度和色度的精度要求不同,分别对亮度和色度采用不同的量化表。前者细量化,后者粗量化。

量化是对经过DCT变换后的频率系数进行量化,其目的是减小非“0”系数的幅度以及增加“0”值系数的数目,它是图像质量下降的最主要原因。

5

武汉理工大学《通信工程应用技术课设》

对于基于DCT的JPEG图像压缩编码算法使用如图2-3所示的均匀量化器进行量化,量化步距是按照系数所在的位置和每种颜色分量的色调值来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了表2-1所示的量化表。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此表中的左上角的量化步距要比右下角的量化步距小。

量化系数输出 DCT系数输入

图2-3 均匀量化器

亮度和色度因为代表的图像的信息量不同,亮度代表了图像的低频分量,色度代表了图像的高频分量,要分别对亮度和色度进行量化,所以量化表也是不同的。 JPEG压缩色度和亮度量化表如表2-1所示。

表2-1 JPEG压缩色度和亮度量化表

亮度量化表 色度量化表 16 11 10 16 24 40 51 61 17 18 24 47 99 99 99 99 12 12 14 19 26 58 60 55 18 21 26 66 99 99 99 99 14 13 16 24 40 57 69 56 24 26 56 99 99 99 99 99 14 17 22 29 51 87 80 62 47 66 99 99 99 99 99 99 18 22 37 56 68 109 103 77 99 99 99 99 99 99 99 99 24 35 55 64 81 104 113 92 99 99 99 99 99 99 99 99 49 64 78 87 103 121 120 101 99 99 99 99 99 99 99 99 79 92 95 98 112 100 103 99 99 99 99 99 99 99 99 99 量化会产生误差,上图是综合大量的图像测试的实验结果,对于大部分图像都有很好的结果。表中可以看出,高频部分对应的量化值大,目的就是将高频部分编程接近于0,以便以后处理。JPEG可以在压缩比和图像质量间作取舍。方法就是改变量化值。如果量化

6

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

值放大一倍,则有更多的系数量化为0,提高了压缩比。

用程序实现量化过程的原理步骤。首先读取Y矩阵中第一个8×8块,与量化系数矩阵中对应的相除,得到的值覆盖回原矩阵,然后做第二个8×8块,一直到做完全部8×8块,然后做CbCr矩阵的量化,用另外一个系数矩阵。经过量化后的DCT系数矩阵,除DC值一般不为零外,AC系数大多是在零点附近的浮点数。量化过程如图2-4 所示:

图2-4 量化示意图

2.2.4 量化系数Z形扫描

经过DCT变换后,低频分量集中在左上角,其中F(0,0)(即第一行第一列元素)代表了直流(DC)系数,即8×8子块的平均值,要对它单独编码。由于两个相邻的8×8子块的DC系数相差很小,所以对它们采用差分编码DPCM,可以提高压缩比,也就是说对相邻的子块DC系数的差值进行编码。8×8的其它63个元素是交流(AC)系数,采用行程编码。 所以量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的游程长度,方法是按照Z字形的式样编排。

DCT变换后低频分量多呈圆形辐射状向高频率衰减,因此可以看成按Z字形衰减。因此,量化系数按Z字形扫描读数,这样就把一个8×8的矩阵变成一个1×64的矢量,频率较低的系数放在矢量的顶部。量化后的DCT系数的编排如图2-7所示。

7

武汉理工大学《通信工程应用技术课设》

图2-5 量化DCT系数的编排

量化后的DCT系数的序号如表2-2所示。

表2-2 量化DCT系数的序号

0 1 5 6 14 15 27 2 4 7 13 16 26 29 3 8 12 17 25 30 41 9 11 18 24 31 40 44 10 19 23 32 39 45 52 20 22 33 38 46 51 55 21 34 37 47 50 56 59 35 36 48 49 57 58 62 Z形扫描的顺序如图2-4 所示:

28 42 43 53 54 60 61 63 图2-6 zig-zag扫描示意图

Z形扫描的示意过程如下:假设SB(1)—SB(64)为一个8×8块中的64个元素,元素位置计数从1开始,如图2-5 所示:

8

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

图2-7 Z形排序过程

箭头方向表示“Z”字形排序以后原块中元素的新的位置顺序。经过“Z”字形排序以后,新的8×8块中的元素值如下:等式左边表示元素位置,等式右边表示元素值为排序之前某位置中的元素值:如SB(15)=SB(5),则左边表示排序后的8×8块中第15个元素的值等于排序之前第5个元素的值。 SB(1)=SB(1) SB(2)=SB(2) SB(3)=SB(9) SB(4)=SB(17) SB(5)=SB(10) SB(6)=SB(3) SB(7)=SB(4) SB(8)=SB(11) SB(9)=SB(18) SB(10)=SB(25) SB(11)=SB(33) SB(12)=SB(26) SB(13)=SB(19) SB(14)=SB(12) SB(15)=SB(5) SB(12)=SB(6) ......

SB(61)=SB(48) SB(62)=SB(56) SB(63)=SB(63) SB(64)=SB(64)

用程序实现的时候需新开一个大小为64的数组SC,把SB的值赋给SC,再把以上等式右边的SB换成SC即可。例如SB(15)=CB(5)换成SB(15)=SC(5)。换完以后即完成一个8×8块的Z字形变换。

2.2.5 DC系数的编码

8×8子块的64个变换系数经量化后,按直流系数DC和交流系数AC分成两类处理。坐标u=v=0的直流系数DC实质上就是空域图像中64个像素的平均值。图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲调制编码技术。 差分脉冲编码调制(DPCM,Differential Pulse Code Modulation),是一种对模拟信号的编码模式,先根据前一个抽样值计算出一个预测值,再取当前抽样值和预测值之差作为编码用。此差值称为预测误差。抽样值和预测值非常接近(因为相关性强),预测误差的可能取值范围比抽样值变化范围小。所以可用少几位编码比特来对预测误差编码,从而降低其比特率。这是利用减小冗余度的办法,降低了编码比特率。

因此,对DC系数编码进行差分脉冲编码就是对相邻图像块之间量化DC系数的差值(Delta)进行编码,即对相邻块之间的DC系数的差值DIFF=DCi-DCi1编码。DC采用差值脉冲编码的主要原因是由于在连续色调的图像中,其差值多半比原值小,对差值进行编码所

9

武汉理工大学《通信工程应用技术课设》

需的位数,会比对原值进行编码所需的位数少许多。例如差值为5,它的二进制表示值为101,如果差值为-5,则先改为正整数5,再将其二进制转换成1的补数即可。所谓1的补数,就是将每个Bit若值为0,便改成1;Bit为1,则变成0。差值5应保留的位数为3,列出差值所应保留的Bit数与差值内容的对照。

在差值前端另外加入一些差值的霍夫曼码值,例如亮度差值为5(101)的位数为3,则霍夫曼码值应该是100,两者连接在一起即为100101。

2.2.6 AC系数的编码

DCT变换所得系数除直流系数之外的其余63个系数称为交流系数(AC系数)。量化AC系数的特点是1× 64矢量中包含有许多“0”系数,并且许多“0”是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。

所谓行程编码(Run-Length Encoding)就是指仅存储一个像素值以及具有相同颜色的像素数目的图像数据编码方式,或称游程编码,常用RLE(Run-Length Encoding)表示。该压缩编码技术相当直观和经济,运算也相当简单,因此解压缩速度很快。RLE压缩编码尤其适用于计算机生成的图形图像,对减少存储容量很有效果。

63个AC系数采用行程编码的方式进行编码的格式如图2-8所示。也即在AC01到AC63中,找出每一个非零的AC值,将其表示成(NN/SS)VV的形式,其中:NN表示该AC值前的0的个数。而SS、VV与DC的定义一样。如果连续的非0超过15个时,增加一个扩展字节:(15/0)表示连续16个0。另外若有一串0延伸到AC63,一律用(0/0)表示结束。

第一字节 第二字节

7 6 5 4 3 2 1 0 两个非零值 之间的连续 零的个数 下一个非零 值所占的比 特数 7 6 5 4 3 2 1 0 下一个非零系数的实际值 图2-8 AC编码格式

对于AC系数,有两个符号。符号1为行程和尺寸,即上面的(RunLength,Size)。(0,0)和(15,0)是两个比较特殊的情况。(0,0)表示块结束标志(EOB),(15,0)表示ZRL,当行程长度超过15时,用增加ZRL的个数来解决,所以最多有三个ZRL(3×16+15=63)。符号2为幅度值(Amplitude)。

对于DC系数,也有两个符号。符号1为尺寸(Size);符号2为幅度值(Amplitude)。

10

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

对于AC系数,符号1和符号2分别进行编码。零行程长度超过15个时,有一个符号(15,0),块结束时只有一个符号(0,0)。

对符号1进行Huffman编码(亮度,色差的Huffman码表不同)。对符号2进行变长整数VLI编码。举例来说:Size=6时,Amplitude的范围是-63~-32,以及32~63,对绝对值相同,符号相反的码字之间为反码关系。所以AC系数为32的码字为100000,33的码字为100001,-32的码字为011111,-33的码字为011110。符号2的码字紧接于符号1的码字之后。

对于DC系数,Y和UV的Huffman码表也不同。

2.2.7 霍夫曼编码

Huffman编码过程的几个步骤:

l)将信号源的符号按照出现概率递减的顺序排列。(注意,一定要递减)

2)将最下面的两个最小出现概率进行合并相加,得到的结果作为新符号的出现概率。 3)重复进行步骤1和2直到概率相加的结果等于1为止。

4)在合并运算时,概率大的符号用编码0表示,概率小的符号用编码1表示。 5)记录下概率为1处到当前信号源符号之间的0,l序列,从而得到每个符号的编码。 霍夫曼编码的特点:

1 编出来的码都是异字头码,保证了码的唯一可译性。

2 由于编码长度可变。因此译码时间较长,使得霍夫曼编码的压缩与还原相当费时。 3 编码长度不统一,硬件实现有难度。

4 对不同信号源的编码效率不同,当信号源的符号概率为2的负幂次方时,达到100%的编码效率;若信号源符号的概率相等,则编码效率最低。

5 由于0与1的指定是任意的,故由上述过程编出的最佳码不是唯一的,但其平均码长是一样的,故不影响编码效率与数据压缩性能。限于篇幅原因,在此就不再详述。

2.2.8组成位数据流

JPEG编码的最后一个步骤是把各种标记代码和编码后的图像数据组成一帧一帧的数据,这样做的目的是为了便于传输、存储和译码器进行译码,这样的组织的数据通常称为JPEG位数据流(JPEG bit stream)。

11

武汉理工大学《通信工程应用技术课设》

举个例子来说明上述过程。下面为8×8的亮度(Y)图像子块经过量化后的系数,如表2-3所示 15 -2 -1 0 0 0 0 0 0 -1 -1 0 0 0 0 0 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 表2-3 亮度量化后的系数

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 可见量化后只有左上角的几个点(低频分量)不为零,这样采用行程编码就会很有效。

第一步,熵编码的中间格式表示。

先看DC系数。假设前一个8×8子块DC系数的量化值为12,则本块DC系数与它的差为3,根据下表 Size 0 1 2 3 4 5 6 7 8 9 10 11 表2-4 DC系数表 Amplitude 0 –1,1 –3,-2,2,3 –7~-4,4~7 –15~-8,8~15 –31~-16,16~31 –63~-32,32~63 –127~-64,64~127 –255~-128,128~255 –511~-256,256~511 –1023~512,512~1023 –2047~-1024,1024~2047 查表得Size=2,Amplitude=3,所以DC中间格式为(2)(3)。

下面对AC系数编码。经过Zig-Zag扫描后,遇到的第一个非零系数为-2,其中遇到零的个数为1(即RunLength),根据下面这张AC系数表:

12

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

Size 1 2 3 4 5 6 7 8 9 10 表2-5 AC系数表 Amplitude –1,1 –3,-2,2,3 –7~-4,4~7 –15~-8,8~15 –31~-16,16~31 –63~-32,32~63 –127~-64,64~127 –255~-128,128~255 –511~-256,256~511 –1023~512,512~1023 查表得Size=2。所以RunLength=1,Size=2,Amplitude=3,所以AC中间格式为(1,2)(-2)。

其余的点类似,可以求得这个8×8子块熵编码的中间格式为

(DC)(2)(3),(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(EOB)(0,0)

第二步,熵编码。

对于(2)(3):2查DC亮度Huffman表得到11,3经过VLI编码为011;对于(1,2)(-2):(1,2)查AC亮度Huffman表得到11011,-2是2的反码,为01;对于(0,1)(-1):(0,1)查AC亮度Huffman表得到00,-1是1的反码,为0;.....最后,这一8×8子块亮度信息压缩后的数据流为11011,1101101,000, 000, 000,111000,1010。总共31比特,其压缩比是64×8/31=16.5,大约每个象素用半个比特。

以上是图像压缩编码的整个过程。

从上面的例子可以看出,压缩比和图像质量是呈反比的,以下是压缩效率与图像质量之间的大致关系,可以根据需要,选择合适的压缩比。压缩比和图像质量的关系如表2-6所示。

表2-6 压缩比与图像质量的关系 压缩效率(单位:bits/pixel) 图像质量 0.25~0.50 中~好,可满足某些应用 0.50~0.75 好~很好,满足多数应用 0.75~1.5 极好,满足大多数应用 1.5~2.0 与原始图像几乎一样

13

武汉理工大学《通信工程应用技术课设》

2.3.JPEG解码原理

2.3.1.读入文件

按照JFIF文件格式,将JPEG文件相关的字段信息一一读取出来,并进行相应的解析。例如,图像的宽度、高度、量化表、Huffman表、水平/垂直采样因子等。一般而言,JFIF格式文件的读取顺序依次为:SOI字段;APP0字段;APPn字段;DQT字段;SOFO字段;DHT字段;SOS字段;压缩数据字段;EOI字段;

JPEG文件中,一个字(16位)的存储是采用了Motorola格式(big-endian),而不是我们常用的Intel格式(little-endian)。因此,如果需要的话,请在处理之间进行依次高低字节的转换。

在标记码DHT之后,包含了一个或者多个Huffman表(通常是4个表)。对于一个Huffman表而言,它包含了以下三部分内容:

表ID和表类型;1个字节;仅有4个可选的取值,0X00,0X01,0X10,0X11,分别表示DC直流0号表,DC直流1号表,AC交流0号表,AC交流1号表;

2.3.2.霍夫曼码构建

读取JPEG文件相关信息的时候,有两点需要特别注意:由于JPEG中以0XFF来做为特殊标记符,因此,如果某个像素的取值为0XFF,那么实际在保存的时候,是以0XFF00来保存的,从而避免其跟特殊标记符0XFF之间产生混淆。所以,在读取文件信息的时候,如果遇0XFF00,就必须去除后面的00;即,将0XFF00当做0XFF;

不同位数的码字数量;前面提到,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 00 00 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表示没有位

14

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

数为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位编码。

2.3.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系数的差值。将该差值与上

15

武汉理工大学《通信工程应用技术课设》

一个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块的系数矩阵的译码工作。

2.3.4.反量化 反Z形扫描 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为矩阵:

对上面的公式进行变形

16

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

Y =FA f =AT Y fT =(AT Y)T =YT A 其中F为数据块。

经分析可知,完成一次DCT逆变换需要4步:

1:压缩数据块(8×8)F矩阵与矩阵A(8×8)相乘,得到矩阵Y(8×8); 2:对矩阵Y进行转秩得到(8×8)YT 3:YT再与矩阵A相乘得到8×8的矩阵ft

4:对ft 进行转秩得到f,这里的f即为经过DCT逆变换之后得到的时域的原始图像;

DCT逆变换的流程图如下所示

图2-9 DCT逆变换

A矩阵乘法器的作用是实现输入矩阵和A矩阵的相乘。注意A矩阵在乘法的右边。 iDCT变换的对象是8 ×8的数据单元,既输入数据共64个,按行输入,每8个数据为一行。每输入一行数据就分别和A矩阵的每一列进行乘加运算,每完成一次这样的乘加运算就输出一次结果。比如,输入第一行数据,分别和A矩阵的各列相乘,按顺序输出8个结果,这8个结果就是输出矩阵的第一行;当输入第二行数据时,同样输出8个结果,这8个结果是输出矩阵的第二行。所以经过第一次矩阵乘法之后得到的是Y矩阵。

转秩就是对64个数据进行重新排列,例如,对于矩阵M而言,将其第一行第二列的数据M(1,2)跟其第一列第二行的数据M(2,1)进行互换,如下表所示:

左边为未转秩的数据顺序,右边为转秩之后的数据顺序。

2.3.5.颜色转换

BMP图片是以RGB颜色空间进行保存的,因此,将JPEG解码为BMP必须进行颜色模式的

17

武汉理工大学《通信工程应用技术课设》

转换。另外,由于DCT要求的定义域对称,所以,在编码的时候将RGB的数值范围从[0,255]统一减去128,将数值范围转换到[-128,127]的范围内。因此,解码的时候,必须为每个颜色分量加上128。另外需要注意的是,通过解码变换之后得到的RGB的值有可能超过255或者小于0;如果小于0,就截断为0,如果大于255,就截取为255。

2.4 DCT图像压缩解压的模型

f(i,j)原图像数据FDCTF(u,v)量化Zig-Zag扫描Huffman编码压缩图像数据g(i,j)重建图像数据IDCT反量化反向Zig-Zag扫描Huffman解码

图2-10 DCT图像压缩解压的模型

在编码过程中,将图像分解为8×8的象素块,对这个8×8块进行二维离散余弦变换,每个块就产生了64个DCT系数,其中一个DC系数位于左上角,是直流(DC)系数,它表示了8×8 输入矩阵全部值的平均数,其余63个系数为交流(AC)系数。接下来对DCT系数进行量化, 相邻的8×8块之间的DC系数有较强的相关性。63个AC系数在8×8矩阵中按照\"Z\"字形的次序进行,这样可增加零的连续次数,系数编码后都采用统一的格式表示。最后将量化的DCT系数进行编码和传送,就形成了压缩后的图像格式。在解码过程中,先对已编码的量化的系数进行解码,然后求逆量化并利用二维DCT反变换把DCT系数转化为8×8样本像块,最后将反变换后的块组合成一幅图像。这样就完成了图像的压缩和解压过程。

18

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

3 JPEG图像压缩MATLAB仿真设计实现

3.1程序流程图

要将一幅彩色图像进行压缩编码,首先将图像RGB 分量转化为亮度分量和色差分量,然后将图像分成8×8的象素块,用正向二维DCT 把每个块转变成64 个DCT 系数值,其中1 个数值是直流(DC)系数,即8×8 空域图像子块的平均值,其余的63 个是交流(AC)系数,接下来对DCT 系数进行Zig-Zag 扫描和Huffman 编码,实现了图像压缩。

基于DCT的图像压缩编码的MATLAB实现的流程图如图3-1所示。

开始 输入图片 分成8*8像素块,DCT变换 输入量化表,对变换系数量化 对量化系数进行扫描 选择一幅图对其进行不同的压缩比变换 反量化 反DCT变换 显示所选图像的信噪比

结束 图3-1 程序流程图

3.1.1 数字图像文件的读写

数字图像文件的读写步骤。

19

武汉理工大学《通信工程应用技术课设》

(1) 图像文件的读取。 MATLAB中利用函数imread来实现图像文件的读取操作。其语法格式为:

A=imread(filename,fmt) [X,map]=imread(filename,fmt) [„]=imread(filename)

Filename:图像文件名;fmt:图像文件格式。

A = imread(filename, fmt) 读取图像到A,如果文件是包含灰度图像,A是二维矩阵,如果文件是包含真彩色图像(RGB),A是三维矩阵(M-by-N-by-3)。文件必须在当前目录下,或在matlab的路径上。如果imread不能够找到名称为filename的文件,那么它将找一名为filename. fmt的文件

[X,map] = (imread filename,fmt) 把图像filename读入与它相关的图像色彩信息写入map,图像色彩信息值在范围[0,1]中自动地重新调整。

[„] = imread(filename)这种方式是试图得到文件的格式从文件所包含的信息。 (2) 图像文件的输出。 MATLAB中利用函数imwrite来实现图像文件的输出和保存操作。其语法格式为:

Imwrite(A,filename,fmt) Imwrite(X,map,filename,fmt) Imwrite(„,filename)

Imwrite(A,filename,fmt)把图像 A 写入图像文件 filename。

Imwrite(X,map,filename,fmt)把 X和它的相关色彩信息map写入filename。 Imwrite(…,filename)把图像 写入图像文件filename,并推测可能的格式用来做filename的扩展名,扩展名必须是fmt中一合法名。

(3) 图像文件的显示。 在MATLAB中,可以调用image函数来显示图像,其语法格式为:

Image(C)

Image(C) 把矩阵 C 转成一图像。C 可以是一M×N 或 M×N×3维的矩阵,且可以是包含 double, uint8,或 uint16 数据。image是用来显示附标图像,即显示的图像上有x、y坐标轴的显示,可以看到图像的像素大小。但可以加上axis off命令即可把坐标去掉。

20

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

在MATLAB的图像处理工具箱中,还提供了一个应用很广泛的图像显示函数,即imshow函数,其调用格式为:

Imshow(I,n) Imshow(I,[low high]) Imshow(BW) Imshow(X,map) imshow(RGB) imshow filename

Imshow(I,n)显示一幅n个灰度级的图像I。

Imshow(I,[low high])一定灰度范围内显示灰度图像,low和high参数分别为数据数组的最小值和最大值。

Imshow(BW)显示二进制图像。

Imshow(X,map)显示索引图像,其中X代表索引图像的数据矩阵,map为颜色映射表。 imshow filename 显示一幅在当前目录下的合法文件。

imshow(RGB)显示RGB图像。RGB是一个m×n×3的数组。对于RGB中的每个像素(r,c),imshow显示数值(r,c,1:3)所描述的颜色。

例如下面的程序: imread(‘zyj.bmp’); imshow(I),title(‘图像读出’)

3.1.2 DCT变换的编程实现

DCT变换是数字图像处理中重要的变换,很多重要的图像算法、图像应用都是基于DCT变换的,如JPEG图像编码方式。对于大尺寸的二维数值矩阵,倘若采用普通的DCT变换来进行,其所花费的时间将是让人难以忍受甚至无法达到实用。而要克服这一难点,DCT变换的快速算法是比较好的选择。

就目前而言,DCT变换的快速算法无非有以下两种方式:

(1)由于FFT算法的普便采用,直接利用FFT来实现DCT变换的快速算法相比来说就相对容易。但是此种方法也有不足:计算过程会涉及到复数的运算。由于DCT变换前后的数据都是实数,计算过程中引入复数,而一对复数的加法相当于两对实数的加法,一对复数的乘法相当于四对实数的乘法和两对实数的加法,显然是增加了运算量,也给硬件存储提出了更

21

武汉理工大学《通信工程应用技术课设》

高的要求。

(2)直接在实数域进行DCT快速变换。显然,这种方法相比于前一种而言,计算量和硬件要求都要优于前者。

鉴于此,本设计采用第二种方法来实现DCT变换的快速算法。

DCT变换系统设计框图如下:

开 始

设置压缩比

设置原始图像

Y N 已对原始图像进行8*8分块 ? 对图像进行分块 显示压缩后的图像 进行DCT反变换 重排系数块 Y 是YUV? ? RGB-YUV 载入原始图像 N 求出DCT系数的排列矩阵 进行DCT变换 设置压缩比保留系数 结 束 图3-2 DCT设计流程图

此部分可分为三个过程:原始图像的载入,颜色模式转换及采样以及DCT变换

22

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

3.1.3量化程序设计

设计框图如下:

开 始 设置码书的大小 装入和显示原始图像 进行分块处理 求出图像像素的行数和列数量化程序设计 计算矢量距离的子函数 设置码字的大小 结 束

图3-3 量化程序设计流程图

量化过程是控制 JPEG 压缩比的关键。 这个步骤除掉了一些高频量, 损失了很高细节。

3.1.4 Z形扫描设计

开 始 扫描地址表输出符合Zig-Zag顺序的地址数据 产生顺序递增地址 按扫描顺序输出数据 数据写入数据存储器 结 束 N 是否写满一个数据块 ? Y 图3-3 Z形扫描设计流程图

23

武汉理工大学《通信工程应用技术课设》

4 仿真结果

4.1仿真过程图像

图4-1 原图与颜色空间转换后的图

图4-2 DCT转换图与量化后的图

24

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

图4-3解压后各分量图像

图4-4解压后的YCbCr的图像

25

武汉理工大学《通信工程应用技术课设》

图4-5 还原后的图像

程序运行结果显示:

则压缩比数据为23.6929

比特数为见“比特数”文本文件。

4.2 结果分析

评价压缩编码算法实际效果的另一主要参数是压缩比,压缩比的计算在所要求的恢复图像质量的条件下,必然要考虑是否达到了高的压缩比。本设计程序运行后的结果显示压缩比为

23.6929,压缩比还是比较大的。

运行JPEG仿真程序结果显示,JPEG压缩编码对图像数据确实可以做到大幅度的压缩,而且压缩后的图片质量尚可。通过本次仿真,我们可以发现JPEG压缩编码在对静态图像处理中的表现非常优秀,这也正是JPEG之所以具有强大生命力的原因所在。

还原后的图像清晰度虽然欠佳,但是能够完整地还原出来绝大部分的内容,效果还是可以接受的。此次的JPEG图像压缩解压的设计做的还是比较成功的。

26

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

小 结

相关技术日新月异的进步,使得数字图像相关技术的应用越来越广泛。数字图像以其较之于传统文字信息大得多的信息量,更加符合人们接受信息的习惯的特点,已经渗透到社会生活的各个方面。

数字图像的固有缺陷是其特别巨大的数据量,与传输网络有限的传输能力形成了一对矛盾,成为制约数字图像应用的瓶颈。因此数字图像的压缩编码与传输是非常有实际使用价值的热点研究问题。本文通过研究设计一个基于DCT变换的图像压缩编码的matlab实现,得到了下面的结论:

本设计叙述的图像压缩编码算法,采用了JPEG的核心离散余弦变换算法。DCT是正交变换,它可以将8*8图像的空间表达式转换为频率域,只需要用少量的数据点表示图像;DCT产生的系数很容易被量化,因此能获得好的块压缩;DCT算法的性能很好,它有快速算法,因此它在软件中容易实现;而且DCT算法是对称的,所以利用逆DCT算法可以用来解压缩图像。

仿真结果说明了压缩比增大时,图像的质量会降低,并且图像的信噪比会变小。利用MATLAB仿真软件来实现离散余弦变换的图像压缩,具有方法简单、速度快、误差小的优点,免去了大量矩阵计算,大大提高了图像压缩的效率和精度。

27

武汉理工大学《通信工程应用技术课设》

参考文献

[1] 扬帆.数字图像处理与分析[M].北京航空航天大学出版社.2007. 10 [2] 傅祖芸.信息论:基础理论与应用[M].电子工业出版社.2007.5

[3] 刘玮,王红星. 图像的无损压缩编码方法及JPEG标准模式[J]. 现代电子技术.2002.5

[4] 严剑. 离散余弦变换在图像压缩中的应用[J]. 计算机与现代化. 1996, 4 [5] 贾铸.算术编码方法在图像压缩编码中的应用[J]. 电视技术. 1999.5

[6] 于晓宇,傅志中,唐学怡. JPEG标准下图像压缩算法的研究与实现[J]. 计算机与现代化. 1996, 4

[7] 王成优.侯正信. JPEG图像压缩编码及其MATLAB仿真实现[J]. 电子测量技术.2007.1

[8] 孙即祥.图像压缩与投影重建[M].科学出版社.2005.1 [9] 邱磊. JPEG算法研究及实现[J]. Computer Era No.9 2009

[10] 陈思思,王耀楠. 基于DSP的JPEG图像压缩编码的实现[J].计算机测量与控制. 2008.1

[11] 吴亚榕.李键红. 基于Matlab的JPEG图像压缩方法研究[J]. 软件导刊.2009.4 [12] 陈天与,雷启纯. 多维离散余弦变换的快速算法[J].数值计算与计算机应用.1986.4 [13] 陈雪松,王海巍. JPEG压缩编码算法应用及发展前景研究[J].计算机应用与数字工程.2009.1

[14] 廖天康,刘峰,董培良,洪志良. 基于输入图像内容的比特率控制[J].小型微型计算机系统.2002.3

- 28 -

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

程序:

主程序:

%*****************图像颜色空间变换*******************************% x=imread('H:\\新建文件夹\\work\\nature.jpg'); figure(1)

subplot(2,2,1) imshow(x);

title('原始图像'); ycbcrx=rgb2ycbcr(x) YCbCr=ycbcrx subplot(2,2,2)

imshow(YCbCr,[]); 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;

- 29 -

武汉理工大学《通信工程应用技术课设》

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];

%****************************************** %****************************************** %彩色图像分块采样

Y = YCbCr(:,:,1); Cr = YCbCr(:,:,2); Cb = YCbCr(:,:,3); [M,N] = size(Y); Y_last_Z = 0; Cr_last_Z = 0; Cb_last_Z = 0; Y_jpeg2 = ''; Cr_jpeg2 = ''; Cb_jpeg2 = ''; for i = 0:M/8-1 for j = 0:N/8-1

S1 = Y((1+8*i):(8*(i+1)), (1+8*j):(8*(j+1)));%分割成8*8处理 S2 = Cr((1+8*i):(8*(i+1)), (1+8*j):(8*(j+1))); S3 = Cb((1+8*i):(8*(i+1)), (1+8*j):(8*(j+1))); A1 = dct2(S1);%DCT A2 = dct2(S2); A3 = dct2(S3);

B1 = round(A1./LQT);%亮度量化 B2 = round(A2./CQT);%色度量化 B3 = round(A3./CQT);%色度量化 %亮度量化的逆变换 C4=round(B1.*LQT); C5=round(B2.*CQT); C6=round(B3.*CQT); %DCT逆变换 S4=idct2(C4); S5=idct2(C5); S6=idct2(C6); %分块重组

Y((1+8*i):(8*(i+1)), (1+8*j):(8*(j+1)))=S4; Cr((1+8*i):(8*(i+1)), (1+8*j):(8*(j+1)))=S5; Cb((1+8*i):(8*(i+1)), (1+8*j):(8*(j+1)))=S6;

%**********************************************************

- 30 -

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

%Zigzag扫描 Z1 = Zigzag(B1); Z2 = Zigzag(B2); Z3 = Zigzag(B3);

%********************************************************* %Huffman编码

%***************************** %直流分量编码(DC_Huffman)

DCH_Y = DC_Huffman(Z1(1),Y_last_Z,1); DCH_Cr=DC_Huffman(Z2(1),Cr_last_Z,2); DCH_Cb=DC_Huffman(Z3(1),Cb_last_Z,2); %交流分量编码(AC_HUffman)

ACH_Y = AC_Huffman(Z1(2:end),1); ACH_Cr = AC_Huffman(Z2(2:end),2); ACH_Cb = AC_Huffman(Z3(2:end),2); Y_last_Z =Z1(1); Cr_last_Z = Z2(1); Cb_last_Z = Z3(1);

Y_jpeg2 = [Y_jpeg2 DCH_Y ACH_Y]; Cr_jpeg2 = [Cr_jpeg2 DCH_Cr ACH_Cr]; Cb_jpeg2 = [Cb_jpeg2 DCH_Cb ACH_Cb]; end end figure(2)

subplot(2,3,1);imshow(A1);title('Y采样后DCT'); subplot(2,3,2);imshow(A1);title('cr采样后DCT'); subplot(2,3,3);imshow(A1);title('cb采样后DCT'); subplot(2,3,4);imshow(B1);title('Y亮度量化'); subplot(2,3,5);imshow(B2);title('cr色度量化'); subplot(2,3,6);imshow(B3);title('cb色度量化'); jpeg2 = [Y_jpeg2,Cr_jpeg2,Cb_jpeg2]; rate2 = 8*M*N*3/length(jpeg2);%压缩比

%*******************解压程序********************* % figure(3);

subplot(1,3,1);imshow(Y);title('解压的Y分量图像'); subplot(1,3,2);imshow(Cr);title('解压的Cr分量图像'); subplot(1,3,3);imshow(Cb);title('解压的Cb分量图像'); YCbCr2(:,:,1)=Y; YCbCr2(:,:,2)=Cr; YCbCr2(:,:,3)=Cb;

figure(4);imshow(YCbCr2);title('解压的YCbCr的图像'); x1=ycbcr2rgb(YCbCr2); figure(5)

imshow(x1);title('还原图片');

- 31 -

武汉理工大学《通信工程应用技术课设》

%**********************Z形扫描程序********************************% function Z = Zigzag(S); %Zigzag表

ZT=[0 ,1 ,5 ,6 ,14,15,27,28; 2 ,4 ,7 ,13,16,26,29,42; 3 ,8 ,12,17,25,30,41,43; 9 ,11,18,24,31,40,44,53; 10,19,23,32,39,45,52,54; 20,22,33,38,46,51,55,60; 21,34,37,47,50,56,59,61; 35,36,48,49,57,58,62,63]; Z = zeros(1,64); for i = 1:8

for j = 1:8

Z(ZT(i,j)+1) = S(i,j); end end

%*************直流分量编码(DC_Huffman)****************% function DCH = DC_Huffman(Z,last_Z,n); %亮度码字

T1 = {'00' '010' '011' '100' '101' '110' '1110' '11110' '111110' '1111110' '11111110' '111111110'}; %色度码字

T2 = {'00' '01' '10' '110' '1110' '11110' '111110' '1111110' '11111110' '111111110' '1111111110' '11111111110'}; DIFF = Z-last_Z; if DIFF == 0 SSSS = 0;

elseif (abs(DIFF) == 1) SSSS = 1;

elseif (abs(DIFF) >= 2 && abs(DIFF)<=3) SSSS = 2;

elseif (abs(DIFF) >= 4 && abs(DIFF)<=7) SSSS = 3;

elseif (abs(DIFF) >= 8 && abs(DIFF)<=15) SSSS = 4;

elseif (abs(DIFF) >= 16 && abs(DIFF)<=31) SSSS = 5;

elseif (abs(DIFF) >= 32 && abs(DIFF)<=63) SSSS = 6;

elseif (abs(DIFF) >= 64 && abs(DIFF)<=127) SSSS = 7;

elseif (abs(DIFF) >= 128 && abs(DIFF)<=255) SSSS = 8;

elseif (abs(DIFF) >= 256 && abs(DIFF)<=511)

- 32 -

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

SSSS = 9;

elseif (abs(DIFF) >= 512 && abs(DIFF)<=1023) SSSS = 10;

elseif (abs(DIFF) >= 1024 && abs(DIFF)<=2047) SSSS = 11; end

%前缀码 if n == 1

S1 = char(T1(SSSS+1)); else

S1 = char(T2(SSSS+1)); end

%后缀码 if DIFF >= 0

S2 = dec2bin(abs(DIFF)); else

S2 = dec2bin(abs(DIFF)); for i = 1:length(S2) if S2(i) == '0'; S2(i) = '1'; else

S(2) = '0'; end end end

DCH = [S1 S2];

%*******************交流分量编码(AC_HUffman)**************% function ACH = AC_Huffman(AC,n); %亮度AC系数码表

T1={'1010' '00' '01' '100' '1011' '11010' '1111000' '11111000' '1111110110' '1111111110000010' '1111111110000011';

'1100' '11011' '1111001' '111110110' '11111110110' '1111111110000100' '1111111110000101' '1111111110000110' '1111111110000111' '1111111110001000' '0'; '11100' '11111001' '1111110111' '111111110100' '1111111110001001' '1111111110001010' '1111111110001011' '1111111110001100' '1111111110001101' '1111111110001110' '0';

'111010' '111110111' '111111110101' '1111111110001111' '1111111110010000' '1111111110010001' '1111111110010010' '1111111110010011' '1111111110010100' '1111111110010101' '0';

'111011' '1111111000' '1111111110010110' '1111111110010111' '1111111110011000' '1111111110011001' '1111111110011010' '1111111110011011' '1111111110011100' '1111111110011101' '0';

'1111010' '11111110111' '1111111110011110' '1111111110011111' '1111111110100000' '1111111110100001' '1111111110100010' '1111111110100011' '1111111110100100' '1111111110100001' '0';

- 33 -

武汉理工大学《通信工程应用技术课设》

'1111011' '111111110110' '1111111110100110' '1111111110100111' '1111111110101000' '1111111110101001' '1111111110101010' '1111111110101011' '1111111110101100' '1111111110101101' '0'; '11111010' '111111110111' '1111111110101110' '1111111110101111' '1111111110110000' '1111111110110001' '1111111110110010' '1111111110110011' '1111111110110100' '1111111110110101' '0'; '111111000' '111111111000000' '1111111110110110' '1111111110110111' '1111111110111000' '1111111110111001' '1111111110111010' '1111111110111011' '1111111110111100' '1111111110111101' '0'; '111111001' '1111111110111110' '1111111110111111' '1111111111000000' '1111111111000001' '1111111111000010' '1111111111000011' '1111111111000100' '1111111111000101' '1111111111000110' '0'; '111111010' '1111111111000111' '1111111111001000' '1111111111001001' '1111111111001010' '1111111111001011' '1111111111001100' '1111111111001101' '1111111111001110' '1111111111001111' '0'; '1111111001' '1111111111010000' '1111111111010001' '1111111111010010' '1111111111010011' '1111111111010100' '1111111111010101' '1111111111010110' '1111111111010111' '1111111111011000' '0'; '1111111010' '1111111111011001' '1111111111011010' '1111111111011011' '1111111111011100' '1111111111011101' '1111111111011110' '1111111111011111' '1111111111100000' '1111111111100001' '0'; '11111111000' '1111111111100010' '1111111111100011' '1111111111100100' '1111111111100101' '1111111111100110' '1111111111100111' '1111111111101000' '1111111111101001' '1111111111101010' '0';

'1111111111101011' '1111111111101100' '1111111111101101' '1111111111101110' '1111111111101111' '1111111111110000' '1111111111110001' '1111111111110010' '1111111111110011' '1111111111110100' '0'; '11111111001' '1111111111110101' '1111111111110110' '1111111111110111' '1111111111111000' '1111111111111001' '1111111111111010' '1111111111111011' '1111111111111100' '1111111111111101' '1111111111111111'}; %色度AC系数码表

T2={'00' '01' '100' '1010' '11000' '11001' '111000' '1111000' '111110100' '1111110110' '111111110100'; '1011' '111001' '11110110' '111110101' '11111110110' '111111110101' '1111111110001000' '1111111110001001' '1111111110001010' '1111111110001011' '0'; '11010' '11110111' '1111110111' '111111110110' '111111111000010' '1111111110001100' '1111111110001101' '1111111110001110' '1111111110001111' '1111111110010000' '0'; '11010' '111110111' '1111110111' '11111110110' '1111111110010001' '1111111110010010' '1111111110010011' '1111111110010100' '1111111110010101' '1111111110010110' '0';

'111010' '111110110' '1111111110010111' '1111111110011000' '1111111110011001' '1111111110011010' '1111111110011011' '1111111110011100' '1111111110011101' '1111111110011110' '0';

'111011' '1111111001' '1111111110011111' '1111111110100000' '1111111110100001'

- 34 -

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

'1111111110100010' '1111111110100011' '1111111110100100' '1111111110100101' '1111111110100010' '0';

'1111001' '11111110111' '1111111110100111' '1111111110101000' '1111111110101001' '1111111110101010' '1111111110101011' '1111111110101100' '1111111110101101' '1111111110101110' '0';

'1111010' '11111111000' '1111111110101111' '1111111110110000' '1111111110110001' '1111111110110010' '1111111110110011' '1111111110110100' '1111111110110110' '0'; '11111001' '1111111110110111' '1111111110111000' '1111111110111010' '1111111110111011' '1111111110111100' '1111111110111110' '1111111110111111' '0'; '111110111' '1111111111000000' '1111111111000001' '1111111111000011' '1111111111000100' '1111111111000101' '1111111111000111' '1111111111001000' '0'; '111111000' '1111111111001001' '1111111111001010' '1111111111001100' '1111111111001101' '1111111111001110' '1111111111010000' '1111111111010001' '0'; '111111001' '1111111111010010' '1111111111010011' '1111111111010101' '1111111111010110' '1111111111010111' '1111111111011001' '1111111111011010' '0'; '111111010' '1111111111011011' '1111111111011100' '1111111111011110' '1111111111011111' '1111111111100000' '1111111111100010' '1111111111100011' '0'; '11111111001' '1111111111100100' '1111111111100101' '1111111111100111' '1111111111101000' '1111111111101001' '1111111111101011' '1111111111101100' '0';

'11111111100000' '1111111111101101' '1111111111101110' '1111111111110000' '1111111111110001' '1111111111110010' '1111111111110100' '1111111111110101' '0'; '1111111010' '111111111000011' '1111111111110110' '1111111111111000' '1111111111111001' '1111111111111010' '1111111111111100' '1111111111111101' '1111111111111111'}; %RLC行程编码 k=0; j=1;

for i=1:63

if AC(i)==0 && k<15%非零系数前的零个数小于15 k=k+1; else

if k==15%非零个数为15 RLC(j)=15; RLC(j+1)=0; else%没有零在前面 RLC(j)=k;

RLC(j+1)=AC(i);

- 35 -

'1111111110110101' '1111111110111001' '1111111110111101' '1111111111000010' '1111111111000110' '1111111111001011' '1111111111001111' '1111111111010100' '1111111111011000' '1111111111011101' '1111111111100001' '1111111111100110' '1111111111101010' '1111111111101111' '1111111111110011' '1111111111110111' '1111111111111011' 武汉理工大学《通信工程应用技术课设》

end k=0; j=j+2; end end

%最后一个数是零 if AC(63)==0 RLC(j)=0; RLC(j+1)=0; end

%之前有若干组15个连零 while(length(RLC)>2)

if ((RLC(length(RLC)) == 0) && (RLC(length(RLC)-2) == 0)) RLC = RLC(1:length(RLC)-2); RLC(length(RLC)-1) = 0; else

break end end

ACH='';

for i=1:2:length(RLC) NNNN=RLC(i); if RLC(i+1)==0 SSSS=0;

elseif abs(RLC(i+1))==1 SSSS=1;

elseif ( abs(RLC(i+1))>=2 && abs(RLC(i+1))<=3 ) SSSS=2;

elseif ( abs(RLC(i+1))>=4 && abs(RLC(i+1))<=7 ) SSSS=3;

elseif ( abs(RLC(i+1))>=8 && abs(RLC(i+1))<=15 ) SSSS=4;

elseif ( abs(RLC(i+1))>=16 && abs(RLC(i+1))<=31 ) SSSS=5;

elseif ( abs(RLC(i+1))>=32 && abs(RLC(i+1))<=63 ) SSSS=6;

elseif ( abs(RLC(i+1))>=64 && abs(RLC(i+1))<=127 ) SSSS=7;

elseif ( abs(RLC(i+1))>=128 && abs(RLC(i+1))<=255 ) SSSS=8;

elseif ( abs(RLC(i+1))>=256 && abs(RLC(i+1))<=511 ) SSSS=9;

elseif ( abs(RLC(i+1))>=512 && abs(RLC(i+1))<=1023 ) SSSS=10;

- 36 -

武汉理工大学《通信工程应用技术综合训练与设计》课程设计说明书

end

%%求前缀码S1 if n==1

if NNNN==0 | NNNN==15

S1=char(T1(NNNN+1,SSSS+1)); else

S1=char(T1(NNNN+1,SSSS)); end else

if NNNN==0 | NNNN==15

S1=char(T2(NNNN+1,SSSS+1)); else

S1=char(T2(NNNN+1,SSSS)); end end

%%求尾码S2

if RLC(i)==0 && RLC(i+1)==0 S2=''; else

if RLC(i+1)>=0

S2=dec2bin(RLC(i+1)); else

S2=dec2bin(abs(RLC(i+1))); for i=1:length(S2) if S2(i)=='1' S2(i)='0'; else

S2(i)='1'; end end end end

ACH=[ACH S1 S2]; End

- 37 -

武汉理工大学《通信工程应用技术课设》

本科生课程设计成绩评定表

姓 名 专业、班级 题 目: 答辩或质疑记录: 性 别 成绩评定依据: 序号 1 2 3 4 5 内容 态度认真、学习刻苦、遵守纪律 实验方法正确,仪器使用得当,测试结果正确 电路原理及实验结果分析正确 设计报告的规范化、参考文献充分 课程设计答辩 分值 20 25 25 10 20 得分 最终评定成绩(以优、良、中、及格、不及格评定)

指导教师签字:

年 月 日

- 38 -

因篇幅问题不能全部显示,请点此查看更多更全内容