和H264/AVC标准一样,H265/HEVC标准仅规定了反量化过程的实现方法,而将量化器的选择留给编码器自行决定,这使得编码端可以选择性能更优的量化方法,例如自适应量化adaptive quantization 以及下一节将要介绍的码率失真优化量化RDOQ等,下面给出了H265/HEVC编码器可以采用的传统标量量化方法。
Li = floor(Ci/QStep + f)
其中Ci表示DCT系数,QStep表示量化步长,li为量化后的值,floor为向下取整函数,f控制舍入关系。H265/HEVC标准规定了52个量化步长,对应于52个量化参数Quantization Parameter,QP 二者关系可以由下式给出。
QStep = 2^(QP - 4)/6
从上式可以看出来,QP每增加1,QStep大约增大12.25%,QP每增加6,QStep增大一倍。因此 量化步长可以在一个很大的范围内变化,实际应用时可以根据不同的需求灵活的选择QP,表6.1给出了H265/HEVC中QP和QStep的对应关系。
QP | QStep | QP | QStep | QP | QStep | QP | QStep | QP | QStep |
0 | 0.625 | 11 | 2.25 | 22 | 8 | 33 | 28.5 | 44 | 102 |
1 | 0.7031 | 12 | 2.5 | 23 | 9 | 34 | 32 | 45 | 114 |
2 | 0.7969 | 13 | 2.8125 | 24 | 10 | 35 | 36 | 46 | 128 |
3 | 0.8906 | 14 | 3.1875 | 25 | 11.25 | 36 | 40 | 47 | 144 |
4 | 1 | 15 | 3.5625 | 26 | 12.75 | 37 | 45 | 48 | 160 |
5 | 1.125 | 16 | 4 | 27 | 14.25 | 38 | 51 | 49 | 180 |
6 | 1.25 | 17 | 4.5 | 28 | 16 | 39 | 57 | 50 | 204 |
7 | 1.4062 | 18 | 5 | 29 | 18 | 40 | 64 | 51 | 228 |
8 | 1.5938 | 19 | 5.625 | 30 | 20 | 41 | 72 | ||
9 | 1.7812 | 20 | 6.375 | 31 | 22.5 | 42 | 80 | ||
10 | 2 | 21 | 7.125 | 32 | 25.5 | 43 | 90 |
需要注意的是,对于色度信号若使用较大的量化步长会出现颜色漂移现象,为了应对这一问题,H265/HEVC 标准将色差信号的量化参数限制为0-45,具体来说,在亮度信号QP小于30时,色度信号QP与前者相同,而当亮度信号QP为30-51时,二者对应关系由表6.2给出。
亮度信号QP与色度信号QP对应关系
亮度QP | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 |
色度QP | 29 | 30 | 31 | 32 | 33 | 33 | 34 | 34 | 35 | 35 | 36 |
亮度QP | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 |
色度QP | 36 | 37 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
H265/HEVC量化过程要同时完成整数DCT中的比例缩放运算,且为了避免浮点运算,H265/HEVC量化器将式(6-10)中的分子(系数)与分母(量化步长)做了一定程度的放大,然后进行取整,以此保留运算精度,考虑到QP每增加6.QStep增大一部这一性质,可将QP表示为以下形式:
QP = floor(Qp/6) + QP%6;
引入变量qbits和MF:
Qbits = 14 + floor(QP/6)
MF = 2qbits/QStep = {26214:QP%6 = 0, 23302:QP%6 = 1, 20560:QP%6=2, 18396:QP%6=3, 16384:QP%6=4,14564:QP%6=5}
其中%表示取余数,考虑到整数DCT中的缩放因子n可以表示为2的整数次幂的形式。
N = 2^T_shift
则式6-10可以写成 li,j = floor(dij,MF/(2^qbits + T_shft + f)) = (di,j * MF + f) >> (qbits + T_shift);
其中>>表示右移运算,dij表示进行缩放前的DCT系数,f' = f << (qbits + T_Shift) 表示舍入偏移量
综上,H265/HEVC的量化公式为
|Lij| = (|dij|*MF + f')>>(qbits + T_Shift)
sign(Lij) = sign(dij)
一般情况下,对于I图像,f取1/3,对于P图像或者B图像,f取1/6.