转载请注明出处:http://blog.csdn.net/luoshixian099/article/details/50392230
CSDN-勿在浮沙筑高台
为了满足不同应用的需求,JPEG标准包括两种基本的压缩方法:1.基于DCT的有损压缩算法;2.基于预测方法的无损压缩算法。基于DCT的基线系统有损压缩技术是到目前为止应用最为广泛的一种压缩方法,本文将详细解析此算法。
1.基于DCT有损压缩原理
下面是编码器和解码器的流程图,压缩过程:原图分成8×8的子块,分别进行正向离散余弦变换(FDCT),对每个8×8子块的系数采用量化表进行量化,最后使用熵编码,输出比特流。解码器是完整的逆过程,本文章不再赘述!
1.1离散余弦变换(DCT)
首先把原始图像分割成8×8的子块(如果宽或高不是8的整数倍,可以用黑色边框填充),每个子块进行独立编码处理。在进行FDCT变换之前,把64个无符号整型灰度值[0,255]平移到[-128,+127]范围中。通过DCT变换,8×8个灰度值被转换为8×8个频率谱值,分别对应不同频率。DCT变换系数值均为实数。低频谱值位于左上部分,高频谱值位于右下部分。通过下述公式可知,左上角F(0,0)对应频率为0,被称为DC系数,其他63个系数称为AC系数。
至于为什么子块大小选择8×8,由于当时制定JPEG标准时,8×8是集成电路所能支持的最大尺寸,同时8×8的大小效果很好!
下述定义的b[x,y]为DCT的基函数,下面画出了6个基函数在8×8的子块上的幅值b[x,y]。其中,x,y为空间域的坐标,u,v对应频率域的坐标。
1.2 量化
注意:图像信息损失是在量化阶段而不是DCT阶段。经过上述FDCT,生成了64个频率系数,通过抑制高频成分,来达到压缩的目的。一个主要原因是由于人眼对高频成分不敏感,故可以移除部分高频成分,而对图像感官质量影响很小;另一个原因是大多数图像中的灰度值是个渐变的过程,而频率高的部分携带的信息很少。通过使用量化矩阵Q(u,v)对F(u,v)进行量化,大部分高频系数会被量化成0。JPEG标准没有指定量化矩阵的数值,可以根据需要自己定义,下面是JPEG标准提供的两种量化矩阵作为参考,一种为低压缩,另一个为高压缩。
1.3 熵编码
☆ Zig-Zag扫描
通过上述量化矩阵,大部分高频系数被量化为0,为了方便进行熵编码,把8×8的系数矩阵转化为1×64的一维数据,而且采用的方式为Zig-Zag扫描法,采用Z字型的好处是可以把低频系数和高频系数集中在一起,而随着频率的增加,高频系数基本上都是0,方便采用0行程编码从而压缩数据。
☆Huffman编码----->Huffman详细原理
1.DC系数-DPCM
由于DC系数是整个8×8块的均值,所以相邻块的DC系数有很大的相关性,同时DC系数通常比AC系数要大得多,JPEG标准对DC系数采用相邻DC差分(DPCM),通常Diff具有很小的数值,然后进行Huffman编码。如下图所示(第一个块的DC定义为0)。
2.AC系数-行程编码
采用Zig-Zag扫描后,高频成分被量化为0,而且基本集中在一起,可以对AC系数采用0行程编码,即记录此数值前的连续非零数值个数。下面是个对AC系数压缩的例子。
2. An example--JPEG压缩&解压缩
下面是一个压缩算法过程,对彩色图像,采用分层处理,即对不同通道分别压缩,解压缩是一个逆向的过程:
---------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------
参考:
The JPEG Still Picture Compression Standard,IEEE Transactions on Consumer Electronics,1991.
Basic Image Compression Algorithm and Introduction to JPEG Standard,Pao-Yen Lin.