1.概述

量化是使数据比特率下降的有效工具。量化过程的输入值动态范围很大,需要较多的比特才能表示一个数值,量化后的输出则只需要较小比特表示。
量化是不可逆过程,处理过程中有信息丢失,存在量化误差。

H.264采用标量量化技术,它将每个图像样点编码映射成较小的数值。一般标量量化器的原理为:
FQ=round(y/QP)FQ=round(y/QP)FQ=round(y/QP)
其中,y 为输入样本点编码,QP 为量化步长,FQ 为 y 的量化值,round()为取整函数(其输出为与输入实数最近的整数)

在量化和反量化过程中,量化步长 QP 决定量化器的编码压缩率及图像精度。如果 QP 比较大,则量化值 FQ 动态范围较小,其相应的编码长度较小,数据压缩率高但会损失较多的图像细节信息;如果QP 比较小,则 FQ 动态范围较大,相应的编码长度也较大,但图像细节信息损失较少。编码器根据图像值实际动态范围自动改变 QP 值,在编码码率和图像精度之间折衷,达到整体最佳效果。

2.H264的量化表设计

H.264 中,量化步长 Qstep 共有 52 个值。如下表所示。其中 QP 是量化参数,是量化步长的序号。

  • 当 QP 取最小值 0 时代表最精细的量化,当 QP 取最大值 51 时,代表最粗糙的量化。
  • QP 每增加 6,Qstep 增加一倍,也就是QStep(QP+6) = 2*QStep(QP);这种周期性步长的好处是可以显著减少量化表和反量化表的长度。
  • 为了避免在较高量化步长时的出现颜色量化人工效应, H.264 规定,亮度 QP 的最大值是 51,而色度 QP 的最大值是 39。
  • DCT变换中的按位置相乘运算矩阵 EfEfEf可以合并到量化表中,而IDCT变换中的运算矩阵 EiEiEi 可以合并到反量化表中。
    其中Ef矩阵
    Ef=(a2ab/2a2ab/2ab/2b2/4ab/2b2/4a2ab/2a2ab/2ab/2b2/4ab/2b2/4)Ef = \begin{pmatrix} a^2 & ab/2 & a^2 & ab/2 \\ ab/2 & b^2/4&ab/2 & b^2/4 \\ a^2 & ab/2 & a^2 & ab/2 \\ ab/2 & b^2/4&ab/2 & b^2/4 \end{pmatrix}Ef=⎝⎜⎜⎛​a2ab/2a2ab/2​ab/2b2/4ab/2b2/4​a2ab/2a2ab/2​ab/2b2/4ab/2b2/4​⎠⎟⎟⎞​
    其中,a=1/2a=1/2a=1/2,
    b=1/2cos⁡(π8)b=\sqrt{1/2}\cos{\left(\frac{\pi}{8}\right)}b=1/2​cos(8π​),
    c=1/2cos⁡(3π8)c=\sqrt{1/2}\cos{\left(\frac{3\pi}{8}\right)}c=1/2​cos(83π​) ,

2.1量化过程

在 H.264 中,量化过程是对 DCT 结果进行操作:
Zij=round(Wij∗Ef(i,j)/QStep)Zij = round(Wij * Ef(i,j)/ QStep)Zij=round(Wij∗Ef(i,j)/QStep)
其中,WijWijWij是DCT变换系数,ZijZijZij是输出的量化系数,Qstep 是量化步长。

利用量化步长随量化参数每增加 6 而增加一倍的性质,可以进一步简化计算,设
qbits=15+floor(QP/6)qbits = 15 + floor(QP/6)qbits=15+floor(QP/6)
令MF(i,j)=Ef(i,j)/QStep∗2qbitsMF(i,j) = Ef(i,j)/QStep*2^{qbits}MF(i,j)=Ef(i,j)/QStep∗2qbits
则Zij=round(Wij∗MF(i,j)2qbits)Zij = round(Wij* \frac{MF(i,j)}{2^{qbits}})Zij=round(Wij∗2qbitsMF(i,j)​)

