JPEG压缩编码方法与实现

JPEG压缩编码方法与实现

                             电子信息学院   戴玉超   学号:056080460

一.        数据压缩问题的描述

信息的本质,要求交流和传播。一个统一的数字传输系统系统模型如图1所示。

1.数字传输系统模型

数据压缩,就是以最少的数码表示信源所发的信号,减少容纳给定消息集合或数据采样集合的信号空间。所谓信号空间即被压缩对象是指:(1)物理空间(2)时间区间(3)电磁频谱区域。

二.        数据压缩的可能性和必要性

数据压缩的必要性: 信息时代的重要特征是信息的数字化,数字化了的信息带来了“信息爆炸”。多媒体计算机系统技术是面向三维图形、立体声和彩色全屏幕运动画面的处理技术。数字计算机面临的是数值、文字、语言、音乐、图形、动画、静图像、电视视频图像等多种媒体,承载的由模拟量转化成数字量信息的吞吐、存储和传输的问题。数字化了的视频和音频信号的数量之大是非常惊人的。直接存储和传输庞大的数据不但开销很大,而且有时设备也无法承受如此大的负荷,并且通信带宽和存储容量有限,因此实现对于图像等数据进行高比特率的数据压缩显得尤为重要起来。

数据压缩的可能性在于数据本身存在的冗余。对于图像而言,图像数字化之后,形成了大量的二进位数据。然而,由于图像的冗余性,表示一幅图像并不需要那么多二进位。一般来讲,数字图像存在以下类型的冗余:

(一)   空间冗余:一幅图像中相邻像素的灰度值(彩色值)基本上是一致的(除去图像边缘像素点),图像相邻像素的数值是相关的。

(二)   频域冗余:在RGB彩色图像中不同色平面或频段是相关的。

(三)   时间冗余:在视频图像中,不同的图像帧是相关的。

(四)   信息熵冗余:也称为编码冗余。对于实际图像数据的每一个像素,很难得到它的信息熵,因此在数字化一幅图像时表示像素的比特通常存在冗余。

(五)   视觉冗余:人类的视觉系统对于图像的注意是非均匀和非线性的,特别是人类的视觉系统并不是对于图像中的任何变化都能感知。由于人是各类图像处理系统的最终接受者和评价者,而人眼的视觉特点产生了相应的视觉心理冗余。

另外,还存在结构冗余,知识冗余等冗余形式。

数字图像压缩的目的在于去除图像的冗余和不必要的信息,在不降低图像视觉质量的情况下,减少图像的数据量和存储空间,提高图像的传输速率。通过对图像信源进行编码,使编码数据流小于原始数据流,达到压缩的目的。

三.        数据压缩方法

数据压缩是有效率的,它是衡量一种编码标准的重要因素。总的来说,压缩比越大,压缩后的码率就低,分辨率相对也低;反之亦然。下面主要意图像和视频为例加以说明。图像的压缩是有损的,可能产生压缩失真。目前,已实际使用的活动图像压缩编码后的码率低到几至几十kbit/s,广播级的图像码率一般为26Mbit/s

图像编码技术具有广阔的应用前景,特别是网络技术不断涵盖各个领域的今天,发达国家投入大量的资金和人力资源进行开发研究。一些新的压缩编码方法与算法不断出现。基于模型并被称为新一代的压缩编码方法正在深入研究之中,目前,有人把图像压缩编码方法分为三大类:第一类基于图像信源的统计特性,MPEG-1MPEG-2属于这一类;第二类基于人眼视觉特征,采用图像轮廓一纹理的编码方法;第三类基于图像的景物特征,采用模型的编码方法,有人把第二类和第三类统称为第二代编码方法,目前通过的标准有MPEG-4。下面简介第一类常用的压缩编码方法。

1.亚抽样编码方式

它分空间和时间亚抽样两种方式。空间亚抽样采用降低每行、每帧的像素进行抽样传输,以此达到压缩码率的目的,对于未传的像素,用其周围相邻像素经过运算后求出,再补插上去来恢复图像。时间亚抽样采用图像隔帧传输,来降低码率,在接收端对于未传的帧,通过前后帧计算出来,再补插上去。亚抽样方式中传输的像素和帧的数量大小,可根据不同的应用范围、清晰度的要求去确定。

2.差值和预测编码方式

