JPEG编码解码流程.doc
文本预览下载声明
JPEG图片压缩算法流程详解
薛晓利
JPEG是Joint Photographic Exports Group的英文缩写,中文称之为联合图像专家小组。该小组隶属于ISO国际标准化组织,主要负责定制静态数字图像的编码方法,即所谓的JPEG算法。JPEG专家组开发了两种基本的压缩算法、两种熵编码方法、四种编码模式。如下所示:
压缩算法:
有损的离散余弦变换DCT(Discrete Cosine Transform)
无损的预测压缩技术;
熵编码方法:
Huffman编码;
算术编码;
编码模式:
基于DCT的顺序模式:编码、解码通过一次扫描完成;
基于DCT的渐进模式:编码、解码需要多次扫描完成,扫描效果由粗到精,逐级递增;
无损模式:基于DPCM,保证解码后完全精确恢复到原图像采样值;
层次模式:图像在多个空间分辨率中进行编码,可以根据需要只对低分辨率数据做解码,放弃高分辨率信息;
在实际应用中,JPEG图像编码算法使用的大多是离散余弦变换、Huffman编码、顺序编码模式。这样的方式,被人们称为JPEG的基本系统。这里介绍的JPEG编码算法的流程,也是针对基本系统而言。
基本JPEG压缩编码一共分为个步骤:颜色模式转换采样、离散余弦变换、Zigzag 扫描排序、DC系数的差分脉冲调制编码、AC系数的游程长度编码熵编码一般是4:1:1或者4:2:2(4:1:1含义就是:在2x2的单元中,本应分别有4个值,用12个字节经过采样处理后,每个单元中的值分别有4、1、1个,只要用6个字节)。这样的采样方式,
分块
由于后面的DCT变换是是对8x8的子块进行在进行DCT变换之前必须把源图象数据分块。源图象中每点的3个分量是交替出现的,先要把这3个分量分开,存放到3张表中去。然后由左及右,由上到下取8x8的子块,存放在长度为64的表中,即可以进行DCT变换。注意,编码时,程序从源数据中读取一个8x8的数据块后,进行DCT变换,量化,编码,然后再读取、处理下数据块。
PEG 编码是8x8个点为一个单位处理的. 所以如果原始图片的长宽不是 8 的倍数, 都需要先补成8的倍数, 一块块的处理
离散余弦变换
DCT(Discrete Cosine Transform,离散余弦变换),是码率压缩中常用的一种变换编码方法。任何连续的实对称函数的傅里叶变换中只含有余弦项,因此,余弦变换同傅里叶变换一样具有明确的物理意义。DCT是先将整体图像分成N*N的像素块,然后针对N*N的像素块逐一进行DCT操作。需要提醒的是,JPEG的编码过程需要进行正向离散余弦变换,而解码过程则需要反向离散余弦变换。
正向离散余弦变换计算公式:
反向离散余弦变换计算公式:
这里的N是水平、垂直方向的像素数目,一般取值为8。8*8的二维像素块经过DCT操作之后,就得到了8*8的变换系数矩阵。这些系数,都有具体的物理含义,例如,U=0,V=0时的F(0,0)是原来的64个数据的均值,相当于直流分量,也有人称之为DC系数或者直流系数。随着U,V的增加,相另外的63个系数则代表了水平空间频率和垂直空间频率分量(高频分量)的大小,多半是一些接近于0的正负浮点数,我们称为交流系数AC集中在的左上角。
这里,我们暂时先只考虑水平方向上一行数据(8个像素)的情况时的DCT变换,从而来说明其物理意义。如下图所示:
原始的图像信号(最左边的波形)经过DCT变换之后变成了8个波,其中第一个波为直流成分,其余7个为交流成分。
可见图像信号被分解为直流成分和一些从低频到高频的各种余弦成分。而DCT系数只表示了该种成分所占原图像信号的份额大小。显然,恢复图像信息可以表示为下面的式子:
F(n) = C(n)*E(n),这里,E(n)是一个基底,C(n)是DCT系数,F(n)则是图像信号;如果考虑垂直方向的变化,那就需要一个二维的基底。大学里面的信号处理,傅里叶变换等课程上也讲过,任何信号都可以被分解为基波和不同幅度的谐波的组合,而DCT变换的物理意义也正是如此。
由于大多数图像的高频分量比较小,相应的图像高频分量的DCT系数经常接近于0,再加上高频分量中只包含了图像的细微的细节变化信息,而人眼对这种高频成分的失真不太敏感,所以,可以考虑将这一些高频成分予以抛弃,从而降低需要传输的数据量。这样一来,传送DCT变换系数的所需要的编码长度要远远小于传送图像像素的编码长度。到达接收端之后通过反离散余弦变换就可以得到原来的数据,虽然这么做存在一定的失真,但人眼是可接受的,而且对这种微小的变换是不敏感的。
Zigzag扫描排序
DCT 将一个 8x8 的数组变换成另一个 8x8 的数组. 但是内存里所有数据都是线形存放的, 如果我们一行行的存放这 64 个数字, 每行的结尾的点和下
显示全部