根据上式,可以计算QP=0时,MF(0,0)=0.25/0.625∗215=13107.2MF(0,0)=0.25/0.625*2^{15}=13107.2MF(0,0)=0.25/0.625∗215=13107.2,用整数13107表示。
这样,MF 可以取整数,如下表所示的量化表。表中只列出对应 QP 值为 0 到 5 的 MF 值,对于QP 值大于 5 的情况,只是 qbits 值随 QP 值每增加 6 而增加 1,而对应的 MF 值不变。比如QP=6和QP=0的MF值相等。

因此,对于QP范围为0-51只需要维护6个量化表,这也就是上文中描述的“周期性步长的好处是可以显著减少量化表和反量化表的长度”。

量化过程则为整数运算,并且可以避免使用除法,并且确保用 16 位算法来处理数据,在没有 PSNR 性能恶化的情况下实现最小的运算复杂度。

具体量化过程的运算为:
⏐Zij⏐=(⏐Wij⏐⋅MF+f)>>qbits⏐Zij⏐ = (⏐Wij⏐⋅MF + f)>>qbits⏐Zij⏐=(⏐Wij⏐⋅MF+f)>>qbits
sign(Zij)=sign(Wij)(6.30)sign(Zij) = sign (Wij) (6.30)sign(Zij)=sign(Wij)(6.30)
其中,“>>”为右移运算,右移一次完成整数除以 2;sign()为符号函数;f 为偏移量,它的作用是改善恢复图像的视觉效果,例如,对帧内预测图像块 f 取 2qbits/3,对帧间预测图像块 f 取 2qbits/6。

2.2反量化表

同理,我们可以得到H264的反量化公式

3.非一致性量化

上一节我们得到了各分量量化步长一致情况下的量化公式。为了更好的支持高清视频,H264引入了非一致性量化,也就是不同位置的变换系数使用不同的量化参数。通过量化参数调整,使编码图像更加适合人类视觉系统(去除人类视觉冗余信息)。

使用量化权重矩阵W来描述不同位置的步长区别。权重越大,量化步长越短,则量化结果越精细。编码时某个位置的量化步长为:宏块QP对应的量化步长QStep除以该位置的量化权重。

为了方便表示,这里的权重系数都放大了16倍,默认量化权重矩阵参数都为16。权重系数矩阵可以从SPS中解析得到。

按照标准文档8.5.9节,以4x4块为例,weightScale4x4表示量化权重系数矩阵,normAjust4x4表示上一节中的反量化表

JM代码中normalAdjust4x4 由下面的三维数组表示,低两个维度表示4x4矩阵坐标,第三维表示QP%6.

//! Dequantization coefficients
const int dequant_coef[6][4][4] = {{{10, 13, 10, 13},{ 13, 16, 13, 16},{10, 13, 10, 13},{ 13, 16, 13, 16}},{{11, 14, 11, 14},{ 14, 18, 14, 18},{11, 14, 11, 14},{ 14, 18, 14, 18}},{{13, 16, 13, 16},{ 16, 20, 16, 20},{13, 16, 13, 16},{ 16, 20, 16, 20}},{{14, 18, 14, 18},{ 18, 23, 18, 23},{14, 18, 14, 18},{ 18, 23, 18, 23}},{{16, 20, 16, 20},{ 20, 25, 20, 25},{16, 20, 16, 20},{ 20, 25, 20, 25}},{{18, 23, 18, 23},{ 23, 29, 23, 29},{18, 23, 18, 23},{ 23, 29, 23, 29}}
};

weightScale4x4有SPS、PPS中的scaling_list 语法表示,最终LevelScale4x4的计算过程如下:

InvLevelScale4x4Luma_Intra[k][i][j]=dequant_coef[k][j][i]*qmatrix[0][temp];

4.反量化计算过程

解码时的反量化过程包括以下几个步骤:

  1. 计算宏块QP
  2. 计算量化矩阵LevelScale
  3. 反量化

4.1QP计算

相邻宏块QP具有相关性,一般不会相差太大,因为相邻宏块QP相差太大容易产生块效应。因此,当前宏块QP计算会以前一个宏块QP_prev做参考,也就是QP_cur = QP_prev + mb_qp_delta.

宏块QP计算依赖以下几个变量:

  1. PPS中的pic_init_qp_minus26,表示一组图像中QP的初始值;
  2. slice header中slice_qp_delta,表示该slice相对于pic_init_qp_minus26的差值;
  3. 每个宏块头中有一个mb_qp_delta,表示该宏块相对于前一宏块的差值。

