JPEG(baseline)压缩综述
□ David Katz Rick Gentile
《电子与电脑》 2007年第01期
图像压缩一度曾属于个人计算机(PC)范畴,现在正普遍用于嵌入式环境。这种趋势很大程度上是由于新的DSP处理能力提高和多媒体功能增强的结果。从而,这成为嵌入式产品设计工程师为提高图像压缩效率更好地理解图像算法的优势。本文介绍了JPEG(baseline)压缩标准,它是现在采用的所有图像压缩算法中最流行的算法。当这里没没有明确指出时,JPEG解码(解压缩)过程与其编码(压缩)过程正好相反。
JPEG标准虽然有许多规定的版本,其中 JPEG(baseline)压缩标准(这里简称JPEG压缩)包括一组最基本的要求。JPEG属于有损压缩算法,所以原图像不能精确地重构(虽然也有“无损JPEG”压缩标准)。JPEG利用人的视觉系统特性,去掉或减少那些对眼睛不敏感的数据。JPEG适合用于灰度级和彩 {MOD}图像,特别是照片,但是它并不适合双 {MOD}图像。图1示出了JPEG压缩过程,将在下文做比较详细介绍。
预处理
颜 {MOD}空间
输入的未压缩图像可按照多种格式中的一种保存。一种流行的24 bit的RGB格式,即每个红、绿和蓝像素对应8 bit。但是,考虑到对一幅给定的图像有R、G和B三个独立的子通道,通常在这3个子通道之间存在明显的视觉相关性。因此,为了获得更加压缩比,通常将RGB格式解相关得到分立的亮度(Y)和 {MOD}差(Cb、Cr)分量。变换公式如下:
Y=0.299(R-G) + G + 0.114(B-G)
Cb=0.564(B-Y)
Cr=0.713(R-Y)
空间滤波
因为人眼对亮度信号比对 {MOD}差信号更敏感,所以通过对 {MOD}差(Cb,Cr)分量滤波(子采样)能够降低图像带宽。一个没经过滤波的图像,子像素的排列为{Y,Cb,Cr,Y,Cb,Cr,Y…}的称为4:4:4格式,因为对于每4个连续采样点取4个Cb,,4个Cr和4个亮度Y样本。这相当于,每个像素都由一个完整{Y,Cb,Cr}组成。换一种表达方式就是,对一幅720×480像素的图像,4:4:4格式意味着这3个分量样本中每个分量图像都是720×480字节(byte)。
如果通过对 {MOD}差分量滤波我们可把水平带宽降至原来的一半,我们可得到4:2:2格式{Cb,Y,Cr,Y,Cb,Y,Cr,Y,…}。这里,每个像素由一个字节的Y和一个字节的Cb或Cr组成。因此,对于一幅720×480的图像,4:2:2格式意味着Y分量图像为720×480字节,Cb和Cr分量图像每个都是360×480字节。
为了进一步降低图像带宽,可以再在竖直方向对 {MOD}差分量滤波。这就得到了4:2:0格式,意味着对于一幅720×480图像,其Y分量图像为720×480字节,Cb和Cr分量图像每个都是360×240字节。
不论选择何种格式,图像都会被单独存入Y,Cb和Cr缓冲区,因为JPEG算法按照相同的方式在每个分量上单独地执行。如果 {MOD}差分量被滤波,那么这就相当于在减小尺寸的图像上运行JPEG算法。
JPEG算法在8×8字节的数据块上的操作如图1示出。因此,在每个图像缓冲区中,数据被从左到右、从上到下地划分成8×8个象素块。这些象素块不重叠,如果图像的行和列象素数不是8的倍数,那么就要根据需要通过重复图像的最后一行或列来填充。
图1: JPEG压缩数据流程示例
DCT变换
JPEG算法中的DCT变换利用这样的一个事实:人眼对低频分量的图像比对高频分量的图像更敏感。8×8 DCT变换把空间域表示的图像变换成频率域表示的图像。虽然其它频率变换也会有效,但选择DCT变换的原因是其解相关特性,图像独立性,压缩图像能量的有效性和正交性(这使DCT反变换非常简单)。此外,二维(2D)DCT变换的可分特性允许在8列向量上计算一维(1D)DCT,接着在得到的8×8矩阵的8行向量上计算1D DCT。该8×8 DCT可按照下式表示:
Ymn=1/4 KmKn
Xij cos((2i+1)mπ/16) cos((2j+1)nπ/16)
其中:
Ymn =8×8输出块的第m行第n列的输出DCT系数
Xij =8×8输入块的第i行第j列的输入空间图像坐标
Km = ,当 m=0时; 或 1 ,当m为其余值时
Kn = ,当n=0时;或1,当n取其余值时
为了统一地处理不同的图像分量,DCT编码器通常要求所有像素的期望平均值为0。因此,在完成DCT变换之前,需要从每个像素(一般从1~255范围内)减去128将其范围变换为-127~127。这种偏移对于像素块的交流(AC)系数特性没有影响。
图2: 每个8×8像素块与64个基函数相关。每个相关的结果产生“1”输出系数
观察DCT变换很有启发性。参见图2中示出的DCT基函数。在一个8×8像素块上完成DCT变换,我们实际上做的事情是将输入8×8像素块与64个DCT基函数相关并且将表征相关性程度的相关系数记录在输出DCT矩阵中。
例如,输出DCT矩阵在(2,1)的系数对应于在(2,1)的基函数与整个8×8输入像素块之间的相关系数。高频分量对应的相关系数位于DCT数据块的右下角,并且我们的目的正要使这些系数变为零——在8×8 DCT数据块中零系数越多,获得的压缩比就越大。在下面介绍的量化步骤中,我们将讨论如何减小矩阵中非零系数的幅度和增加零系数的数目。