AVS2中的变换量化和熵编码

变换量化

由于空域图像信号之间的相关性很大,因此,通常在进行编码时,并不直接对空域信号进行编码,而是将空域图像映射到频域,求出变换系数,然后对这些变换系数进行编码。而且大多数图像都有一个共同点:平坦区域和内容变化缓慢的区域占据大部分空间,纹理细节区域和突变区域占比较小,也就是说大部分信号位于直流和低频区,只有一小部分信号在高频区。这样变换到频域后,数据之间的相关性大大减小,待编码的数据量也会减小,从而获得较大的压缩比。量化的过程则是为了减少数据的级别,将某一间隔内的数据归结到同一个整数,间隔的大小由量化步长来决定,从而进一步减少码率。

 

常用的变换编码有K-L变换、傅里叶变换、余弦变换和小波变换等。

K-L变换

图像在实际传输过程中,总是混杂有许多随机噪声,K-L变换就是针对这些随机干扰因素进行设计的。K-L变换以统计特性为基础,选取均方误差准则下失真最小的变换核,同时还要满足变换后矢量信号各分量不相关,即变换域信号的协方差为对角矩阵。假设原始信号矩阵为X,变换后的矩阵为Y,T为变换核,x为反变换后恢复的信号,mx和my分别是X和Y的平均向量,则K-L变换满足:

K-L变换能够很好的去除原始信号的相关性,而且失真最小,因此也叫最佳变换。但是二维K-L变换不是可分离的变换,不能通过求两次一维的K-L变换来完成二维K-L变换的运算。同时在变换中计算量极其庞大,复杂度极高,而且没有快速算法,所以在实际应用中很少使用。

离散傅里叶变换DFT

离散傅里叶变换(DFT)是信号分析最基本的方法,它把时间域变换到频率域,进而研究信号的频谱结构和变化规律。

 

一维离散傅里叶变换

对一个连续函数f(x)进行等间隔采样得到的离散序列,假设x为离散空域变量,u为采样频率,那么离散傅里叶变换的表达式为

反变换的表达式为

二维离散傅里叶变换

一幅图像可以看做是一个二维的数据阵列,因此,图像处理就是对二维数据进行处理。假设二维数据阵列为f(x,y),大小为M×N,则二维傅里叶变换的表达式为

反变换的表达式为

 

二维离散傅里叶变换具有分离性,这样就可以借助一系列一维傅里叶变换分两步求出频域的变换系数。另外,还具有平移性、线性、平移性、周期性、正交性等,这些性质在进行图像处理时有重要意义。而且DFT还有快速算法可以加快运算速度。但是DFT也有缺点,要进行复数运算,在数据的描述上相当于实数的两倍。

离散余弦变换

离散余弦变换DCT弥补了DFT的缺点,实际上是傅里叶变换的实数部分。DCT与K-L变换和DFT相比复杂度更低,变换的性能仅次于K-L变换,而且也有快速算法可以加快变换速度,性价比很高,因此,在进行图像和视频处理时,得到了广泛的应用。

二维离散余弦变换的变换公式为

反变换的表达式为

其中

AVS2中的变换编码

在AVS2中定义了变换单元TU(Transform unit)。TU的大小并不是固定的8×8,还有4×4、16×16、32×32、64×64和非方形的变换块。TU的划分和预测单元PU的划分方式有关。如果待编码块选择的是帧内预测,那么TU的划分方式和预测单元相同。如果待编码块选择的是帧间预测,对于2N×2N的亮度CU块,根据PU是否为方形划分,TU可以采用2N×2N、N×N、2N×0.5N、0.5N×2N的划分方式。对于色度分量,TU的大小和CU一样。

图1 TU的划分方式

对于两个维度均小于64的TU来说,变换过程比较简单,AVS2给定了变换核,直接就能计算出残差块的变换系数。计算公式如下:

其中,X为M×N的原始残差块,Y为变换块,、为变换核。当M=N时,T2为T1的转置矩阵。当M和N不相等时,T1为M×M的变换核,T2为N×N变换核的转置矩阵。

当TU的大小为64×64、64×16、16×64时,采用了一种逻辑变换。先采用二维的整像素小波变换,然后针对LL子带,使用正常的DCT变换。这就相当于采样了变换块的低频部分,因此在平缓区域可以取得很好的效果。

此外,针对帧内预测亮度块,AVS2还采用了一种二次变换技术来进一步减少变换系数之间的相关性。针对DCT变换后的低频部分再进行一次变换,使最后的系数更集中在左上方,从而提高压缩效率。二次变换是基于K-L变换的思想提出来的,因为帧内预测是将相邻的像素值作为参考值,通过不同的预测方向得到的预测值,所以帧内预测的残差块的像素值会呈现出越靠近参考像素的位置残差较小的统计特性,因此变换系数矩阵就可以用特定的概率模型来表示。AVS2中最小的变换为4×4,因此二次变换在4×4块上执行,先执行列的二次变换,再执行行的二维变换。

图2 二次变换

AVS2中的量化