如果当前宏块为slice第一个宏块,前一个宏块不存在,它对应的QP_prev = pic_init_qp_minus26+26+pic_init_qp_minus26.

每个宏块亮度分量和色度分量计算方式有些差异,以最常用的8bit像素为例,公式如下

亮度分量QPy

QPy = (QPy_prev+mb_qp_delta+52)%52

色度分量QPc

色度分量计算还依赖pps中的两个变量 chroma_qp_index_offset/second_chroma_qp_index_offset,分别表示Cb、Cr分量相对于当前宏块亮度分量QP的差值。
计算步骤如下:

  1. 计算qpi = clip(0,51,QPy+qp_offset)
  2. 根据qpi查表得到最终的QPc。由表可知,色度分量QP最大值为39

4.2计算量化矩阵

对于YUV420格式,量化矩阵一共有8组,包括intra_8x8_Y、inter_8x8_Y、intra_4x4_Y、intra_4x4_cb、intra_4x4_cr、inter_4x4_Y、inter_4x4_cb、inter_4x4_cr。其中,每一组有对应QP%6为0-5的6个量化矩阵

量化矩阵计算依赖于SPS中的scaling_list量化权重参数语法.
最终可以得到48个量化矩阵。

4.3 反量化过程

反量化可分为4中情况说明:

4.3.1 Intra16x16宏块亮度分量的反量化过程

Intra16x16亮度块是按照4x4块划分编码
1.DC系数解析过程

  1. 反扫描,从码流中解析得到的16个DC系数是按照4x4块扫描顺序存放,如下图,因此需要先做反扫描。反扫描后矩阵 CCC
  2. 对DC系数矩阵CCC反hadamard变换
  3. 根据前面得到的量化参数QP和量化矩阵LevelScale,得到DC系数

    上面计算公式可以这么理解:
    fij∗LevelScale∗2Qp/6/26f_{ij}*LevelScale*2^{Qp/6}/2^6fij​∗LevelScale∗2Qp/6/26
    如果Qp/6>=6Qp/6 >=6Qp/6>=6,计算过程为乘以2的n次方;否则计算过程需要除以2的n次方,此时需要做四舍五入,所以要加上25−QP/62^{5-QP/6}25−QP/6再除以26−QP/62^{6-QP/6}26−QP/6.

2.AC系数解析过程
从码流中解析每个4x4块中的15个AC系数。AC系数反扫描,反量化

通过上面两步,可得到每个4x4块反量化后的DC、AC系数,可以对4x4系数块进行后面的IDCT变换。

4.3.2 色度分量的反量化过程

1.DC系数解析

  1. 从码流中解析每个色度分量4个DC系数,4个DC系数按行扫描顺序存放,可得到2x2的DC系数矩阵CCC
  2. 对DC系数矩阵CCC反hadamard变换

    3.根据前面得到的量化参数QP和量化矩阵LevelScale,得到CbCr分量的DC系数

    2.AC系数解析过程
    从码流中解析每个4x4块中的15个AC系数。AC系数反扫描,反量化
    通过上面两步,可得到每个4x4块反量化后的DC、AC系数,可以对4x4系数块进行后面的IDCT变换。

4.3.3 4x4亮度块(transform_size_8x8_flag=0)

1.残差系数解析,从码流中解析得到4x4块的DC系数和15个AC系数,
2.按4x4块顺序反扫描,并按照下面公式反量化

通过上面两步,可得到每个4x4块反量化后的DC、AC系数,可以对4x4系数块进行后面的IDCT变换。

4.3.4 8x8亮度块(transform_size_8x8_flag=1)

1.残差系数解析,从码流中解析得到8x8块的DC系数和63个AC系数
2.按8x8块顺序反扫描,并按照下面公式反量化

通过上面两步,可得到每个8x8块反量化后的DC、AC系数,可以对8x8系数块进行后面的IDCT变换。

参考文献:
《新一代视频编解码压缩标准H.264》
《深入理解视频编解码技术–基于h264标准及参考模型》
ITU-T H.264标准 (2010-03)

