JPEG压缩过程 DCT算法

  • Post author:
  • Post category:其他



MPEG采用了Ahmed(一个巨牛的数学家) 等人于70年代提出的离散余弦变换(DCT-Discrete Cosine Transform)压缩算法,降低视频信号的空间冗余度。

DCT将运动补偿误差或原画面信息块转换成代表不同频率分量的系数集,这有两个优点:其一,信号常将其能量的大部分集中于频率域的1个小范围内,这样一来,描述不重要的分量只需要很少的比特数;其二,频率域分解映射了人类视觉系统的处理过程,并允许后继的 量化过程满足其灵敏度的要求。

关于这一点在我手头的教程中有详尽的描述,让我直接引用:



视频信号的频谱线在0-6MHz范围内,而且1幅视频图像内包含的大多数为低频频谱线,只在占图像区域比例很低的图像边缘的视频信号中才含有高频的谱线。因此,在视频信号数字处理时,可根据频谱因素分配比特数:对包含信息量大的低频谱区域分配较多的比特数,对包含信息量低的高频 谱区域分配较少的比特数,而图像质量并没有可察觉的损伤,达到码率压缩的目的。然而,这一切要在低熵(Entropy)值的情况下,才能达到有效的编码。能否对一串数据进行有效的编码,取决于每个数据出现的概率。每个数据出现的概率差别大,就表明熵值低, 可以对该串数据进行高效编码。反之,出现的概率差别小,熵值高,则不能进行高效编码。视频信号的数字化是在规定的取样频率下由A/D转换器对视频电平转换而来的,每个像素的视频信号幅度随着每层的时间而周期性地变化。每个像素的平均信息量的总和为总平均信息量,即熵值。由于每个视频电平发生几乎具有相等的概率,所以视频信号的熵值很高。 熵值是一个定义码率压缩率的参数,视频图像的压缩率依赖于视频信号的熵值,在多数情况下视频信号为高熵值,要进行高效编码,就要将高熵值变为低熵值。怎样变成低熵值呢?这就需要分析视频频谱的特点。大多数情况下,视频频谱的幅度随着频率的升高而降低。其中 低频频谱在几乎相等的概率下获得0到最高的电平。与此相对照,高频频谱通常得到的是低电平及稀少的高电平。显然,低频频谱具有较高的熵值,高频频谱具有较低的熵值。据此,可对视频的低频分量和高频分量分别处理,获得高频的压缩值。




由上面的引用可见,码率压缩基于变换编码和熵值编码两种算法。前者用于降低熵值,后者将数据变为可降低比特数的有效编码方式。在MPEG标准中,变换编码采用的是DCT,变换过程本身虽然并不产生码率压缩作用,但是变换后的频率系数却非常有利于码率压缩。


实际上压缩数字视频信号的整个过程分为块取样、DCT、量化、编码4个主要过程进行


—–首先在时间域将原始图像分成N(水平)×N(垂直)取样块,根据需要可选择4×4、4×8、8×8、8×16、16×16等块,这些取样的像素块代表了原图像帧各像素的灰度值,其范围在139-163之间,并依序送入DCT编码器,以便将取样块由时间域转换为频率域的DCT系数块。DCT系统的转换分别在每个取样块中进行,这些块中每个取样是数字化后的值,表示一场中对应像素的视频信号幅度值。

DCT和它解压时的反运算的具体算法如下。

当u,v = 0 时,离散余弦正变换(DCT)后的系数若为F(0,0)=1,则离散余弦反变换(IDCT)后的重现函数f(x,y)=1/8,是个常数值,所以将F(0,0)称为直流(DC)系数;当 u,v≠0时,正变换后的系数为F(u,v)=0,则反变换后的重现函数f(x,y)不是常数,此时正变换后的系数F(u,v)为交流(AC)系数。




(a) 和 2(b) 展示了针对灰度图像这种编码器和解码器的关键处理步骤。

彩色图像压缩能被近似看作多个灰度图像的压缩,全部同时进行,或者依次从中取出一个8×8数据块进行处理。

在这篇文章中,我们只讨论灰度图像。

(a)JPEG 编码器结构图




(b)JPEG 解码器结构图









基于DCT的编码器本质上可看作对8×8个图像块流的压缩。每个图像块经过各个处理步骤,产生压缩形式的结果汇入数据流。





因为相邻象素高度相关,前向DCT(FDCT)处理通过把信号集中到低频部分为数据的压缩打下基础。










本文仅讨论静止图像的压缩基本算法,图像压缩的目的在于以较少的数据来

表示图像以节约存储费用,或者传输时间和费用。

JPEG压缩算法可以用失真的压缩方式来处理图像,但失真的程度却是肉眼所

无法辩认的。这也就是为什么JPEG会有如此满意的压缩比例的原因。

下面主要讨论,JPEG基本压缩法。

一.JPEG压缩过程

JPEG压缩分四个步骤实现:

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

2.DCT变换;

3.量化;

4.编码。

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

RGB色彩系统是我们最常用的表示颜色的方式。JPEG采用的是YCbCr色彩系统。

想要用JPEG基本压缩法处理全彩色图像,得先把RGB颜色模式图像数据,转换为

YCbCr颜色模式的数据。Y代表亮度,Cb和Cr则代表色度、饱和度。通过下列计算

公式可完成数据转换。

Y=0.2990R+0.5870G+0.1140B

Cb=-0.1687R-0.3313G+0.5000B+128

Cr=0.5000R-0.4187G-0.0813B+128

人类的眼晴对低频的数据比对高频的数据具有更高的敏感度,事实上,人类

的眼睛对亮度的改变也比对色彩的改变要敏感得多,也就是说Y成份的数据是比较

重要的。既然Cb成份和Cr成份的数据比较相对不重要,就可以只取部分数据来处

