当前课程知识点:多媒体技术基础 > 第四章 视频数据的压缩编码 > 4.3 H.264/AVC > 4.3 H.264/AVC
大家好
我们这一节学习H.264avS编码标准
我们先对H.264
做一个简单的概述
H.264也被称为是MpeG-4的第10部分
简称AVC
那么这个编码标准是由国际电信联盟
就是ITU和国际标准化组织
ISO联合成立的专家组
叫JVT与2003年制定完成的
那么H.264AVC
在保持相同图像质量的条件下
它的压缩性能比MpeG-2提高了50%
比H.263plus和MpeG-4的编码性能提高了30%
但是这些性能的提高
是以计算复杂度的增加为代价的
相比之下
计算复杂度增加了2~4倍
那么H.264
这个编码标准
它能够覆盖非常广泛的应用
从极低比特率的
到高比特率的各类应用
那么它都能够覆盖
比方说
Ip的流媒体应用
标清电视
标准清晰度电视和高清广播电视
以及视频点播
DVD
蓝光光盘
以及实时会话类的业务
那么这样广泛
这样广泛的应用
H.264都能够实施
H.264编码标准
跟其他以前的标准类似
通过对类和级的划分
能够适应各种不同的
配置性能要求
那么在这儿类指的是
编码算法和工具的集合
也就是一个算法集
级对应的就是各种不同的参数
比方说分辨率的限制
码率的限制等
通过类和级的
这样一个设定
那么能够针对于不同类型的应用
满足相应的需求
H.264AVC一共分了4大类
基本类也叫Baseline
主类就是Main
扩展类还有高类
那么这4种类里面
基本类是一种最小的实现
它包含了逐行扫描
I帧编码P帧编码
和cavlc商编码方法
这一类基本的类型
主要针对的是视频会议
可视电话等
这类会话类型的应用
它延时比较小
主类
在基本类的基础上
增加了隔行扫描
B帧编码
以及可以采用CABAC
这种熵编码的算法
主要针对的是广播和存储类
质量要求比较高的
这类视频的编码
扩展类
在基本类的基础上
增加了SPSI的帧类型
那么这两种帧类型
是相对于I帧P帧B帧
有不同的技术含量的
那么同时它允许帧数据进行分割
扩展类主要针对网络视频等
流媒体的这类应用
高类
在前面基本类的基础上
增加了自适应变化块尺寸的
这样子的一个技术
能够自定义量化矩阵
它主要针对的是无损视频编码
和更多YOV格式的
高清视频
也就是说现在的
有一些高质量要求的
高清晰度视频
可以基于H264的高类来进行实现
H.264AVC
一共划分了15个Levels
那么这些级
针对于分辨率
容量
比特率
缓存器的大小
参考帧数的多少
以及解码器处理速度等这方面参数
还有图像的尺寸
那么进行了相应的划分
给出了15个等级
那么图像的尺寸
能够从QCIF到数字影院的
这样子一个分辨率的要求
通过这些级的划分
能够匹配国际上通行的设备
和发送格式的要求
那么对于H.264所支持的范畴
可以通过这样一个表
做一个概括的总结
他范畴分了这4大类
每一类对应的取样结构
以及每个样值的量化比特数
在第二列里头
给出了相应的说明
扫描的方式
有逐行和隔行
不同的扫描方式
以及每一类所具有的特点
和主要的应用
在这张表上都很清楚
那么4大类所采用的这些编码
算法之间的关联关系
我们通过这样子的一个图
能够看得很清楚
在基本类的基础上
那么主类扩展类高类
那么他们所采用的技术的
包含关系
那么在这张图里头
就能够看明白
对于H.264的码流语法结构
我们看一下
264的
而且264的码流
是按照系统层进行分层的
整个分成两层
那么第一层
叫VCL层
就是视频编码层
那么这一层主要是完成
对视频内容的高效编码
第二层叫网络提取层
那么这一层主要负责
以网络所要求的
恰当的方式
为数据进行打包纯叔
也就是说H.264的系统划分
使得在VCL层
只完成
或者是只
面向视频内容的
高效压缩编码
不考虑以什么样的网络进行传输
而在网络提取成
完成
面向网络传输的数据打包
那么通过这样子的划分
使得编码和网络传输呢
有清晰的职责
那么可以各自做好各自的事情
我们可以通过下面这个图
做进一步的了解
在视频编码层
完成了视频的压缩编码之后
那么再送到下面的
网络提取层
来针对不同的传输网络
进行数据的打包
最终完成相应网络上的传输
H.264编码标准与其他标准
采用了很多相同的技术
那么这些技术包括
它仍然采用的是
待运动补偿的预测
和DC变换的这种混合编码方式
那么相同的技术
我们在这可以做一个简单的了解
首先是宏块划分
也采用了16×16的
宏块划分方式
那么传统的亮度和色度
取样格式
也是420
对于运动块
进行了一个矢量的估计
就是要进行块儿的运动矢量估计
对于运动矢量越过图像边界
有相应的算法进行处理
块的大小是可以变的
也就是说在运动补偿的过程中
允许块大小进行变化
采用的是块变换
也就是积块的变换编码
量化仍然采用的是标量量化
帧的类型同样有I帧P帧B帧
和I帧P帧B帧这样子的模式
商编码采用的仍然是变字长的编码的算法
那么他们的编码的流程图
我们看一下
是典型的混合型的这种视频压缩编码的框图
那么跟我们之前所介绍的
基本的视频压缩编码的框图是一致的
里面采用了
变换和量化的方法
来去除空间的冗余
通过帧间预测
来去除时间的冗余
通过商编码的方法来去除统计冗余
也就是说
在三个层面上来
对于视频序列中
存在的冗余信息进行去除
最终达到高效的压缩效果
H.264中采用的新的算法
我们在这可以总结一下
那么采用了多模式
多帧的运动补偿的这种方式
运动矢量的精度
从 H263标准的1/2精度
提升到了1/4的运动矢量的精度
在对B帧进行预测的时候
采用了这种叫B帧预测加权的方式
针对预测的模式
种类增加了很多
能够对于I帧来说
它的空域预测能够到13种
采用了区块效应的环路滤波
而且在正交变换的环节
采用4×4的整数正交变换编码
熵编码的技术
又有了进一步的提升
采用的是条件的熵编码
CAVLC和CABAC两种编码技术
增加了一种新的帧类型
叫sp帧类型
而且在网络层
网络分层的时候
增加了网络适配层就是NAL层
这些都是 H264
相对于其他标准
增加了一些新的算法
我们后面的内容会做相应的介绍
那么这些新的技术
在我们的混合编码的流图中
分布在不同的位置
我们这张图
给出了一个简单的图示
那么在编码环节
采用了4×4的整数
正交变换编码
也可以把它称为是
整数DCT变换
在熵编码环节
采用增强的熵编码
也就是说
采用了条件熵的熵编码方法
在预测的部分
采用多参考帧的预测
而且这个区块效应加在环路中
增加了
帧内预测对于图像
像素块增加了图像预测
而且在运动估计的时候
运动估计所记忆的块的大小
是可以变化的
下面这一节我们介绍
H.264中运动补偿的相关技术
运动补偿的目的
是为了根据图像的内容复杂程度
选择不同的图像块大小
来精确的获得每一个块儿的运动矢量
最终使预测误差更小
那么为了达到这样一个目的
H.264的运动补偿中
块儿的划分是多种多样的
那么多形状多大小的这种子块的划分
带来了预测误差降低的好处
但是更多的小的图像块的划分
可能又会花费更多的比特数
来进行编码
那么实现不同块大小和形状的运动补偿
同时对运算量
也有比较大的提升
所以说运动补偿中
要进行一个均衡
在运动估计中
运动矢量的精度
采用1/4像素的精度
那么相对于以往的运动估计的
相对于以往的视频编码标准来说
那么他的运动矢量的精度提升了
运动矢量精度的提升
1/4精度相对1/2精度
能够获得1.5~2个dB的增益
节省的编码比特率达到20%
也就是说
好处还是很明显
在运动补偿的时候
可以采用7种
变换大小的块儿
把之前标准中的
16×16的宏块
再进一步的划分
那么划分之后
对于每一个子块
进行一个运动矢量的估计
通过这样子的技术
能够提高预测的精度
那么就可以减小预测误差
具体的做法就是水平方向上
就是这7种变换大小的块
可以是完整的16×16的块
还可以在16×16的基础上
进行两个子块的划分
也就是说
16×16的块
垂直划分成
8×16两个块
或者是水平划分成16×8两个块
那么也可以划分成4个8×8的小块
那么每一个4×8的
这样子的图像块
也可以进一步的划分成
8×4、4×8
以及4个4×4的块
那么通过这样子的一个子块的划分
同时在运动补偿中
采用了多参考帧的这种预测模式
可以在预测中
采用多个帧
来完成对当前帧的预测
那么通过这样子的一种多参考帧的预测
能够节省5~10%的比特率
对于在视频序列中出现遮挡
这样子的问题的块儿来说
那么通过多参考帧的预测
能够很好的提升
预测的精度
在B帧的预测中
采用预测加权的方式
也就是说通过前后帧
按照不同的加权系数
来完成对B帧的预测
那么我们来看一下
1/4精度运动补偿
那么我们要得到高精度的运动矢量
就要在整像素的图像块的基础上
进行一个分数像素精度的内插
那么要首先
从整像素内差到1/2像素精度
然后从1/2像素精度
再内插完成1/4像素精度的
这样子的图像块
那么从整像素到1/2像素的内插
一般采用6抽头的滤波器
来得到
那么具体的这是一个F2滤波器
那么6个抽头的F2滤波器
相应的系数
我们这个地方列出来了
那么我们来看右边的这样一张图
灰色的小块对应的就是
原始图像
对应的整像素已知像素的位置
这些灰色块儿上的像素值
是已知的
那么两个灰色块之间的
比方说是这个B这个H还有M这些像素
是属于1/2像素
那么在G和B之间的这个A
对应的就是1/4像素精度
那么A H M S这几个像素的值
通过这种6抽头的滤波器
内插来得到
那么比方说我们的B这一点的值
可以由他所在的这一行
E F G H I J这几个整像素点的像素值
通过内插滤波器来求出
在这儿是进行一个四舍五入
得到最终的半像素点的值
那么这种四舍五入的运算
可以通过这样子的一位运算来完成
所以说内插
还是相对比较容易完成的
那么对于从1/2精度
到1/4精度像素的内插
可以采用线性内插的方式
比方说是A像素
我们可以通过G和B这两个像素
求一个均值
来得到1/4位置上的A的值
那么1/4像素精度的图像
就是通过这种方式来得到的
那么我们来看一下
高精度的运动矢量
相对于整数精度的运动矢量
它对于编码性能的提升
我们通过这样一个对比来看一下
在图中水平方向对应的是比特率
纵轴对应的是PSNL就是我们的
峰值新造比的性能
那么图中的三条线
分别对应的是
对于相同的一个视频序列
采用整像素精度
半像素精度
和1/4像素精度
进行运动矢量估计的时候
那么所得到的性能曲线
我们会看到
1/4像素精度的性能
要比整像素运动估计的性能要提升很多
可变块运动补偿
那么在H.264中
对于运动补偿
所基于的图像块的大小
允许有7种不同类型的大小块划分
我们这个图示中
给出了这7种不同的类型的块
那么基于这7种不同大小的块的划分
就能够针对于
这个图像帧中内容的复杂程度
进行更合理的匹配
那么我们得到的运动矢量的精度就会更高
这样子预测误差就会更小
那么我们在这儿
同样给出了这样子的一个实验的
结果对比图
对于采用不同数量的
运动补偿的图像块
我们看到
最上面一条曲线
对应的是7个块
也就是说H264中所采用的
这种运动补偿的快的方法
相比于只采用一种块的这种方法
那么性能有相应的提升
中间这一条对应的是
采用两种块模式的性能结果
B帧加权的运动补偿
完成B帧预测的时候
允许在多个参考帧中
实现一个加权
也就是说通过多个参考帧
对当前要编码的这个帧
按照不同的贡献率
给予不同的权重值
最终实现对当前B帧的预测
那么这样子能够对B帧的预测更准确
那么对于有B帧参与预测的
这样子的一个编码
编码的序列
和原始的序列
以及传输的序列
它的顺序是有区别的
那么原始的视频序列
顺序和存放的视频序列
顺序是一致的
比方说是
按照01234的顺序来
往后随着时间的推移来排序
那么传输的比特流顺序
是按照编码的顺序来进行的
那么在编码的过程中
首先要进行I帧的编码
然后是P帧的编码
在这两个帧编完之后
才是这两帧之间的B帧的编码
所以说编码的顺序
是跟原始的视频
帧的顺序是不一样的
那么解码的顺序
自然也是不一样的
所以说在有B帧参与的视频编码中
视频的解码是有延迟的
下面这一节我们介绍
H.264编码中的帧内预测部分
在H.264中
允许采用
帧内预测的方法
对于图像块进行一个帧内预测
这一点是跟其他的
早期的编码标准不同的
早期的编码标准
一般是直接对于图像块
进行一个DCT变换
然后后期跟着量化和熵编码
以及相应的预测编码
那么在H.264中
允许对于图像块
进行一个帧内的预测
预测误差再进行后续的DCT变换
那么帧内预测的模式
对于亮度来说
有两类内插方
有两类
帧内预测方式
一类是针对于4×4和8×8的块
一共给出了9种的预测模式
主要针对的是
文理比较丰富的区域
来进行帧内预测
对于16×16的块
只给出了4种的帧内预测模式
主要针对的是平滑的区域
也就是说对于平滑的区域
可以直接采用16×16的
这样子大的这样子的一个块
来选择4种预测模式中的一种来完成预测
而对于一些纹理细节比较多的这些区域
可以采用更小的块
4×4、8×8
这样子块来完成帧内预测
对于细节比较丰富的
这些区域的预测模式
9种模式
我们这个图示中给出了
具体的模式表示
那么在这个模式中
每一个4×4的块儿
根据它纹理特征不同
可以选择不同的预测方向
那么这个预测方向
我们在这给出来标识
这样9种预测方式
我们看一个例子
假设我们现在要对于这个蓝框框出来的
小写的abcd到p
这些字母所描述的这些像素
进行一个预测的话
那么如果小的图像块的纹理
是一个斜对角
这样子的一个纹理方向的话
那么我们就可以按照比方说是
4的这样子的一个右下角的
对角线的纹理方向
按照这个模式来进行预测
那么具体的预测
我们看一下
就是可以基于
IQA这三个已知的像素值
来对我们这个方向上
比方说是A F K P这几个像素进行预测
那么基于这样子的一个
预测表达式
我们可以通过这样子的一个移位
就完成了对这些像素的
一个帧内预测
那么对于4种16×16
这样子的一个宏块级的
帧内预测模式一共有4种
这个模式01234
那么这4种模式
我们这个地方图示
给出了他预测的方向
垂直方向上
是以当前的16×16块
上面相邻的那一块的
对应像素
来完成对当前16×16块的预测
也可以是从0的这个宏块来完成预测
也可以是按照这种平均的DC的
这样子的预测方式来进行预测
也就是说用H和V的像素值求平均来完成
当前的16×16块的预测
也可以是按照这种面的预测方式
也就是我们的mode3的
这种方式进行预测
那么这是264中
对于图像块大小不同
它的帧内预测模式是可选的
那么对于4度块来说
只给出了4种
8乘8的帧内预测模式
那么具体这4种
帧内预测模式
跟刚才我们所看到的
16×16块的
帧内预测模式是类似的
也就是说它也是分成
模式0
模式一
模式二
模式三
那么具体的模式
预测的方法也是一样的
帧内预测
它的性能
我们也给出一个比较
在这儿给出了两条性能曲线
下面这条绿色的是
H.263plus标准
所给实现的性能
上面是264所实现的性能
我们看到
性能上还是有很大的差距
那么这个差距
主要用来体现我们所介绍的
采用多模式的帧内预测
那么对性能的贡献
这一节我们来讨论
H264编码标准中
整数正交变换和量化相关的技术
我们知道在前面我们所介绍的
正交变换编码
基本上视频压缩编码里头
采用的都是DCT变换
DCT变换
是属于一个浮点型运算的变换
编解码端如果采用不同的字长的话
那么就会引起失配的问题
最终造成我们
还原图像质量的损失
所以说
在264编码标准中
对这样一个问题
给出了一些解决的办法
在H264中采用的
变换编码是
正交的4×4的
整数正交变换编码
采用这个变换编码的目的
是为了解决DCT变换的浮点运算
所造成的编解码端
产生失配的这样一个问题
同时也考虑了
在具体视频压缩编码中
图像里面可能有小的物体
我们在前面已经说了
我们H.264编码标准中
采用了更小的图像块的划分
使用了更好的运动补偿
这就意味着
空间的相关性得到了
更进一步的去除
那么在前面环节处理之后
到了正交变换的环节
就不需要再采用8×8
这么大的
正交变换的块
所以说正交变换的块的大小
可以进一步减小
那么H264中
就选择采用4×4的这样子的块大小
那么4×4的块大小
同时可以有效的减弱
重建图像的块效应
采用整数的正交变换
能够很好的降低计算的复杂度
H.264中使用了简单的整数
4×4的正交变换
那么这种正交变换
是对于4×4的DCT变换的
一种很好的近似
一会我们在后面会具体介绍
在整数的4×4正交变换编码中
变换矩阵里只包含着
±1和±2的这样一个运算
所以通过加减的运算
加上一位就可以完成
这样子正交变换
在运算量上
很好的简化
实验的结果显示
虽然在质量上有相应的损失
但是这个损失是可以忽略的
基本上在0.02db
H.264编码器
正交变换和量化的过程
我们从这个图来做一个了解
那么从前端相应的处理环节
完成之后
进入到正交变换这个环节的
是预测误差信号
那么对预测误差信号
进行相应的4×4的变换编码
我们对于亮度和色度
采用了不同大小的
不同方法的
正交变换的编码
那么在具体对于
相应的正交变换编码得到的系数
还有相应的变换的处理
对亮度先进行4×4块大小的正交变换
那么对于所产生的DC系数
在采用4×4的Hadamard变换
进行进一步的
Dc系数的相关性的去除
那么然后才是后续的量化环节
对于色度信号也是一样
采用4×4的整数
正交变换之后
对于每一个变换块的DC系数
也要做进一步的DC系数的
相关去除
那么最后通过量化
得到相应的量化结果送到后续的
熵编码器中来进行
熵编码
那么我们为了很好的理解
正交的整数变换
我们先来对二维的DCT变换
做一个简单的回顾
那么对于二维DCT变换来说
它的变换基
是由cos 函数构成的
在这我们用A来描述
二维DCT变换的正交变换基
那么对于二维DCT变换
它的正反变换
我们可以用矩阵来描述
对于X这样子的输入信号
我们通过这样一个矩阵运算
可以得到对应的变换系数矩阵Y
在表达式中
A是我们离散余弦变换的变换矩阵
反变换中
AT对应的是A的转置矩阵
那么在这样子的二维DCT变换的基础上
我们来讨论
整数正交变换是怎么得到的
那么刚才我们所给出来的
二维DCT变换
它的变换矩阵
我们可以写出来
它是由实数构成的
这样子的一个矩阵
那么对于矩阵
我们看
如果当 N是=4的时候
也就是说4×4的
DCT变换的变换矩阵
我们这儿
具体把它写出来
那么当N=2的时候
同样我们给出来
它的变换矩阵A
在这些变换矩阵中
我们看一下
它包含着cos的这样一个运算
还有1/2根号的运算
所以说都是浮点运算
那么我们对刚才二维DCT变换的变换矩阵
做一个简单的矩阵的分解处理
那也就是说
DCT的正变换
我们可以以4×4作为粒子
来进行一个分解的这样一个处理
把刚才的 A矩阵
进行一个系数分解
那么我们就可以提出这样子的
一个由±1和±2
这些整数所构成的这样一个矩阵
那么那些对应的
也就是说
我们把大A进行分解以后
对应的那一部分包含
一些浮点运算的系数
我们把它归到
我们现在的陈述矩阵里头
用Ef包
把它归到Ef里面
那么 A的转置矩阵
也是同样
这样子我们就形成了这样一个
矩阵运算关系
那么在这儿这个符号
代表的是一个
对应位置上
系数相乘的这样一个运算
也就是说
前面这个括弧里头得到的
矩阵的每一个位置上的值
要跟Ef这个矩阵
对应位置上的值
做一个乘法运算
那么这样子的一种表示
我们把它简化成现在这种形式
所以说
这个H就是这个我们的矩阵
HT就是我们的矩阵
那么这个Ef我们把它用这个矩阵来描述
那么在这个矩阵里面的
这个A和B的取值
我们看一下
这个地方给出它具体的取值
那也就是说
我们把二维的
4×4的DCT变换
通过这样一个矩阵的
这样一个运算
把它表示成了
这样一种形式
那么我们把这一部分
拿出来
它对应的就是我们所说的
4×4的整数正交变化
那么相当于对于输入的一个
4×4的图像块
让它参与这样子的
一个整数的正交变换
得到的变换系数
再去跟Ef这个乘数
矩阵做一个乘法运算
那么这个乘法运算
可以把它归为
我们的后续环节来
跟量化一起完成
那么也就是说
这个地方
我们可以不再
进行正交变换的时候
完成这个乘法这个乘法运算
可以归到我们的量化环节来进行
那么这样我们就有了
4×4的正交整数变换
得到的变换系数矩阵
我们用Y撇来表示
那么对应的反变换
我们这个地方
给出相应的反变换
那么我们通过这样子的一个
从DCT变换到整数变换的
这样子的一个分析推导
我们得到的正交整数变换
它在性能上
跟DCT变换是非常近似的
那么它在运算上
我们看到
变换矩阵只包含±1
±2
也就是说我们通过加减的运算
加上一位的操作
就可以完成
这样子的一个正交变换运算
在运算量上是比较节省的
虽然它会造成一定的
增益的损失
但是损失很小
所以说
是可以忽略不计的
那么264编码中
就是通过这样子的一个正交变换
来代替传统的DCT变换
那么对于亮度系数
也就是说
我们对于每一个4×4的图像块
做了相应的正交变换之后
得到的系数矩阵中
Dc系数
之间有相应的相邻快的DC系数
之间有相应的相关性
那么为了去除这些相关性
同样可以采用
相应的处理方式
那么在264编码中
对于亮度的DC系数
就采用Hadamard变换
来进行进一步的相关性的去除
那么我们16×16的图像块
划分成4×4的块
进行一个整数的正交变换
那么这样子就能够
得到4×4
16个整数的正交变换的系数矩阵
每一个系数矩阵的DC系数
我们拿出来
就可以构成一个
4×4的Dc系数的这样一个矩阵
那么我们对这样子的一个
Dc系数构成的矩阵
采用4×4的Hadamard变换
进行一个变换编码
那么这个是
对应的Hadamard变换的正变换
相应的反变化
那么通过这种方式
对于亮度快的DC系数
进行相关性的去除
那么对于色度块
同样采用这种方式
那么每一个16×16的宏块中
包含两个
8×8的色度快
这样每一个8×8的色度块
就可以有4个4×4的 DC系数矩阵
每一个DC系数矩阵中的DC系数
拿出来就可以构成
相应的2×2的DC系数
这样一个矩阵
那么对于两个色度块中
形成的两个2×2的DC系数矩阵
那么我们用2×2的Hadamard变换
来进行一个变换编码
去除它们的冗余
变换编码之后
得到的变换系数
采用标量量化进行处理
那么基本的标量量化
我们可以用这个表达式来描述
这个里面Q代表的是量化的步长
那么在264编码标准中
定义了52个量化步长
通过52个量化参数
来对应描述
那么这个量化参数
用QP来表示
我们看下面这张表
从0 QP从0到51
对应着52个量化步长
那么量化参数每增加6
对应的量化步长会增加一倍
这样我们在对于视频进行编码的时候
通过调整量化参数
就可以实现
比特流和图像质量之间的一个协调
那么我们在进行码率控制的时候
通常也是直接通过量化参数的调整
来实现对码率的控制
那么为了避免除法运算和浮点运算
刚才我们前面分析了
把DCT变换进行近似
转换用整数增加变换来代替
那么在转换中
有一个乘数矩阵EF那么刚才我们说
E F在具体处理的时候
是把它包含进了我们的量化环节
所以说
在我们的H264的量化环节中
它的量化关系式
是现在我们所看到的
这样一个表达形式
这里面 P F对应的就是
EF矩阵中
对应位置上的放大系数
那么 W I J对应的就是我们
经过前面的
正交整数变换之后
得到的变换系数
那么我们通过相应的量化参数
对它进行一个量化
在量化的同时
我们要把刚才
我们在分解矩阵的时候
出来的乘法矩阵
对应位置上的值
要包含到量化环节中
也就是通过 P F来体现
PF值具体取多少
是跟它所在的位置相关
也就是说
它在不同的矩阵的位置上
它的取值是不一样的
那么这是264中采用的量化技术
那么264中采用了区块效应滤波
滤波器采用的目的
是为了对于块的边界
进行一个平滑
来削弱
基于块的这种编码方法
在块边界上造成的这种像素的跳变
那么我们在去除这种块边界上的
像素跳变的同时
我们不希望模糊
图像中的正常边缘
所以说在264编码中
那么我们的环路滤波技术
要比前期的那些编码标准中
采用的这些区块效应
滤波技术
要有一定的提升
那么264编码中
根据边界两侧的编码信息
比方说你的编码模式
参考帧
还有运动矢量的情况
它规定了5种边界的强度
对于每一个边界
自适应的
来去选择5种边界强度中的
一种来完成
对于边界的一个滤波
比方说两个块
如果是具有相同的运动矢量的话
那么就有说明
这两个块
可能属于同一个运动物体
那么这个时候
我们对这两个块的边界的滤波
就要加以相应的处理
通过针对于不同的情况
选择不同的滤波强度
那么能够对于编码的时候
所引起的这种块效应
那么它的影响能够削弱
同时也能够保留
图像中
原有的边界信息
那么具体在处理的时候
对于亮度块和色度快
它的处理方式
块的大小也是有区别的
那么这个图里面给出了图示
那么在同样的信噪比下
通过采用这种区块效应滤波
能够减小大约是7%到9%的比特率
那么我们这个地方
看到的这两张图
就是采用了区块效应滤波器
和没有采用的一个直观的图的
一个对比
我们看到左边的图
没有采用这种区块效应滤波
所以说图中可以看到很多
这个块的边界
那么右边这张图
块儿的这种边界效益
明显的就减弱了
好下面我们来学习
H264编码中的
熵编码技术
熵编码在混合编码器中
属于编码环节的最后一个环节
那么前期产生的量化系数
以及我们运动估计得到的运动矢量
还有一些控制数据
都要送到熵编码的环节
来完成熵编码
最终形成二进制比特流
那么在H264中熵编码
采用了两种编码方式
那么这两种编码方式
主要是对于量化之后的
残差信号
进行熵编码处理
而对于头部信息运动矢量
和其他的一些跟残差
没有关系的一些控制信息
采用的是指数哥伦布的编码的方式
那么两种熵编码
第一种是基于上下文的自适应变长编码
简称CAVLC编码
那么这一类编码的
编码算法
主要是根据以编码的零块的信息
来为当前的块儿
选择合适的码表
第二种
编码算法是基于上下文的自适应
二进制算术编码
简称CABAC
那么这两种熵编码的方法
都属于条件熵编码
由于这两种编码方法
都是基于上下文信息来实现的
所以说在性能上比之前的
典型的熵编码的方法
性能要提升很多
我们知道对于熵编码的实现
如果信源的统计概率特性
了解得很准确的话
我们的熵编码的效率是
可能提升的
所以说
264中采用的
这两种熵编码的方法
通过基于上下文的相关信息来决策
当前编码块的
这些编码策略
那么能够使
我们的编码效率
得到很好的提升
我们来看一下
CAVLC 熵编码编码技术
在变换编码之后
经过量化
那么量化之后的
4×4的量化系数
或者是2×2的量化系数
首先要经过一个Z字形扫描
把它从二维矩阵
转换为一维的数据序列
然后再送到CAVLC的熵编码环节
那么对于量化之后的4×4的块
我们前面的分析已经了解到
变换系数中
已经包含很多的0
那么通过二维到一维的转换
那么我们就可以采用
游程和幅度的这种编码方式
来有效的对这些编码
变换系数进行表示
那么经过量化之后的系数
除了包含很多零之外
那么它的非零系数
也大多是±1
那么所以说在CAVLC编码中
通过对于±1通过采用zig-zag扫描
把±1这些非0系数
把它集中起来
那么这样子
方便后续的
进一步的处理
量化之后的4×4的块儿
里面包含了0多
±1系数多
而且没有块儿的结束的标志
那么非0系数的数目
我们在后续的编码中
需要进一步的进行处理
而且非0系数
它的幅度值
在接近DC系数的位置
它的幅度值会更大
在高频的这些位置上
它的系数的值会比较小
那么CAVLC编码
就利用了这些特点
根据当前已经编码的
编码块系数来作为依据选择
我们要变换编码的码表
CAVLC熵编码
它的编码步骤
可以总结为下面5步
其实对应的是
我们要编码的5个对象
首先是对非零系数的个数
和尾1的个数进行一个统计
也就是说我们对于非零系数
以及它的幅度值
为±1的这些leveles
进行个数的统计
编码的时候
我们是基于
已经编码的
非零系数的个数
从4个设定的码表中
来选择合适的码表
也就是说在这个环节中
其实体现了
基于上下文的这样一个概念
那么我们统计完当前的变换系数
它非零系数的个数
以及尾1的个数之后
那么我们会根据已经编码的
跟它相邻的
变换系数举证的非零系数的个数
来选择对于当前的
变换系数的编码的码表
对于尾1的正负号
要进行一个编码处理
也就是说
对于尾1的正号
我们要给它
相应的零编码
负号给予1编码
对于其余非零系数的幅度值
我们要进行一个相应的处理
编码就是每个非0系数的幅度值
要编码成一个由前缀和后缀组成的这样一个码字
那么后缀码字的长度
会根据上下文的经验
来进行确定
那么所以在这一步中
也体现了
基于上下文的这样子的一个概念
对于最后一个非0系数
前面0的数量
要进行一个编码
要进行统计
要对最后一个非零系数
前面总的零数要进行一个编码
对于每一个非0系数
前面的0的个数
要进行一个统计
进行一个编码
通过游程来描述
那么这个就是CAVLC编码
它需要处理的5个对象
对应的就是我们编码的5个步骤
那么对于CABAC熵编码来说
它对多个符号
使用了自适应的概率模型
那么这种自适应
主要是基于上下文的关联关系
利用上下文符号之间的相关性
来选择合适的概率模型
为当前的符号
系数序列
进行一个熵编码
而且熵编码中采用的是
二进制的算术编码
我们在前面介绍
哈弗编码和算术编码的时候
都已经知道
算术编码
由于实现的是一种分数级的码
所以说它在性能上
比整数码编码的效率
要有提升的
所以CABAC的性能
从采用二进制算术编码的角度来看
它的性能也比CAVLC要高
所有的语法符号
都转换为二进制的比特流
采用的是最简单的
最快速的自适应的这种机制
那么基于只用查表和移位的方式
来快速的实现二进制的算术编解码
那么这个是CABAC的这个特点
在CABAC编码中
设定了399种预定义的上下文的模式
而且对这些模式
进行了不同的分组
比方说是
第十四到第二十这些模型
主要用来进行
帧间宏块类型的编码
也就是说
在399种预定义的
上下文模式中
进行了分组
不同的组
适合于不同类型的编码
那么基于已经编码的
相邻域的信息
来选择
当前要编码的
上下文的模型
也就是说
根据已经编码的领域信息
来从399种
预定义的上下文模型中
进行一个选择
而且每个上下文模型
要不断的更新
来适应实际的分布
那也就是说
根据所要编码的图像
它的实际的统计特性
来不断的更新
上下文的模型
那么基于这样一个技术
CABAC平均节省的比特率
能够到10~15%
CABAC熵编码
能够获得好的性能
是源于它采用了
基于上下文的这种模型的选择
而且基于本地统计的结果
进行一个自适应的估计
通过算术编码的改进
减小计算的复杂度
所以我们通过这个图
这样一个流程图
对CABAC熵编码做一个简单的总结
那么我们的编码的
所依据的模型
是基于上下文来选择的
那么基于过去获得的条件
来选择一个合适的模型
对于所有的非二进制符号
先要进行一个二进制序列的
这样一个映射
然后根据所提供的模型
进行一个编码
同时要对模型进行一个更新
也就是说
在编码的结束
在编码结束时
要及时的对于上下的模型
进行一个更新
这样子更好地适应
所针对的图像内容
那么这个地方这张图
我们对比了
我们对比了不同的编码标准
它们在性能上的一个差别
从263到
从H.263到H.264
那么我们看到264在性能上
要比前期的这些标准
有很大的提升
直观上来看
这个地方给出了不同编码标准
对于相同的序列
进行不同码率的压缩
我们解码所呈现的
直观的
这样子的一个对比效果
我们看到右边这一列的质量
要比左边这一列的质量
要有明显的提升
那么在这儿是
差不多质量的同一个视频
那么我们用MpeG-2进行压缩
这个地方对应的是
203kbp每秒的
这样子的一个数据量
跟我们用204来压缩
对应的是39K的
这样子的一个数据量来说我们看一下
数据量降低了很多
但是质量没有降低
那么H.264
这个标准
我们前面介绍了
它相应的这些技术 这些技术的采用
使得它的性能相比
其他的视频编码标准有了提升
但是在实际的应用中
仍然出现了一些问题
那么我们来把这些问题
做一个简单的了解
首先宏块个数的爆发式增长
导致了编码宏块的预测模式
运动矢量参考帧的索引
以及量化级等等这些
相应的参数
占用了过多的编码的码字
相比之下
用于残差部分的码字明显的减少
也就是说模式增多了
宏块数量增多了
那么用来表示模式编码模式
运动矢量
以及相应的
相应的辅助参数的这些
编码码字数量增多
真正用于编码残差的部分减少
同时由于我们现在的
图像的分辨率的增加
那么单个的宏块
所表示的
图像内容的信息
也在减小
这样就导致了
相邻的4×4的块
或者8×8的块
经过变换以后
它的低频系数的相似度增加
那么相似度增加
说明它的冗余就增加了
那么这都是我们264
在应用中所遇到的问题
那么由于分辨率增加
那么我们运动矢量的幅度值
也会跟着增加
所以在264中
采用一个运动矢量预测值
对于运动矢量
对于运动矢量差编码
使用的是
哥伦布的指数编码
那么哥伦布的指数
编码的特点是
数值越小
使用的比特数越少
但是对于大幅的
这个图像分辨率很高的这样一个图像
那么它的运动矢量辅助会很大
所以说
性能上用哥伦布指数码
就有所损失
在H264中
采用的一些关键的算法
像CABCA这样子的
基于上下文的熵编码
还有环路滤波
这些技术
都要求采用的是串行的编码
并行处理度就比较低
而现有应用比较广的
像GPU DSP FPGA ASIC这些
并行化程度非常高的这些平台
那么在这个平台上
进行264编码的实现
就制约了这些平台
并行性能的发挥
所以说
这一系列的H264编码标准
在实际应用中
所遇到的这些问题
那么催生了我们新的编码标准
所采用的相应的技术来解决
我们264这部分
就介绍这么多
-1.1 概述
--1.1 概述
-第一章 作业
--第一章 作业
-2.1 光和彩色
--2.1 光和彩色
-2.2 视觉特性
--2.2 视觉特性
-2.3 扫描
--2.3 扫描
-2.4 模拟彩色电视信号
-2.5 数字电视信号
-第二章 作业
--第二章 作业
-3.1 信息熵理论
-3.2 率失真理论
-3.3 预测编码
--3.3 预测编码
-3.4 序列图像中运动矢量的估计
-3.5 具有运动补偿的帧间预测
-3.6 正交变换编码
-3.7 子带编码
--3.7 子带编码
-3.8 量化编码
--3.8 量化编码
-3.9 熵编码
--3.9 熵编码
-第三章 作业
--第三章 作业
-4.1 基于帧的视频编码
-4.2 视频压缩编码国际标准
-4.3 H.264/AVC
-4.4 H.265/HEVC
-4.5 基于率失真优化的编码模式选择
-4.6 恒定速率编码器的速率控制
-4.7 压缩编码算法性能的评价
-第四章 作业
--第四章 作业
-5.1 概述
--5.1 概述
-5.2 人的听觉特性
-5.3 音频信号编码方法
-第五章 作业
--第五章 作业
-6.1 多媒体传输对网络的要求
-6.2 网络对多媒体信息传输的支持
-第六章 作业
--第六章 作业
-7.1 多媒体数据及其时域特征的表示
-7.2 分布式多媒体系统中的同步
-7.3 连续媒体同步的基本方法
-7.4 广播应用的传输层协议
-7.5 宽带应用的传输层协议
-第七章 作业
--第七章 作业