张昭 王薇 陈晨 杨景超 韩润林
西安电子工程研究所 西安 710100
【摘要】本文介绍了基于熵编码的压缩算法系统模块图,重点分析了JPEG压缩算法在VC程序设计的运行流程和算法思想,并对压缩结果进行了分析。
【关键词】JPEG压缩算法;熵编码;
1 系统模块图
对基于熵编码的JPEG顺序工作模式的具体VC程序进行深入分析,得到系统程序的模块图如图1所示,原始数据输入后分割成8×8子块,再对每一子块分别进行DCT变换从空间域转换到频域,再对DCT系数做均匀量化,将二维矩阵做zigzag扫描转化为一维数据,最后再对64个一维DCT系数做熵编码后重组输出压缩数据。
.png)
图1 JPEG系统模块图
2 JPEG压缩算法的设计流程
对于JPEG压缩程序,我们从整体上分析程序的运行流程和算法思想,以及主要分析熵编码部分的函数的算法和流程。
2.1 gendat()函数程序设计流程
对于具体的JPEG压缩程序,压缩函数gendat()的算法思想是:首先读取原始数据,然后再生成DC、AC编码表以供后续查表,将原始图像数据分割成8×8子块,对每一子块再做DCT变换、量化、zigzag扫描、熵编码,在编码中将图像压缩数据重组,最后再为压缩数据加上JPEG头文件。解压缩的函数extrdat()的算法是压缩程序gendat()的算法的逆过程。
2.2 熵编码函数encode()程序设计流程
在进行哈夫曼编码时,主要依据前面算法中所介绍到的参数,依据所需参数查得码字。对于DC系数,因为是对相邻图像块之间的差值进行编码,所以在量化后要先DC系数进行预处理。将量化后DC的原始值替换成相邻图像块之间的差值,对差值进行哈夫曼编码;在对AC系数进行编码时,是通过遍历一维数列得到行程runlength的值,以及结合当前非0值的类别size查表得到码字,要考虑连续出现16个连零这种特殊情况。熵解码函数decode()函数的算法和流程是熵编码函数encode()的逆过程:首先根据码字恢复DC的差值,加上前一子块恢复的DC系数恢复当前子块DC系数。对于AC系数的解码,分种情况处理,遇到结束标志时恢复最后的若干个连0值;小于16个连0的解码;非0值的解码。
3 JPEG压缩技术仿真结果分析
用基于熵编码的JPEG压缩算法的VC程序对原始大小为 256×256的灰度图像进行压缩编码,原始数据大小为64.3kb,存放在lady.dat文件中,运行gendat.exe可执行文件,按要求输入存放压缩数据的文件名lady,运行程序之后会生成lady文件,该文件即为压缩后的输出数据,大小为5.3kb。运行genjpg.exe可执行文件按要求输入存放压缩数据的文件名lady和添加JPEG头文件后的生成文件的文件名lady.jpg,运行程序之后会生成lady.jpg文件,即为压缩后的灰度图像,大小为5.73kb。
下图分别为原始图像和压缩图像:
.png)
图2 原始图像 图3 压缩图像
对比原始图像和压缩图像,主观上看不出它们之间的差别。从客观上分析其压缩比:
.png)
通常在图像传输时要求固定比特率,JPEG通过设定一个质量控制因子Q,在量化时用该因子与量化表中的量化步长相乘作为实际的量化步长。在该程序中使用的是JPEG标准推荐的亮度量化表,因此质量控制因子Q为1。
实验结果表明,JPEG压缩算法实现简单,在很大的压缩比范围内都能得到很好的重建图像质量。正是由于具有这些优点,JPEG压缩编码算法在图像压缩领域得到了越来越广泛的应用。对于通常的图像来说,大多数的DCT系数的值非常接近于0。如果舍弃这些接近于0的DCT系数值,在重构建图像时并不会带来画面质量的显著下降,压缩应该在最合理的近似原图像情况下使用最少的系数,使用系数的多少决定了压缩比的大小。由于DCT系数的DC分量和AC分量的特点,对DC系数差值和AC系数的游程长度做哈夫曼编码可以在一定质量条件下获得较大的压缩比。
参考文献:
[1]胡栋,静态图像编码的基本方法与国际标准[M].北京:北京邮电大学出版社,2005.
[2]张益贞,刘滔,Visual c++实现MPEG/JPEG编解码技术[M].北京:人民邮电出版社,2002.
[3]阮秋奇,数学图象处理学[M].北京:电子工业出版社,2001.