量化:是将信号的连续取值(大量离散取值)映射为有限多个离散赋值的过程。实现信号取值多对一的映射。可以有效减少信号取值的空间,进而获得更好的压缩效果。
根据输出和输入数据的类型,可以将量化器分为标量量化SQ和矢量量化VQ两种类型。
VVC除了使用标量量化,还采纳了低复杂度的矢量量化(依赖量化DQ)
标量量化
简单的,将输入信号划分为M个互不相交的区间,区间端点,称为量化的判定边界。对于每一个区间,分辨选取一个点作为输出值,称为重建值。当输入样点位于区间范围内,量化结果为那个重建值。还可以将输入信号经过量化之后被映射为一些用于表示重建值的索引号,索引号比重建值具有更加统一和简单的形式。在视频编码中,常使用索引号。
均匀标量量化
将输入值域分为等距的区间,每个区间对应的输出值为该区间的中点。区间的长度称为量化步长。量化步长取决于输入信号的变化范围及重建值的个数。
因为中间值为每个区间的重点,所以量化误差位于区间[-deta/2,deta/2)
量化误差的衡量准则
- 均方误差:反映失真的大小
- 信噪比:失真与信号的相对大小
- 峰值信噪比:失真与信号峰值的相对大小
因此使用均匀标量量化可以获得的失真与量化步长的平方成正比。对于非均匀分布,使用均匀量化可能无法获得较好的性能。
Lloyd-Max量化器
最优标量量化,考虑服从任意分布的输出信号,设其概率密度函数为
最优标量量化器表示某一区间的重建值应为该区间的“质心”。因为直接求解式子比较困难,因此采用迭代的方式进行求解,称为Lloyd-Max算法。(初始化、计算ti、计算xi的重建、计算Dj,损失小于一定程度停止优化)
熵编码量化器
Lloyd-Max是在给定重建数目M的约束条件下,量化失真最小。如果采用定长编码,每传输一个量化输出值需要的比特位数为,向上取整。
如果考虑变长编码,每个量化输出值所需的比特数不一样,平均比特数接近量化输出值的熵,这样Lloyd-Max就不是最优的了。此时最优量化器应该在对熵的约束下使失真最小。
设定目标比特率R
可以看到重建值依旧为“质心”,但是划分编解有区别,熵编码量化器在临近量化的基础上引入了一个偏差。相邻两个区间的划分点会向着取值概率较小的重建值方向偏移。取值概率较大的量化重建值对应的量化区间越大,概率大的重建值编码时所需要的比特数越小。
在视频编码中常认为DCT系数服从拉普拉斯分布,主要特点是在0值附近系数概率较大。因此图像和视频编码中的量化器会加宽以0为中心的区间,称为“量化死区”。
还有率失真优化量化,在下面介绍。
矢量量化
矢量量化是多对一的量化,即两个或两个以上的幅度对应一个量化结果。
假设有N个K维矢量,把K维空间划分为互补子空间(胞腔CELL),在每个子空间中找到一个代表矢量(码字、码矢),全部组成为一个矢量集(码书、码本)。矢量集中的矢量个数J为码字长度。
矢量量化的过程可以看成从欧式空间
到其中一个有限矢量集Y的映射
将多干个标量数据(k个)构成一个矢量,然后矢量空间进行发整体量化,用码书中与输入矢量最匹配的码字索引替换输入矢量进行传输与存储。
网格编码量化(Trellis Coded Quantization,TCQ)
因为矢量量化复杂度高,因此采用矢量量化和标量量化相结合的方式。复杂度低且具有量化的性能。来源于网络编码调制,借鉴了网络编码调整中信号集合扩展,信号集合划分和网络状态转移的思想。
将R位量化对应的阶量化器拓展为
阶,码书大小增加2倍,使用更精细的码书提高信噪比。同时为了减少码字,将拓展后的码书划分为4个子集,按照顺序分布,每个子集包含
个码字,每个子集堪称一个独立的量化器。
为每个输入选择一个量化器进行量化,量化器的选择根据量化器状态转移,采用网格进行约束。当编码长度为N时,量化器状态采用N级网格级联,每级都要在4个量化器中找到到与输入数据最匹配的码字,按照从左到右的顺序级联所有网格,使用维特比算法,找到一条最小误差的最佳路径,得到所有的状态转移过程。
VVC量化
VVC支持普通标量量化和依赖量化DQ。
VVC的标量量化
VVC中规定的时反量化过程。 量化后的值*量化步长。在实际应用中,使用量化参数(QP)来表示所选的量化步长。VVC在HEVC52个量化参数的基础上,拓展了量化参数的数量,并且可以根据比特深度进行自适应的调整。取值范围为-6*(bitdepth-8)到63。量化步长和量化参数有确定关系。当比特深度一定的时候,QP每增加6,步长增大1倍。
VVC中全部使用整数运算,并融合了反变换中的比例伸缩运算,引入量化矩阵,调整当前块内不同位置的量化步长。由于依赖量化器的特殊性,每个量化器重建值的距离为一般量化器的2倍。如果采用变换跳过模式,就不需要反变换,也不需要额外的缩放,同时不再采用量化矩阵。
VVC的编码器采用传统的标量量化方法,
表示DCT系数,f控制舍入关系。为了避免浮点运算,保留运算精度,也引入了qbits和MF变量。对于特殊的块会修改MF以步长变换过程中的隐式缩放。量化过程如下:
率失真优化量化
因为实际编码中,待量化变换系数的分布特性不同,标量量化无法有效应对,引入了率失真量化器(RDOQ)。对于一个变换系数,给定多个可选的量化注意,利用RDO准则选择一个最优的量化值。
实现步骤
- 确定当前TU每个系数的可选量化值,对当前TU所有系数进行预量化,利用得到的量化值大小确定可选量化值。
- 利用RDO准则确定当前TU所有系数的最优量化值,按照扫面顺序遍历当前TU所有系数,对于每个系数遍历可选的量化值。
- 利用RDO准则确定当前TU每个系数组CG是都量化为全0组。
- 利用RDO准则确定当前TU最后一个非0系数的位置,遍历非0系数,分别计算其作为最后一个非0系数时的TU总率失真代价,选择最小的那个。
熵编码中的符号隐藏SDH技术也需要量化参数的配合,利用率失真优化,确定最优量化参数。
依赖量化DQ
当前变换系数的量化值依赖前一个变换系数的量化值。利用了变换系数间的相关性,使得变换系数经量化后在N维向量空间更紧密,减少了输入向量和重建向量之间的误差,减小的量化带来的失真。
VVC依赖量化器关键技术:定义两种不同标量量化器Q1和Q2,定义标量量化器之间的转换准则。
Q0对应偶数倍的步长,Q1对应奇数倍量化步长。当变换块进行反量化的时候,初始状态设置为0,变换系数按照编码顺序重建,重建完成后更新状态。VVC的标量量化器由一个4状态状态机表示。步骤如下
- 确定当前系数的可选量化索引,为每个量化系数确定4个后选址,针对每个量化器都有2个最小化原始值和重建值差的绝对值的候选。
- 当扫描缩影从k-1转换到k时,为阶段k-1的网络节点和阶段k的网络节点之间的所有连接计算一个率失真代价。保留最小率失真代价的连接。
- 得到率失真代价最小的路径,确定出路径上的量化索引,得到最终的量化值。
量化参数
在传输速率受限时,灵活地控制量化参数使编码效率尽可能接近给定码率非常重要。VVC沿用了HEVC中的量化组QG概念。时一个矩形全区域,为一个划分子树包含的CU,同一个QG内所有的CU共享一个QP。由CU划分深度cbSubdiv的最大值Max_cbSubdic决定。
VVC中的QP依旧采用预测编码技术,只对QP与预测QP的插值进行编码,避免直接编码QP耗费的比特数。
QP的解析过程
- 预测值的获取:由相邻已编码QG的QP信息得到。
- 预测误差的解析:已QG为单元进行编码,每个QG包含一组deltaQP语法元素。
- QP的计算:sliceQP由PPS层初始QP及Slice层或图像头中的QP偏移值都确定;QG的QP由预测QP和预测误差决定;亮度分量和色度分量的QP由色度亮度便宜关系、PPS层、Slice层QP偏移值的公式共同决定。
量化矩阵
使用量化矩阵,原理是对不同位置的系数使用不同的量化步长。
VVC中,量化矩阵作用于比例缩放过程,大小与TU相同,在比例缩放过程中DCT系数与对应位置的量化矩阵系数相除,然后再输出到量化模块。(变换-比例缩放-量化)。允许标准推荐使用的量化矩阵(2x2\4x4\8x8这3种,大于8由8x8上采样得到)和用户自定义的量化矩阵(根据帧间帧内模式、分量性质、变换块尺寸、定义了27种种量化矩阵)。
允许量化矩阵中的元素差分编码器啊,大于8x8的情况,只编码64个元素,其余上采样得到。