一文搞懂H264量化原理以及计算过程
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/2ab/2b2/4ab/2b2/4a2ab/2a2ab/2ab/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/2cos(8π),
c=1/2cos(3π8)c=\sqrt{1/2}\cos{\left(\frac{3\pi}{8}\right)}c=1/2cos(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.反量化计算过程
解码时的反量化过程包括以下几个步骤:
- 计算宏块QP
- 计算量化矩阵LevelScale
- 反量化
4.1QP计算
相邻宏块QP具有相关性,一般不会相差太大,因为相邻宏块QP相差太大容易产生块效应。因此,当前宏块QP计算会以前一个宏块QP_prev做参考,也就是QP_cur = QP_prev + mb_qp_delta.
宏块QP计算依赖以下几个变量:
- PPS中的pic_init_qp_minus26,表示一组图像中QP的初始值;
- slice header中slice_qp_delta,表示该slice相对于pic_init_qp_minus26的差值;
- 每个宏块头中有一个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的差值。
计算步骤如下:
- 计算qpi = clip(0,51,QPy+qp_offset)
- 根据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系数解析过程
- 反扫描,从码流中解析得到的16个DC系数是按照4x4块扫描顺序存放,如下图,因此需要先做反扫描。反扫描后矩阵 CCC
- 对DC系数矩阵CCC反hadamard变换
- 根据前面得到的量化参数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系数解析
- 从码流中解析每个色度分量4个DC系数,4个DC系数按行扫描顺序存放,可得到2x2的DC系数矩阵CCC
- 对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量化原理以及计算过程相关推荐
- 一文搞懂BN的原理及其实现过程(Batch Normalization)
1. 在讲BN之前我要向大家提出几个问题,就是为什么要引入BN呢?在神经网络训练的时候输入图片不是引入了image normalization吗?所以BN到底是什么呢? Batch Normaliza ...
- 一文搞懂线程池原理——Executor框架详解
文章目录 1 使用线程池的好处 2 Executor 框架 2.1 Executor 框架结构 2.2 Executor 框架使用示意图 2.3 Executor 框架成员 2.3.1 Executo ...
- 一文搞懂RSA算法原理及简单实现
前言 RSA算法是最重要的算法之一,它是一种非对称加密,是目前最有影响力的加密方式之一.这篇文章我们通过实现一种简单的RSA加密来探究它的原理. 计算公钥和私钥 RSA中的公钥和私钥需要结合在一起工作 ...
- 一文搞懂CDN加速原理
目录 一.什么是 CDN 二.CDN工作原理 传统访问过程 CDN访问过程 CDN网络的组成要素 三.名词解释 CNAME记录(CNAME record) CNAME域名 DNS 回源host 协议回 ...
- cdn搭建原理_一文搞懂CDN加速原理
二.CDN工作原理 传统访问过程 传统访问过程 由上图可见,用户访问未使用CDN缓存网站的过程为: CDN访问过程 CDN访问过程 通过上图,我们可以了解到,使用了CDN缓存后的网站的访问过程变为: ...
- 一文搞懂 Web Worker(原理到实践)
作者:poetry 原文地址:https://mp.weixin.qq.com/s/XF7qOhbBtYlwADCiyxbT-w Web Worker 作为浏览器多线程技术,在页面内容不断丰富,功能日 ...
- 一文搞懂模型量化算法
1,模型量化概述 1.1,模型量化优点 1.2,模型量化的方案 1.2.1,PTQ 理解 1.3,量化的分类 1.3.1,线性量化概述 2,量化算术 2.1,定点和浮点 2.2,量化浮点 2.2,量化 ...
- 一文搞懂内存映射原理及使用方法
a. 内存映射原理 内存映射即在进程的虚拟地址空间中创建一个映射,分为两种: 文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件. 匿名映射:没有文件支持 ...
- hmr webpack 不编译_一文搞懂 webpack HMR 原理
关注「前端向后」微信公众号,你将收获一系列「用心原创」的高质量技术文章,主题包括但不限于前端.Node.js以及服务端技术 一.HMR Hot Module Replacement(HMR)特性最早由 ...
最新文章
- 算法_贪心 刷题总结
- 2017 人工智能+内容生产研究报告
- Java中实现的各种排序算法
- 坦克世界 与服务器连接中断,坦克世界怎么老是显示与服务器连接已中断
- ubuntu 下安装mplayer
- 斥资2.5亿美元,英特尔也开始玩车了
- 开源BI工具对比(一):BI介绍
- OpenPose学习笔记
- android stagefright
- mos管h桥电机驱动电路与设计原理图-KIA
- 如何面试软件工程师 看这篇就够了
- 打通Linux内存管理任督二脉
- 计算机网络 信道复用技术
- Puppet学习之hiera(8)
- 含类定义的完整python程序_含是什么意思 带含字的男孩名字 用含字起名的寓意...
- oracle取日期6,Oracle通过日期获取星座函数
- java继承链中方法调用优先级.顺序:this.show(object)super.show(object)this.show((super)object)super.show((super))
- u盘里的文件不见了怎么恢复正常?数据还有救吗?
- 计算机德育教育课题,德育教育研究课题有哪些研究方向
- 农历2017年8月初4_2017年8月4日黄道吉日查询,2017年8月4日黄历查询,2017年8月4日吉日查询...
热门文章
- 易语言编写登录小程序
- uos操作系统安装mysql
- 基于语法分析的公式分析器设计
- 周末了,看,首富出门遛狗。
- 查看IP和MAC地址的命令
- echarts 报错Failed to execute 'createRadialGradient' on 'CanvasRenderingContext2D': The provided doubl
- mysql优化面试整理-吊打面试官
- Tkinter 组件详解(十):Scale
- 艾永亮:苹果缺乏创新能力?打造超级产品是未来增长的关键
- Atiitt 前端技术点清单列表 attilax总结 v2 s11.docx 1. ui与前端系列 类库与api	3 1.1. 概念性技术	4 1.2. 运行环境	4 1.3. Ui技术点	4 1