# 基于Matlab的JPEG图像压缩编解码的设计与实现
# 摘 要
首先介绍了基于DCT离散余弦变换的JPEG图像压缩编码算法,包括DCT变换、量化、之字扫描、Huffman熵编码等模块,并介绍了JPEG图像解码的过程,即编码的逆过程;接着使用MATLAB 7.0 针对标准灰度图像进行仿真,并对同一幅Lena图像做不同的压缩,绘制出了率失真曲线。实验结果表明,在很大的压缩范围内,在不同的压缩比和编码比特率下,重建图像的峰值信噪比(PSNR)都在30dB以上,仍能满足人们的视觉需求。用MATLAB来实现JPEG图像压缩编码算法,具有方法简单、速度快、误差小的优点,大大提高了图像压缩的效率和精度。
**关键字**:JPEG压缩编码算法,离散余弦变换(DCT),Huffman编码,峰值信噪比(PSNR)
# 一、JPEG标准
JPEG(Joint Photographic Experts Group)是在国际标准化组织(ISO)领导之下制定静态图像压缩标准的委员会,第一套国际静态图像压缩标准ISO 10918-1(JPEG)就是该委员会制定的。1992年,JPEG被正式采纳为国际标准。
# 二、JPEG图像编码和解码的基本原理
数字图像f(i,j)并不像一位音频信号一样定义在时间域上,它定义在空间域上。图像是两维变量i和j的函数(或者也可表示为x和y)。
JPEG是采用了DCT离散余弦变换的有损的图像压缩方法。
在JPEG中,DCT变换的编码效率主要基于以下3个特性:
- 特性1 在图像区域内,有用的图像内容变化相对缓慢,也就是说,在一个小区域内(例如,一个8\*8的图像块内)亮度值的变化不会太频繁。
- 特性2 心理学表明,在空间域内,人类对高频分量损失的感知程度要远远低于对低频分量的损失的感知能力。
- 特性3 人类都灰度(黑和白)的视觉敏感度(区分相近空间线的准确度)要远远高于对彩色的敏感度。
下图,给出了一个JPEG编码器的示意图:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6cb4707b45fe58f1e4f6b03fd3f8a815.writebug)
在有损压缩算法中,主要采用基于块的离散余弦变换消除图像的空间冗余,利用人的视觉系统特性对变换系数进行量化,最后通过无损变字长熵编码消除视觉冗余和数据统计冗余,实现图像压缩。
译码或者叫做解压缩的过程与压缩编码过程正好相反。如下图的JPEG解码器的示意图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/a12c7d4e42d8de3ab7d2103b0b9c8015.writebug)
# 三、JPEG编码的过程
## 3.1 图像块的DCT变换
输入端把原始图像分成 8\*8 像素块 (Block) 之后进行 DCT 变换,目的是去除图像数据的空间冗余,并实现能量集中。
DCT 变换常常被认为是图视频变换编码的最佳变换之一。DCT 变换是一种空问变换,它的最大特点是对于一般的图像都能够将像素块的能量集中于少数低频 DCT 系数上,这样就可能只编码和传输少数系数而不严重影响图像质量。DCT不能直接对图像产生压缩作用,但对图像的能量具有很好的集中效果,为压缩打下了基础。二维的 DCT 变换是JPEG算法的主要部分,其核心思想是利用DCT对数据信息强度集中的特性将数据中视觉上容易觉察的部分与不容易觉察的部分进行分离,由此达到压缩的目的。
二维离散余弦变换的正变换的表达式为:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/56a93b1e3bd51539131f8a1f62b2d933.writebug)
在图像的压缩编码中,N一般取8.
反变换的表达式为:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/d0104556f3217fcce4fda522459fb4c4.writebug)
以上各式中的系数:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6699739bd65e42eda523101520cdf18e.writebug)
## 3.2 量化
JPEG 是一种利用了量化的图像有损压缩。JPEG量化的目标是减少压缩图像所需的位数。
JPEG的编码过程对原始的图像数据作离散余弦变换,然后对离散结果进行量化并作“熵编码”。JPEG算法的第二步是量化处理,这里DCT 输出利用同维数的整数矩阵进行点状处理,基本 JPEG 的“损耗”特性就是由量化过程产生的。通过剔除图像中的不必要的信息,量化完成JPEG主要压缩部分。
因为图像在特定位置通常会由较低空间频率改变,并且人类倾向于忽略高空间频率改变,所以量化可以过滤掉很多这类因素。在量化过程中,系数量化过程可通过选择合适的量化因子完成,量化值越高,系数就越接近零。量化损耗是由于它的值总是要取整而造成的,这也是量化因子越大,丢失的信息就越多的原因。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/be2284a280da2e3b429dc88631c3caf6.writebug)
因此,图像质量可以通过量化位数的选择加以控制。JPEG 的色度量化表与亮度量化表一般采用标准的默认表(见表1 和表 2),因为这些值都是从心理学的研究结果中得来的,能够得到最大的压缩率,同时能使JPEG图片的感知损失最小。从量化表中可以看出各变换系数的量化间隔是不一样的。对于低频分量,量化间隔小 ,量化误差也会较小,对于高频分量,因为它只影响图像的细节,从整体上看它没有低频分量那么重要,因此量化间隔较大。量化处理是造成压缩编码信息失真的关键因素之一,在 JPEG 解码,需要进行逆量化,使用到的矩阵与编码时完全相同。
## 3.3 熵编码
DCT最后处理的步骤是熵编码,目的是在统计特征基础上通过对量化DCT 系数进一步压缩,得到额外的无损压缩。根据信息论的原理,可以找到最佳数据压缩编码的方法,数据压缩的理论极限是信息熵 。如果在编码过程中不损失信息量,即要求保持信息熵,则这种编码叫做熵编码。
在编码之前,需要把二维变换的变换系数矩阵转换为一维序列。这样做的目的是为后续的熵编码做准备,即“之字形扫描”,见下图。 熵编码将之字形量化系数序列转换成中间符号序列,然后将这些符号转换成没有外部确定边界的数据流,即最终编码后的图像数据流文件。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b2bbd2944b7361d079b1766854473908.writebug)
JPEG的基本系统的熵编码采纳了平均压缩比最高的编码哈夫曼编码,其理论依据是变字长编码理论。在变字长编码中,编码器的编码输出码字是长度不等的码字,按照编码输入信息符号出现的统计概率,给输出码字分配不同的字长,出现概率极高的分配较短的码字,反之出现概率较低的则分配较长的码字,从而得到较好的压缩效果。
# 四、MATLAB实现
根据上面所述的JPEG 压缩编码算法,要将一幅灰度图像进行压缩编码,首先把图像分成 8\*8 的像素块,分块进行DCT变换后,根据JPEG 标准量化表对变换系数进行量化,再对直流系数(DC)进行预测编码,对交流系数(AC)进行 zigzag扫描和可变长编码,然后根据标准的Huffman码表进行熵编码,输出压缩图像的比特序列,实现了图像的压缩。
在接收端,则经过Huffman熵解码、DC系数和AC系数可变长解码、反量化后,再进行反DCT变换即可得到重建的图像。
对一幅图像进行JPEG编解码的MATLAB程序的流程图如下所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/41e14e2fc451840788e10bc3e3264e14.writebug)
JPEG的MATLAB源程序(只含压缩编码部分)代码如下(基于MATLAB7.0实现,因为blkproc函数的原因,所以才使用了较低版本�
- 1
- 2
- 3
- 4
前往页