理。以增加压缩的比例。JPEG通常有两种采样方式:YUV411和YUV422,它们所代

表的意义是Y、Cb和Cr三个成份的数据取样比例。

2.DCT变换

DCT变换的全称是离散余弦变换(Discrete Cosine Transform),是指将一组

光强数据转换成频率数据,以便得知强度变化的情形。若对高频的数据做些修饰,

再转回原来形式的数据时,显然与原始数据有些差异,但是人类的眼睛却是不容

易辨认出来。

压缩时,将原始图像数据分成8*8数据单元矩阵,例如亮度值的第一个矩阵内

容如下:

JPEG将整个亮度矩阵与色度Cb矩阵,饱和度Cr矩阵,视为一个基本单元称作

MCU。每个MCU所包含的矩阵数量不得超过10个。例如,行和列采样的比例皆为4:

2:2,则每个MCU将包含四个亮度矩阵,一个色度矩阵及一个饱和度矩阵。

当图像数据分成一个8*8矩阵后,还必须将每个数值减去128,然后一一代入

DCT变换公式中,即可达到DCT变换的目的。图像数据值必须减去128,是因为DCT

转换公式所接受的数字范围是在-128到+127之间。

DCT变换公式:

x,y代表图像数据矩阵内某个数值的坐标位置

f(x,y)代表图像数据矩阵内的数个数值

u,v代表DCT变换后矩阵内某个数值的坐标位置

F(u,v)代表DCT变换后矩阵内的某个数值

u=0 且 v=0 c(u)c(v)=1/1.414

u>0 或 v>0 c(u)c(v)=1

经过DCT变换后的矩阵数据自然数为频率系数,这些系数以F(0,0)的值最

大,称为DC,其余的63个频率系数则多半是一些接近于0的正负浮点数,一概称

之为AC。

3、量化

图像数据转换为频率系数后,还得接受一项量化程序,才能进入编码阶段。

量化阶段需要两个8*8矩阵数据,一个是专门处理亮度的频率系数,另一个则是

针对色度的频率系数,将频率系数除以量化矩阵的值,取得与商数最近的整数,

即完成量化。

当频率系数经过量化后,将频率系数由浮点数转变为整数,这才便于执行最

后的编码。不过,经过量化阶段后,所有数据只保留整数近似值,也就再度损失

了一些数据内容,JPEG提供的量化表如下:

4、编码

Huffman编码无专利权问题,成为JPEG最常用的编码方式,Huffman编码通常

是以完整的MCU来进行的。

编码时,每个矩阵数据的DC值与63个AC值,将分别使用不同的Huffman编码

表,而亮度与色度也需要不同的Huffman编码表,所以一共需要四个编码表,才

能顺利地完成JPEG编码工作。

DC编码

DC是彩采用差值脉冲编码调制的差值编码法,也就是在同一个图像分量中取

得每个DC值与前一个DC值的差值来编码。DC采用差值脉冲编码的主要原因是由于

在连续色调的图像中,其差值多半比原值小,对差值进行编码所需的位数,会比

对原值进行编码所需的位数少许多。例如差值为5,它的二进制表示值为101,如

果差值为-5,则先改为正整数5,再将其二进制转换成1的补数即可。所谓1的补

数,就是将每个Bit若值为0,便改成1;Bit为1,则变成0。差值5应保留的位数

为3,下表即列出差值所应保留的Bit数与差值内容的对照。

在差值前端另外加入一些差值的霍夫曼码值,例如亮度差值为5(101)的位

数为3,则霍夫曼码值应该是100,两者连接在一起即为100101。下列两份表格分

别是亮度和色度DC差值的编码表。根据这两份表格内容,即可为DC差值加上霍夫

曼码值,完成DC的编码工作。

AC编码

AC编码方式与DC略有不同,在AC编码之前,首先得将63个AC值按Zig-zag排

序,即按照下图箭头所指示的顺序串联起来。

63个AC值排列好的,将AC系数转换成中间符号,中间符号表示为RRRR/SSSS,

RRRR是指第非零的AC之前,其值为0的AC个数,SSSS是指AC值所需的位数,AC系

数的范围与SSSS的对应关系与DC差值Bits数与差值内容对照表相似。

如果连续为0的AC个数大于15,则用15/0来表示连续的16个0,15/0称为ZRL

(Zero Rum Length),而(0/0)称为EOB(Enel of Block)用来表示其后所

剩余的AC系数皆等于0,以中间符号值作为索引值,从相应的AC编码表中找出适

当的霍夫曼码值,再与AC值相连即可。

例如某一组亮度的中间符为5/3,AC值为4,首先以5/3为索引值,从亮度AC

的Huffman编码表中找到1111111110011110霍夫曼码值,于是加上原来100(4)

即是用来取[5,4]的Huffman编码1111111110011110100,[5,4]表示AC值为4的

前面有5个零。

由于亮度AC,色度AC霍夫曼编码表比较长,在此省略去,有兴趣者可参阅相

关书籍。

实现上述四个步骤,即完成一幅图像的JPEG压缩。


参考资料

[1] 林福宗 《图像文件格式(上)——Windows 编程》,清华大学出版社,

1996年

[2] 李振辉、李仁各编著,《探索图像文件的奥秘》,清华大学出版社,1996年

[3] 黎洪松、成实译《JPEG静止数据压缩标准》,学苑出版社,1996年





JPEG图像压缩算法:

输入图像被分成8*8或16*16的小块,然后对每一小块进行二维DCT(离散余弦变换)变换,变换后的系数量化、编码并传输;

JPEG文件解码量化了的DCT系数,对每一块计算二维逆DCT变换,最后把结果块拼接成一个完整的图像。在DCT变换后舍弃那些不严重影响图像重构的接近0的系数。

DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。