差值编码方式根据图像内容一般都是连续变化而突变内容较少的特点,只传送帧内相邻像素之间的差值,或两帧对应像素之间的差值。这个差值必然比它们的原值小,甚至为零。这样就可以减少数据的传送,达到压缩码率的目的。

预测编码不仅利用相邻像素样值的相关性,还利用与其他行和其他帧的像素值的相关性,通过计算,用更接近当前样值的预测值和当前值相减,这样,差值会进一步变小,小幅度差值就会进一步增加,使总码率进一步减少。实质上,差值编码就是以前一个样值为预测值的预测编码,预测编码有一维、二维、三维之分。

3.具有运动补偿的帧间预测编码

当图像中有较大的运动画面时,相邻帧差信号中大幅度值会大量增加,如果利用简单的帧间预测编码,其预测值会出现很大偏差,为适应这种情况,人们开发了多种方式及算法,来求出相邻帧间运动图像部分的运动矢量,然后用该矢量对帧间预测值进行修正(也叫运动补偿),减小预测值误差,从而提高对运动图像的编码质量。

4.变换编码

变换编码是通过某种数学变换,把图像从一个域变换到另一个域,使本来复杂的图像变得简单或有更好的统计特性,从而便于进一步编码,例如:一帧图像内容以不同的亮度和色度像素分布体现出来,而这些像素的分布依图像内容而变,毫无规律可言。但是通过离散余弦变换(DCT);像素分布就有了规律。代表低频成份的量分布于左上角,而越高频率成份越向右下角分布。然后根据人眼视觉特性,去掉一些不影响图像基本内容的细节(高频分量),从而达到压缩码率的目的。离散余弦变换与其他方式结合进行压缩编码,已广泛应用于各种图像压缩编码标准中。

5.变字长编码

图像进行各种方式压缩后,对出现概率大的符号给短码,对出现概率低的符号给长码,采用这种科学的变字长码编码,可提高信源编码效率。

每种压缩编码标准中,都采用多种压缩编码方式进行图像压缩编码,其目的是为了既有高的图像压缩比,又便于图像还原。

四.        JPEG图像压缩

我这次所完成的程序是基于DCT变换的JPEG压缩编码的实现采用的VisualC++6.0 +MFC实现,本软件当前支持所有bmp图像文件的读取与显示,支持对于24bmp图像的Jpeg压缩。

下面介绍一下JPEG压缩编码中使用的方法和JPEG压缩标准。

41 JPEG压缩编码流程

JPEG是关于连续色调多极灰度、静止图像的第一个数字图像压缩编码国际标准,它不仅适用于静止图像的压缩,也适用于电视图像序列的帧内图像压缩。

基本JPEG编码器和解码器(基于DCT变换)的结构如下图所示。其算法流程为:首先,通过离散余弦变换把数据从空间域变换到频率域,从而去除数据的冗余度;量化器用加权函数来产生对人眼优化的量化DCT系数,同时熵编码器将量化DCT系数的熵最小化。从以上叙述可以看出基于DCT变换的JPEG压缩算法由以下几个步骤实现:

1.  颜色模式转换及采样;

2.  离散余弦变换;

3.  量化;

4.  Zigzag编码;

5.  使用差分脉冲编码调制(DPCM)对直流系数进行编码;

6.  使用行程长度编码对交流系数进行编码;

7.  Huffman编码

2.JPEG压缩编码器

    

3.JPEG解压缩解码器

4.2 JPEG压缩编码关键技术

离散余弦变换(DCT):

       DCT变换是一种正交变换图像编码方法,常常被认为是对图像和语音信号的准最佳变换。在JPEG压缩编码中,采用的是 的图像快,其原因在于计算量和像素之间关系的数量。

数字图像 可以看成是一个 的矩阵,借助于二维DCT,可以将图像从空间域(即 平面)变换到DCT域(即 平面)。以求和形式定义的二维DCT为:

        1

可见,二维DCT实际上可以分解为两个一维DCT:即先以 为变量,对 逐行进行一维DCT得到一个一维中间结果 ;再对中间结果以 为变量,逐列进行第二个一维DCT,得到最终结果

4. 二维DCT的行列分离计算过程

量化:

JPEG中使用的是线性均匀量化表。JPEG基本算法包括一套量化表,因为JPEG使用的是YUV格式,Y分量代表了亮度信息,U,V代表了色差信息。因此JPEG的两张量化表分别针对YUV

