首页 百科知识 算法的主要计算步骤

算法的主要计算步骤

时间:2022-10-05 百科知识 版权反馈
【摘要】:JPEG可处理的最大分量数为255。预备数据块要满足DCT过程要求的4800光度块和两个1200 的色差块,然后将块一个一个地送往DCT。在计算二维的DCT变换时,可使用计算式(6.3)和(6.4)把二维的DCT变换变成一维的DCT变换,如图6.14所示。每个初始块由64个表示样本信号特定分量的振幅值组成,该振幅是一个含二维空间坐标的函数。这是JPEG压缩算法的真正含义。

1. 预备数据块

JPEG可压缩灰度和彩色图像,但该标准并不提供表示彩色图像初始格式。彩色图像的表示方法:彩色图像可用RGB三原色,YUV或YIQ三原色,YCr Cb的三原色表示。这些彩色图像的表示方法也可以相互转换。表示图像的各数字化分量可以进行二次采样——如色差分量通常就是这样的。由于被压缩图像的大小是可变的,二次抽象又是未知的,所以JPEG将预先处理相当数目的图像分量。JPEG可处理的最大分量数为255。实际应用中,常规的彩色图像仅使用三种分量。

JPEG压缩的第一步是预备数据块。JPEG压缩编码并不是对整个图像进行编码的。在编码器的输入端,把原始图像顺序地分割成一系列8×8的子块。在过程链中的每一步中对每个块分别进行处理。图像分块处理时,对图像块的大小没有限制,图像的变换、量化和熵编码等所有的处理都是以图像块为单元。这样做有两个明显的好处,一是可以降低对存储器的要求,二是便于抽出一幅图像中的部分图像。其缺点是图像质量有所下降,但不明显。如图6.12所示为一幅图像,用R、G、B三分量表示,将每分量分为一系列的8×8像素块。

图6.12 JPEG预备数据块的例子

举一个例子说明预备数据块的过程。假设有一幅彩色图像用YUV(光度Y和两个色差U和V)表示,图像的大小为480行,每行640个像素。因而,如果假设色度分解为4:1:1,光度分量就是一个640×480的数值矩阵,每个色差分量是一个320×240的数值矩阵。预备数据块要满足DCT过程要求的4800光度块和两个1200 的色差块,然后将块一个一个地送往DCT。在每个分量内从左至右、从上至下进行。

2. 正向离散余弦变换(FDCT)

下面对正向离散余弦变换(FDCT)作几点说明。

(1)对每个单独的彩色图像分量,把整个分量图像分成8×8的图像块,如图6.13所示,并作为二维离散余弦变换(DCT)的输入。通过DCT变换,把能量集中在少数几个系数上。

图6.13 离散余弦变换

(2)DCT变换使用公式(6.1)计算

它的逆变换使用公式(6.2)计算

上面两式中,C(u),C(v)=1/,当u,v=0;

      C(u),C(v)=1,其他。

f (i,j)经DCT变换之后,F (0,0)是直流系数,其他为交流系数。

(3)在计算二维的DCT变换时,可使用计算式(6.3)和(6.4)把二维的DCT变换变成一维的DCT变换,如图6.14所示。

图6.14 二维DCT变换方法

每个8×8二维图像采样数据块,是64点离散信号,FDCT把这些信号作为输入,然后把它分解成64个正交基信号。

离散余弦变换的目的是将数据预备块处理的每个块从空间域变换为频率域。每个初始块由64个表示样本信号特定分量的振幅值组成,该振幅是一个含二维空间坐标的函数。假设用a=f (x,y)表示该函数,其中x、y是两个二维空间向量。在经过离散余弦变换后,该函数变为C=g(Fx,Fx),其中C是一个系数,Fx和Fy分别是各方向的空间频率。经过变换后原来的数值变为另一个64个数值的方阵,和原来的数值相比不同的是,方阵中的每个数值不再表示信号在采样点(x,y)的振幅,而表示一个DCT系数(也就是说,是一个特定的频率值),离散余弦变换过程如图6.15所示。

图6.15 离散余弦变换的二维表示法

在表示幅度坐标的图中,各竖线表示的是在采样点信号的幅值,而经过离散余弦变换后的DCT系数中,各竖线表示的是DCT系数,其中系数g(0,0)是与零频率相对应的系数,称为DC系数,它是64个样本的平均值。那么为什么要进行离散余弦变换呢?在一个表示图像的块中,各点处的采样值都有所差别。因此最低频率的系数将会最大,但是中间和高频的系数会很小或者为0值。也就是说把信号的能量聚集在最小的空间频率内。在数据压缩过程中就可以把这些中间频率和高频的系数忽略,而只保留低频的系数,这样就可以大大减少数据量,实现数据压缩。把这种思想应用于低频率的情况。想象给一个平面单色墙拍摄一张照片,并将它分成8×8方块,如图6.16所示。左边的方格图为图像的光亮度成分样本,经过离散余弦变换后如右边的方格图所示。由于频率是指各方向的变化率,而每个信号的振幅几乎不变,也即各方向的值变化很小,因此零频率将很高,而其他频率几乎为零。如果在墙上画一条黑线,图像就变复杂了,一些块将会受到影响。在影响到的块中,相邻值之间会快速发生改变,这将使最高频率具有一个高系数,但并不是所有的块都会受到影响。

实际应用中,连续色调图像(例如相片)中并没有很多明线或区域,区域间的连接通常很平滑。因此信息通常主要位于低频处。这也正是JPEG中所做的假设,JPEG的假设是基于这样一个事实:人眼对于高或低空间频率不如中等空间频率敏感。因此,没有必要复制出高保真、清晰的区域边界,这是因为人眼对亮度的改变反应尤其迟钝。由此可以看出JPEG并不适合过于复杂的图像,特别是那些看起来像双色调图像的图像。