在实现时,量化的过程是和变换整合在一起的,利用乘法和右移位来实现。量化补偿由量化参数QP来决定,量化参数越大,量化步长越长,图像细节损失的也就越多。在AVS2中QP的取值范围为0~63。QP为0时,量化得最精细,图像质量也最好;QP为63时,量化得最粗糙。需要注意的是,QP之间的量化步长并不是等距的。量化步长和QP的关系为

熵编码

熵编码用于减少统计冗余,是一种无损的压缩方法。AVS2采用了一种基于上下文的二元算术编码方法(CBAC)。所谓基于上下文的熵编码,也就是利用上下文模型来推算某个特定编码符号序列的统计行为变化,每个编码符号都用一定方法选取特定的上下文即符号概率状态进行编码。CBAC主要包括三个过程,即二值化、上下文模型选择以及二元算术编码。

图3 CBAC主要编码流程

语法元素进行算术编码之前需要先生成二值化的码串,也就是二值化过程。AVS2使用了3种二值化方法,即一元码、截断一元码和指数哥伦布码。比如,变换块系数由非零系数符号Sign、非零系数绝对值Level和连续出现的零系数个数Run三个语法元素共同表示,其中Sign由一个bin直接表示,Level和Run分别采用一元码进行二值化。一元码是一种简单的二值化方法,对于非负整数N,一元码由N个0作为前缀和一个1组成。

上下文模型即为概率模型,表示当前编码符号的概率分布状态。多数语法元素都有自己的上下文模型,语法元素开始编码前会加载对应的上下文模型,并在编码过程中更新上下文。AVS2引入了一种新的上下文模型更新方法,该方法使用了一个4状态的状态机,处在不同状态时概率变化的速度不同。相比传统的单状态概率更新方法,此方法可以更快地接近真实概率状态。有些语法元素二值化码串较为随机,难以有效建立概率模型,这种情况下就使用旁路编码。旁路编码过程中,符号概率恒定,不再更新上下文。

AVS2中CBAC的算术编码过程引入了一种基于对数域的计算方法,有效规避了乘法运算。算术编码使用区间表示数据信号,编码过程即为区间更新过程。编码过程需要维护两个变量,一个为区间开始边界Low,另一个为区间长度R。区间初始状态为[0, 1),即Low为0,R为1。CBAC只有两个编码符号,其中一个为MPS(Most Probable Symbol),概率值大于等于0.5,另一个为LPS(Least Probable Symbol)。若编码MPS,则

若编码LPS,则

其中,RNew和CNew分别为编码完符号之后新的区间开式边界和区间长度,PLPS和PMPS分别为LPS和MPS的概率值。因为表示区间的数值精度有限,当区间小于某个阈值时会进行归一化并输出相应码字。

图4 熵编码区间更新示意图

AVS2中区间和概率均用对数域数值表示,如R = 2-s+t, 对数域值则为LG_R = -s + t,其中。采用对数域数值计算可以转换乘法运算为加减法运算,可见编码MPS时运算得到明显简化,而编码LPS时因为有加减法存在,需要利用下面的两个公式进行对数域数值和原始数值的转换。考虑到MPS概率大于LPS,对数域的数据计算在一定程度上有利于简化熵编码复杂度。

AVS2对变换系数编码采用两层编码机制,即变换单元被进一步划分为若干个系数组CG(Coefficient Group),CG大小与最小变换块的尺寸一致,即为4×4。编码时,按zigzag扫描的顺序依次编码各个CG,CG内的系数依旧采用zigzag的顺序编码。比如对于8×8变换块,各系数按照如下顺序编码:

图5 AVS2中8×8变换块的系数扫描顺序

在CG层面,有一个标记LastCGPos标识当前变换块内最后一个含有非零系数的CG位置,当然此位置也是按zigzag的顺序记录。考虑到在LastCGPos位置之前仍有可能存在系数全为零的CG,因此,LastCGPos位置之前的每个CG都有一个标识标示当前CG内是否含有非零系数。CG内部系数的编码则与AVS1中的变换块编码一致,按照zigzag顺序依次编码各个(run, level)对。

率失真量化

AVS2中还加入了一项编码端的优化技术——率失真量化(Rate-distortion Optimized Quantization, RDOQ),通过在合理的范围内适当修正量化后的系数值来达到更优的率失真性能。RDOQ的基本思想是针对不同的量化系数,会有不同的量化失真和当前量化系数下对应的比特数,所以可以利用RDO在量化失真和比特数之间做一个权衡。具体方法如下:

  1. 给每个系数设置3个量化的候选项0,lfloor,lceil
  2. 分别对每个候选项计算RDcost
  3. 选取RDcost最小的候选项为最佳量化值。

图6 率失真量化

总结

AVS2的变换量化过程运用了非方形变换、二次变换、RDOQ等技术,在实现上综合考虑了压缩效率和复杂度,在保证编码质量的同时尽可能得提高速度。熵编码过程则是对(Run, Level)对进行编码,有效地规避了乘法运算,降低了编码的复杂度。