图像压缩原理基础 连载1 JPEG静态图像压缩
从今天开始的《图像压缩原理基础》将会以大约每周一篇的速度,用浅显易懂的语言讲述静态图像以及动态图像压缩的原理。这个系列的文章既是我在向大家讲述视频压缩的基础知识,同时也是我在学习这些知识的“学习笔记”。
* 本文(包含其插图)严禁转载,并且不会同意您的转载请求。如有需要引用或介绍本文,您可以提供本文的连接。
本节以JPEG为例,讲解静态图像压缩的原理。JPEG图像压缩主要分为下面四个过程,离散余弦变换、量化、编码以及组成位数据流。下面通过一个简单的例子说明各步骤的原理。
1.离散余弦变换
(1)通过离散余弦变换(DCT变换,下略),可以将能量集中在矩阵左上角的少数几个系数上。简单地说,我们可以将DCT看作用一个8行8列的二维数组产生另一个8行8列的二维数组的函数。也就是说,把一个数组通过某种变换,变成另一个数组。
首先将一幅图像划分成一个个8*8像素的图像块。比如,原图的尺寸是640*480,那么将会被划分成80行60列的图像块。如果图像只包含灰度,那么每个象素都会用一个8bit的数字表示。因此可以将每个图像块表示成一个8行8列的二维数组,这个数组中每个元素都是0~255的8bit整数。DCT变换就是作用在这个数组上。再看一下彩色的情况。如果图像是彩色的,那么每个象素都可以用24bit、相当于3个8bit的组合来表示。因此可以用3个8行8列的数组来表示这个8*8的图像块。DCT变换作用于每一个数组。
(2)用f表示像素值的数组,f(i,j)表示第i行第j列的值,则DCT变换之后定义一个新的数组F(u,v)表示第u行v列的值。
DCT变换通过下面公式完成:

逆DCT变换公式:

在上面两公式中,当u,v=0时,
,其他情况下,C(u),C(v)=1。
下面举例说明。下面矩阵表示一个8*8的图像样本的原始数组。

为了便于计算,在进行变换之前先对原始图像中的每个样本数据减去128。然后再按照公式计算出数组中每个元素的值。举F(0,0)的值的计算过程如下:

按照这样,继续计算其他值:

f(i,j)经过DCT变换之后得到了F(i,j),其中F(0,0)是直流系数,称为DC系数,其他的为交流系数,称为AC系数。
2.量化
为了达到压缩的目的,我们需要对经过DCT变换的DCT系数进行量化,目的是减小非0系数的幅度以增加0值系数的数目。在一定的主观保真的前提下,丢掉那些对视觉效果影响不大的数据。量化是压缩过程中造成质量下降的最主要原因。
因为人眼对于亮度的感知能力高于色度,JPEG压缩时使用了两个量化表——色度量化表和亮度量化表。

对于上面的例子,我们使用亮度量化表对其进行量化,得到数组Q(i,j)。量化的公式是:

其中U(i,j)为量化表中第i行j列的值。也就是说,要用数组F中的每一个元素除以量化表中起对应位置的值。按照这个公式,我们对上面例子中的数组F进行量化后得到如下结果Q:

我们很高兴地看到,呃……基本上都变成了0。
3.编码
z形排列:对图像块进行DCT变换后,能量集中在矩阵左上角的少数几个系数上。所以一般左上角的数值比较大,而0则主要集中在矩阵右下角。为了增加连续的0的个数,我们采用z形排列(zigzag),以便更好地压缩数据。这样,我们就能把一个8*8的矩阵转换成一个1*64的矢量。我们将上面经过量化的结果Q进行z形排列,如下所示:

经过z形排列之后,结果变成了:15 0 -2 -1 -1 -1 0 0 -1 0 0 ……后面全部是连续的0,这样一来,连续0的个数变多了。
DC系数编码:8*8图块经过DCT变换后得到的DC系数有两个特点,一个是数值很大,另一个是相邻两个图块之间的DC系数很相近。因此,JPEG采用取DPCM编码对DC系数差进行编码。公式如下:

其中Delta为差值,即差值为当前图块DC系数减去上一个图块的DC系数。
AC系数的编码:经过量化的AC系数的特点是有很多连续的0。所以可以使用非常简单和直观的RLE编码对其进行编码。
霍夫曼编码([size=-1]*注1 注2):在JPEG有损压缩中,使用霍夫曼编码来减少熵(读Shang,1声)。压缩数据符号的时候,霍夫曼编码器对出现频率较高的符号使用较短的代码,对于出现频率较低的符号使用较长的代码,最终使得编码的平均码字最短。
4.组成数据位流
JPEG编码的最后一步为把各种标记代码和编码后的图像组成数据,这样做的目的是为了便于传输、存储和译码器进行译码。
注1:JPEG标准也允许(但是并不要求)使用在数学上优于霍夫曼编码的算术编码。然而,这个特色几乎很少被使用,因为它被专利所涵盖,且它相较于霍夫曼编码在编码和解码上会更慢。使用算术编码一般会让档案更小约 5%。
注2:Huffman编码,除“霍夫曼编码”外,还有“哈夫曼编码”等其他译法存在。
本文参考资料:
《多媒体技术基础》 雷运发主编 中国水利水电出版社 2005年4月出版
中文Wikipedia中关于JPEG的条目:http://zh.wikipedia.org/wiki/JPEG
话题:图像处理

No.1 回复
注2:Hufffman编码
-> Huffman
No.4 回复
感谢MR提出 -0- 打的时候手一抖多了一个f
但是请不要酱紫考验我的blog程序囧
No.5 回复
我发了一条,然后说连接服务器超时。于是又发了一条,还是没响应。然后再发了一条,出来了囧
No.6 回复
(1)通过离散余弦变换(DCT变换,下略)
这个超级链接指向了 哈夫曼树……
No.7 回复
啊,再次感谢 :)
No.409 回复
很详细滴解说,谢谢讲解.. .