JPEG中采用线性均匀量化器,量化定义为对64DCT系数除以量化步长并四舍五入,公式如下:

                  2

Zigzag排序:

保证低频分量先出现,高频分量后出现,以增加行程中连续“0”的个数。

5.ZigZag扫描

哈夫曼编码:

JPEG中的哈夫曼编码分为两步进行,首先把DC码和行程码转换中间符号序列,然后给这些符号赋以变长码字。

1.  中间符号表示:

 对于差分DC系数用两个符号进行编码:符号1和符号二,符号1表示的信息成为“长度”,即为DC系数的幅度进行编码所用的位数,符号二表示DC系数的幅度。类似的,对于每个AC系数也用两个符号进行编码,符号1表示两条信息,“游程”和“长度”。游程是在Zigzag矩阵中位于非零AC系数前的连续零值AC系数的个数,长度是对AC系数的幅度进行编码所用的位数,符号2表示了AC系数的幅度。

2.  哈夫曼编码

对于DC系数的符号一采用哈夫曼表中的可变长度代码进行编码。符号2用可变长度整数代码进行编码,若为负值,则采用二进制的补码形式。

对于AC系数的哈夫曼编码流程如下:

6AC系数编码流程

4.3. JPEG文件格式:

色度空间

JPEG文件使用的颜色空间是CCIR 601推荐标准采用的彩色空间。在这个彩色空间中,每一个分量,每个像素的电平规定为255级,用8bit代码表示。在RGBYCrCb空间之间的转换为:

RGB转换成YCbCr:

                                   3

YCbCr转换成RGB:

                            4

JPEG文件大体上可以分成以下两个部分:标记码(Tag)加压缩数据。标记码由两个字节构成,前一个字节为固定值0xFF,每个标记之前还可以添加数量不限的0xFF填充字节。标记码部分给出了JPEG图像的所有信息。

JPEG文件由下面的8个部分组成:

1.  图像开始SOIStart of Image)标记;

2.  APP0标记:包括长度,标记符,版本号,XY方向的密度单位,X方向像素密度,Y方向像素密度,缩略图水平像素数目,缩略图垂直像素数目,缩略图RGB位图;

3.  APPn标记(Markers),其中n=1~15(任选):包括长度和应用详细信息;

4.  一个或多个量化表DQT(difine quatization table):包括量化表长度,量化表数目,量化表;

5.  帧图像开始SOF(Start of Frame):帧开始长度,精度,图像高度,图像宽度,颜色分量数,对于每个颜色分量的描述;

6.  一个或多个哈夫曼表DHT(Difine Huffman Table):包括长度,类型,索引,位表,值表;

7.  扫描开始SOSStart of Scan):包括扫描开始长度,颜色分量数,每个颜色分量,压缩图像数据;

8.  图像结束EOI(End of Image).

7JPEG文件格式图解

五.        程序说明

本次JPEG图像数据压缩程序,我采用的是VisualC++6.0平台编程实现。建立的工程为JpegCompression,基于MFC类库实现。

工程包括以下几个类:CDib,该类实现位图文件数据的读入,显示,JPEG压缩编码实现;CJpegCompressionApp,该类是整个程序执行的主进程,CJpegCompressionDoc控制文档数据,CJpegCompressionView控制视图显示,该类基于CScrollView,因此支持滑动条实现滚动;CMainFrame类控制整个框架结构,Jpeg类实现压缩编码。

关于图像处理的部分主要集中在CDib类中,主要包含加载bmp位图的LoadImage函数,实现位图保存功能的SaveImage函数,写入32位数据Write32BitData,根据给定的量化表实现8*8块的量化的Quant函数,进行二维DCT变换的DCT函数,实现YCrCb颜色空间到RGB颜色空间的变换的函数YCbCr2RGB 实现游程编码的RunLengthCode函数;将哈夫曼编码结果按照长度和码字的ShiftWrite函数;将图像进行JPEG压缩编码的SaveAsJpeg            函数;实现Jpeg压缩编码的Jpeg()函数;进行数据写入操作的WriteData函数以及进行哈夫曼编码的HuffmanTable函数,详细的函数说明见源程序中的相关说明。

