HEVC系列 浅尝辄止,不对具体公式推导进行深入的理解。 目标是 知道相关的一些概念,了解这么做的原因,而不是莫名其妙的就一堆公式,一堆算法。HEVC中的一系列算法都是许许多多实验室,研究机构的工作集合。别人都是经过数年的研究,实验得到这么一个结论。所以首先要知道模块相关的基本概念,了解采用某些算法和方法的原因,对算法了解个结论就好了。
量化(Quantization)是指将信号的连续取值(或大量可能的离散取值)映射为有限多个离散幅值的过程,实现信号取值多对一的映射。在
视频编码中,残差信号经过离散余弦变换(DCT)后,变换系数往往具有较大的动态范围。因此对变换系数进行量化可以有效地减小信号取值空间,进而获得更好的压缩效果。
就是将落在一个区间的值 用同一个值表示
如图:x是输入的信号,落在t7-t8区间的值就用x7表示。实际在编码的时候不一定用的就是x7,有可能是x7对应的一个索引号y7.
简单的量化例子均匀量化:
给定一组信号,信号的最大值和最小值分别为a,b。设定最后输出M个量化值。那么均匀量化的量化步长为Qstep = (b-a)/M 。第一个区间[a, a+Qstep]的量化器输出为 a+Qstep/2。就是取这个区间的中点为落在整个区间的值的输出。
量化误差的衡量主要有四种方式:
均方误差(Mean Square Error, MSE)
信噪比(Signal-to-Noise Ratio, SNR)
和峰值信噪比(Peak-Signal-to-Noise Ratio,PSNR)
率失真
传统的标量量化器是以失真最小为目的进行设计的。而在视频编码中,编码比特率同样是一种影响编码性能的因素,因此视频编码中的量化器设计需要权衡失真与比特率。同时考虑失真和比特率的公式如下
其中,D,量化时的失真,R为量化时所需的编码比特数。
量化
HEVC的量化公式如下
其中,c 表示DCT系数,Qstep 表示量化步长,I为量化后的值,floor(.)为向下取整函数,f控制舍入关系。其中Qstep 跟QP是一一对应的关系,HEVC 中规定了52个量化步长 和 52 个量化参数对应,两种之间的关系如下:
H.265/HEVC量化过程要同时完成整数DCT中的比例缩放运算。所以最后经过调整的量化公式为:
反量化
反量化的公式
其中L表示量化后的值,Qstep 为量化步长,C表示反量化后得到的重构DCT系数。 同样的H.265/HEVC量化过程要同时完成整数DCT中的比例缩放运算。所以最后经过调整的量化公式为:
为了避免直接编码QP所耗费的比特数,量化的参数QP也采用了预测编码的形式,只需要对实际QP与预测QP的差值进行编码,以避免直接编码QP所耗费的比特数。H.265/HEVC使用相邻已编码QG的信息来预测当前QG的QP。
QG
其中QG是指将一幅图像分成的固定大小(NxN)的正方形像素块。其大小N由图像参数集(PPS)指定,且必须处于最大CU与最小CU之间(包含最大与最小CU)。在一幅图像中,QG为固定大小,而CU是根据视频内容自适应划分出来的,因此可能出现-一个QG包含一个或多个CU的情形,也可能存在一个CU包含多个QG的情形。QG划分的这个块中用的是同一个QP值。
QP预测
例子: 利用空间上相邻位置的QG的QP值来预测当前位置QG的QP值。
如图: 其中A和B分别为当前QG左侧和上方的已编码QG,则当前QG的预测QP可计算为:
predQP =(QP +QPg +1)>> 1
虽然编码的时候时按照QG这样的大小去划分进行QP的预测编码的。 但是在解码过程中,需要求得一个cu的QP大小。因为解码的基本单元时CU大小。 QP的解码过程需要QP的预测值( predQP)和预测误差( deltaQP)。CU QP的预测值和预测误差 是根据QG的进行获取到的。
最后QP值的计算 根据颜色分量的不同分为
亮度分量的QP计算
直接就是预测值和预测误差进行相加可得如下:
QPy = predQP + deltaQP
色度分量Cb和Cr的QP
分别计算如下:
QPcb =QPy + pps_qp_offset_cb + slice_qp offset_cr
QPcr =QPy + pps_qp_ offset_cr +slice_qp_ offset_cb
其中,pps_ qp_ offset 和slice_ qp_ offset 分别表示两个色度分量在PPS层和
Slice层QP的偏移值。
其中Slice层QP的计算需要用到PPS中给定的初始QP( QPpps)以及Slice
层QP的偏移值(dQPslice), 计算如下:
sliceQP=QPpps + dQPslice
许多以往的图像、视频编码标准都使用了量化矩阵(QuantizationMatrix,QM)技术,如JPEG、MPEG- -1、MPEG- 2、 MPEG- -4、H.264/AVC18-221等,其原理是对不同位置的系数使用不同的量化步长。例如,可以利用人眼对图像视频中的高频细节不敏感的特征,对高频系数使用较大的量化步长,而对低频系数使用较小的量化步长,这样做能够在保证一定压缩率的同时提高图像或视频的主观质量。其中,量化矩阵作用于比例缩放过程,其大小与TU相同,可为4x4、8x8、16x16 和32x32。在比例缩放过程中,变换后的DCT (或DST)系数将与量化矩阵中对应位置的系数相除,所得的结果作为量化模块的输入。
H.265/HEVC标准允许使用两种形式的量化矩阵。一种是标准推荐使用的量化矩阵(下文称之为“默认量化矩阵”),另一种是用户自行定义的量化矩阵(下文称之为“自定义量化矩阵”)。对于默认量化矩阵,其矩阵元素值与TU大小、预测方式(帧内、帧间)都有关系。
与量化矩阵相关的语法元素在SPS和PPS中都有可能存在,当PPS中存在时,解码器使用PPS中的信息,否则使用SPS中的信息。
scaling_ list_ enable_ flag: 该语法元素表明是否使用量化矩阵。
sps_ scaling_list_ data_ present_ flag: 该语法元素指出当前SPS中是否存在量化矩阵信息。
pps_ scaling_ list_ data_ present_ flag: 该语法元素指出当前PPS中是否存在量化矩阵信息。
scaling_ list_ pred_ mode_ flag: 该语法元素表明当前量化矩阵的获取方式。若该值为0,表明当前量化矩阵与之前存在的量化矩阵相同,可直接通过预测得到;若该值为1,表明当前量化矩阵中的每个元素都需要重新计算得出。
变换模块生成的DCT(或DST)系数将与量化矩阵中对应位置的系数相除,所得的结果作为量化模块的输入。量化模块进行量化,量化后生成的数据 输入到下一个熵编码的模块中。
而量化过程中最重要的参数QP 是通过综合考虑编码比特数和编码的误差来 从候选的QP中选取到。其中候选的QP是协议固定好的。QP的同样需要通过预测编码 然后差分编码进行传输。QP预测的基本单元是固定的QG大小,当前的QG中的QP 通过周边的QG的QP获取到。而解码端CU解析QP 是通过QG的相互关系 来从QG中获取到。