图6.16 离散余弦变换应用于每个图像分量的8×8方阵

3. 量化

实际上,在量化之前,还并没有发生数据丢失,也就是说如果这时将图像如此的传送或保存,然后再应用逆向变换,原始图像就可以准确地再现。量化的目标是用最低精度的DCT系数来实现深度压缩,量化中用一个预定义的值去除每个DCT系数来对其标准化。这些预定义的值事先存放在一个称为量化表的8×8平方块中,如图6.17所示。

在JPEG标准中采用线性均匀量化器,量化定义为:对64个DCT变换系数F(u,υ)除以量化步长,四舍五入取整。如式(6.5)所示。

FQ(u,υ)=Integer Round[F(u,υ)/Q(u,υ)]  (6.5)

式中Q (u,υ)是量化器步长。

图6.17 量化示意图

经过量化的DCT系数表就产生了连续为“0”的现象,这正是压缩算法最需要的局面,即大面积空间冗余,可以用无损压缩的方法消除重复序列。用量化铲除DCT系数表高频部分的较小的数,而低频主能量仍然保留,这对角频率较低的人眼非常合适,人眼能够接受低频部分,而对高频去除部分没有感觉。这是JPEG压缩算法的真正含义。

对于有损压缩算法,JPEG算法使用如图6.18所示的均匀量化器进行量化,量化步长按照系数所在的位置和每种颜色分量的色调值来确定。因为人眼对亮度信号比对色差信号更敏感,因此使用了两种量化表:表6.2所示的亮度量化表和表6.3所示的色差量化表。此外,由于人眼对低频分量的图像比对高频分量的图像更敏感,因此图中的左上角的量化步长要比右下角的量化步长小。表6.2和表6.3中的数值对CCIR 601标准电视图像已经是最佳的。如果不使用这两种表,也可以用自己的量化表替换它们。

图6.18 均匀量化器

表6.2 亮度量化表

表6.3 色度量化表

4.Z字形编排

量化后的系数要重新编排,目的是为了增加连续的“0”系数的个数,就是“0”的行程长度,方法是按照Z字形的式样编排,DCT系数的序号如图6.19所示,这样就把一个8×8的矩阵变成了一个1×64的矢量。频率较低的系数放在矢量的顶部。

图6.19 系数的“Z”形扫描方式排序

5. 熵编码

使用熵编码还可以对DPCM编码后的直流DC系数和RLE编码后的交流AC系数作进一步的压缩。

在JPEG有损压缩算法中,使用赫夫曼编码器来减少熵。使用赫夫曼编码器的理由是可以使用很简单的查表(lookup table)方法进行编码。压缩数据符号时,赫夫曼编码器对出现频度比较高的符号分配比较短的代码,而对出现频度较低的符号分配比较长的代码。这种可变长度的赫夫曼码表可以事先进行定义。

(1)交流系数的编码。首先,对“Z”形扫描排序后得到的比特流用行程长度编码的思想进行编码。交流系数AC被编码后,成为由两个符号位组成的数据流。这两个符号,符号1 的格式位〈行程,尺寸〉行程,这个“行程”是指“Z”形扫描后的比特流中前后两个非零AC系数之间连续零的个数;“尺寸”是后一个非零AC系数幅值表示需要的比特数。符号1占用一个字节,其中高四位表示行程参数,低四位表示幅值尺寸参数。一个基本符号 1,可表示的行程范围为1~15,当两个非零AC系数之间连续零的个数超过15时,用增加扩展符号1“(15,0)”的个数来扩充。对于8×8块的63个AC系数最多增加3个“(15,0)”扩展符号1。符号2代表非零AC系数的幅值大小,其范围为[-210,210-1]。

(2)直流系数的编码。8×8图像块经过DCT变换之后得到的DC直流系数有两个特点,一是系数的数值比较大,二是相邻8×8图像块的DC系数值变化不大。根据这个特点,JPEG算法使用了差分脉冲编码调制(DPCM)技术,对相邻图像块之间的DC系数的差值(Delta)进行编码:

Delta=DC(0,0)-DC(0,0)

对直流分量DC系数,也要在熵编码之前转换为两个符号的格式。但这不是用行程编码的思想进行变换。符号1只代表尺寸信息,用以表示DC系数差值的幅值所需的比特数;符号2表示值的幅值大小,其动态范围为[-211,211-1],幅值尺寸大小以1~11bit表示。

然后对前一步编码的结果,就是一系列的符号1和符号2,赋以变长码字,可变长度熵编码就是对这种符号队序列的统计编码。JPEG建议使用两种熵编码方法:赫夫曼(Huffman)编码和自适应二进制算术编码(Adaptive Binary Arithmetic Coding)。对DC系数和AC系数中的符号1,采用赫夫曼表中的可变长度码(Variable-Length Code,缩写为VLC)进行编码。符号2用变长整数(Variable-Length Integer,缩写为VLI)表示。赫夫曼变长码表和变长整数表必须作为JPEG编码器的输入。

[例]表6.4所示的是DC码表符号举例。如果DC的值(Value)为4,符号SSS用于表达实际值所需要的位数,实际位数就等于3。

表6.4 DC码表符号举例

6. 组成位数据流

JPEG编码的最后一个步骤是把各种标记代码和编码后的图像数据组成一帧一帧的数据,这样做的目的是为了便于传输、存储和译码器进行译码,这样组织的数据通常称为JPEG位数据流(JPEG bitstream)。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