当前软件版本实现效果包括:对于所有形式bmp图像的读取与显示,对于bmp图像的保存,对于24bmp图像的Jpeg压缩,内部实现的功能如DCT变换,量化,哈夫曼编码,游程编码等也可以作为单独功能添加到界面上予以实现。

程序编译运行界面如下图:

8Jpeg压缩程序运行界面

9.打开位图文件

主要功能包括:

打开选定路径下的bmp图像文件(包括24位图,256色图像,灰度图,二值图像等文件格式),如图9所示。

在屏幕上显示打开的bmp图像文件,支持滚动显示。全屏显示后图像位于屏幕中央,如图10左图所示,右图为滚动显示的位图。

24bmp图像以给定路径保存为JPEG文件。实现JPEG图像数据压缩全过程。如图11所示,此时可以选定文件路径并以指定的文件名保存为JPEG图像文件。

bmp图像文件另存于其他位置,如图12所示。

关于作者信息说明,如图13所示。

 

10.完全显示和滚动显示位图

11JPEG图像压缩

12.位图文件另存为

13.版本信息

六.        程序运行结果及分析

应用本软件可以实现对于任意24bmp图像的JPEG压缩。为了比较,验证方法的效果,我采用几幅标准图像进行对比试验,为考察压缩效果,试验选用了不同大小的图像。我们知道对于数据压缩系统的性能评价主要包括两个方面:客观度量和主观度量,因此在下面的比较中以这两个标准和压缩效率进行比较。

 

 

 

1.图像JPEG压缩效果

图像名称

位图格式大小

JPEG格式大小

压缩比

Lena

71,510B

5,264B

13.58

SunSet

1,440,054B

47,853B

30.09

Blue hills

1,440,054B

28,391B

50.72

Water lilies

1,440,054B

28,391B

50.72

 下载图片

50,678B

3,917B

12.94

                   

  

                   

                  

14JPEG压缩测试图片,依次为Lena,SunSet,BlueHills,Water lilies,下载图片

从以上测试结果来看,设计实现的JPEG压缩算法较好地实现了对于24bmp图像的压缩,压缩比较高,压缩图像与原始图像相比差异几乎无法察觉。

现将我在实现整个JPEG压缩中一些问题总结如下:

(1)       关于量化表的问题,当前采用的是针对Y分量,UV分量的两个固定的量化表。这两个量化表来源于广泛的实验。但是由于通用性可能导致对于某些图像量化效果不佳,影响后续的其他操作。因此,可以考虑根据每一幅图像具体特征进行自适应量化。

(2)       关于离散余弦变换。在这一次的实现之中,对于离散余弦变换,我实现了二维DCT的直接计算方法,先行后列两次一维DCT计算方法。由于DCT变换与DFT变换之间的联系,二维DCT可以通过FFT来实现,以提高整个运算速度。

(3)       压缩率的可控性。可以设计实现给定压缩比或压缩率后的压缩。

(4)       JPEG中的编码方式可以选择哈夫曼编码或者是算术编码,当前JPEG压缩中采用的均是Huffman编码,以后可以考虑采用算术编码。

(5)       关于采样问题。将图像像素数据由RGB空间转换到YCbCr空间后,亮度Y包含的信息最为丰富,因此Y的采样频率应大于CbCr的采样频率,一般采用422或者411采样格式。

 

 

七.        参考文献

[1]吴乐南 编著 数据压缩  电子工业出版社,东南大学出版社。2000.6

[2]张益贞,刘滔编著. Visual C++实现MPEF/JPEG编解码技术. 人民邮电出版社.2004.5

八.个人体会

经过几天的努力,基于离散余弦变换的Jpeg图像压缩编码程序终于实现完成了。通过程序设计开发过程,我进一步熟悉了数据压缩中的相关方法并且在理解的基础上实现了。主要的收获在于进一步清楚了数据压缩方法实现的过程,对于Jpeg压缩编码方法有了更加深入的理解,在Visual C++实现上也有所增长。希望在以后的学习过程中进一步研究数据压缩的相关方法,提高水平。最后,特别感谢冯老师让我们进入了数据压缩这一领域的学习,通过冯老师的教导,我感觉收获很大。

 

                                                            200614

 

PS:需要代码可以留邮箱交流。

    原文作者:游程编码问题
    原文地址: https://blog.csdn.net/daiyuchao/article/details/1598915
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