一文搞懂H264量化原理以及计算过程相关推荐

  1. 一文搞懂BN的原理及其实现过程(Batch Normalization)

    1. 在讲BN之前我要向大家提出几个问题,就是为什么要引入BN呢?在神经网络训练的时候输入图片不是引入了image normalization吗?所以BN到底是什么呢? Batch Normaliza ...

  2. 一文搞懂线程池原理——Executor框架详解

    文章目录 1 使用线程池的好处 2 Executor 框架 2.1 Executor 框架结构 2.2 Executor 框架使用示意图 2.3 Executor 框架成员 2.3.1 Executo ...

  3. 一文搞懂RSA算法原理及简单实现

    前言 RSA算法是最重要的算法之一,它是一种非对称加密,是目前最有影响力的加密方式之一.这篇文章我们通过实现一种简单的RSA加密来探究它的原理. 计算公钥和私钥 RSA中的公钥和私钥需要结合在一起工作 ...

  4. 一文搞懂CDN加速原理

    目录 一.什么是 CDN 二.CDN工作原理 传统访问过程 CDN访问过程 CDN网络的组成要素 三.名词解释 CNAME记录(CNAME record) CNAME域名 DNS 回源host 协议回 ...

  5. cdn搭建原理_一文搞懂CDN加速原理

    二.CDN工作原理 传统访问过程 传统访问过程 由上图可见,用户访问未使用CDN缓存网站的过程为: CDN访问过程 CDN访问过程 通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为: ...

  6. 一文搞懂 Web Worker(原理到实践)

    作者:poetry 原文地址:https://mp.weixin.qq.com/s/XF7qOhbBtYlwADCiyxbT-w Web Worker 作为浏览器多线程技术,在页面内容不断丰富,功能日 ...

  7. 一文搞懂模型量化算法

    1,模型量化概述 1.1,模型量化优点 1.2,模型量化的方案 1.2.1,PTQ 理解 1.3,量化的分类 1.3.1,线性量化概述 2,量化算术 2.1,定点和浮点 2.2,量化浮点 2.2,量化 ...

  8. 一文搞懂内存映射原理及使用方法

    a. 内存映射原理 内存映射即在进程的虚拟地址空间中创建一个映射,分为两种: 文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件. 匿名映射:没有文件支持 ...

  9. hmr webpack 不编译_一文搞懂 webpack HMR 原理

    关注「前端向后」微信公众号,你将收获一系列「用心原创」的高质量技术文章,主题包括但不限于前端.Node.js以及服务端技术 一.HMR Hot Module Replacement(HMR)特性最早由 ...

最新文章

  1. 算法_贪心 刷题总结
  2. 2017 人工智能+内容生产研究报告
  3. Java中实现的各种排序算法
  4. 坦克世界 与服务器连接中断,坦克世界怎么老是显示与服务器连接已中断
  5. ubuntu 下安装mplayer
  6. 斥资2.5亿美元,英特尔也开始玩车了
  7. 开源BI工具对比(一):BI介绍
  8. OpenPose学习笔记
  9. android stagefright
  10. mos管h桥电机驱动电路与设计原理图-KIA
  11. 如何面试软件工程师 看这篇就够了
  12. 打通Linux内存管理任督二脉
  13. 计算机网络 信道复用技术
  14. Puppet学习之hiera(8)
  15. 含类定义的完整python程序_含是什么意思 带含字的男孩名字 用含字起名的寓意...
  16. oracle取日期6,Oracle通过日期获取星座函数
  17. java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))
  18. u盘里的文件不见了怎么恢复正常?数据还有救吗?
  19. 计算机德育教育课题,德育教育研究课题有哪些研究方向
  20. 农历2017年8月初4_2017年8月4日黄道吉日查询,2017年8月4日黄历查询,2017年8月4日吉日查询...

热门文章

  1. 易语言编写登录小程序
  2. uos操作系统安装mysql
  3. 基于语法分析的公式分析器设计
  4. 周末了,看,首富出门遛狗。
  5. 查看IP和MAC地址的命令
  6. echarts 报错Failed to execute 'createRadialGradient' on 'CanvasRenderingContext2D': The provided doubl
  7. mysql优化面试整理-吊打面试官
  8. Tkinter 组件详解(十):Scale
  9. 艾永亮:苹果缺乏创新能力?打造超级产品是未来增长的关键
  10. Atiitt 前端技术点清单列表 attilax总结 v2 s11.docx 1. ui与前端系列 类库与api 3 1.1. 概念性技术 4 1.2. 运行环境 4 1.3. Ui技术点 4 1