|
|
8×8分块;正向离散余弦变换(FDCT);量化(quantisation); Z字形编码(zigzag scan);使用差分脉冲编码调制(DPCM)对直流系数(DC)进行编码;使用行程长度编码(RLE)对交流系数(AC)进行编码;熵编码(Huffman或算术);组成位数据流。
|
|
|
|
JPEG编码需要先将整个图像分成8×8像素的图像块,然后对每个图像块分别进行编码。在划分过程中,对于不足部分可以通过重复图像的最后一行/列进行填充。被划分成功的图像块作为二维正向离散余弦变换的输入。
|
|
|
|
JPEG编码对每个单独的颜色图像分量分别进行正向离散余弦变换(Forward Discrete Cosine Transform, FDCT)。
|
|
|
FDCT变换的好处在于:通过FDCT变换可以把能量集中在频率较低的少数的几个系数上。例如,对于一个8×8像素的灰度图像块进行FDCT变换后的数值如下图所示。
|
|
|
|
|
|
|
其中,f(i,j)是图像样本矩阵或样本的预测误差矩阵,F(u,v)是f(i,j)经过FDCT变换后的系数矩阵。
|
|
|
|
其中,F(0,0)称为直流系数(Direct Current, DC),表示8×8个像素值的平均值。其他F(u,v)称为交流系数(Alternating Current, AC)。其逆变换使用下式计算。
|
|
|
|
|
经过FDCT变换后的系数,其数值变化较多,不利于编码。为了将系数数值映射到更小的取值范围,可以使用量化(quantisation)实现。通过量化可以减小非0系数的幅度和增加0值系数的数目。当然,量化也是导致图像质量下降的主要原因。
|
|
|
JPEG的有损压缩算法使用均匀标量量化器进行量化,量化步距是按照系数所在的位置和每种颜色分量的色调值确定的。
|
|
|
由于人眼对亮度信号比对色差信号更敏感,因此JPEG编码中使用了亮度量化表和色差量化表两种标准的量化表,参见下1表和下2表。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此表中的左上角的量化步距要比右下角的量化步距小。
|
|
|
|
|
|
|
|
|
其中,Sq(u,v)为量化后的结果,F(u,v)为FDCT系数,Q(u,v)为量化表中的数值,round为舍入取整函数。
|
|
|
|
量化后的二维系数需要重新编排并转换为一维系数,为了增加连续的0系数的个数,即0的游程长度,JPEG编码中AC系数的编排采用Z字形编排方法,其编排的序号顺序如下图所示。
|
|
|
|
|
这样就把一个8×8的矩阵变成了一个1×64的矢量,频率较低的系数放在矢量的头部。
|
|
|
|
DC直流系数有两个特点:一是系数的数值比较大;二是相邻图像块的DC系数的数值变化不大。根据这些特点,JPEG算法使用了差分脉冲编码调制(DPCM)技术,对相邻图像块之间的DC系数的差值Δ进行如下编码。
|
|
|
|
其中,k表示当前的编码块,k-1表示前一个编码块。
|
|
|
|
量化AC系数的特点是1×63矢量中包含有许多0系数,并且许多0是连续的,因此使用非常简单和直观的游程长度编码(RLE)对它们进行编码。
|
|
|
JPEG使用了1字节的高4位表示连续0的个数,使用它的低4位表示编码下一个非0系数所需要的位数,紧随其后的是量化AC系数的数值。
|
|
|
|
使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交流AC系数做进一步压缩。
|
|
|
在JPEG有损压缩算法中,通常使用Huffman或算术编码减少熵。使用Huffman编码器的理由是可以使用很简单的查表(lookup table)方法进行快速编码。当压缩数据符号时,Huffman编码器为出现频度较高的符号分配较短的代码,而为出现频度较低的符号分配较长的代码,这种可变长度的Huffman码表可以事先定义。
|
|
|
下表所示为DC码表符号举例,如果DC的值(value)为4,符号SSS用于表达实际值所需要的二进制位数,则SSS的实际位数为3。
|
|
|
|
|
|
JPEG编码的最后一个步骤是把各种标记代码和编码后的图像数据组成一帧一帧的数据,这样做的目的是便于传输、存储和译码,这样组织的数据通常称为JPEG位数据流(JPEG bitstream)。
|
|
|