帧间预测的基本原理:利用相邻的已经编码的图像为当前编码块寻找最佳匹配块,把这个最佳匹配块作为当前块的预测值,然后将预测值和当前块的原始像素值相减,得到当前块的残差值,后续的变换、量化等操作都是基于残差值进行的。
运动估计:利用预测的运动矢量为当前编码块在参考帧上寻找一个最佳匹配块作为当前块的预测值,并得到残差值的过程
常见的一些有关帧间预测的缩略词:
- ME指的是运动估计
- MC指的是运动补偿
- MV指的是预测块到当前块的位移矢量
- MVD是MV的残差值,因为大多数时候,在对当前块进行运动估计的时候,会根据当前块相邻已编码块的运动矢量来对当前块的运动矢量进行预测,然后将预测值减去实际的运动矢量,就得到了残差值,这样做的目的是减小位移矢量的大小,得到更有效的压缩效果
帧间预测有两种参考方式:
- 前向参考预测,视频序列中P帧图像只能使用前向参考,I帧只能进行帧内预测,前向预测能够选择的参考图像类型有I帧和P帧,B帧不能作为参考帧
- 双向参考:视频序列中,B帧使用前向参考和后向参考两种方式
注意点:帧间预测中的插值操作是针对所选择的参考像素块进行的
关于运动估计中常用的搜索算法,可以看公众号中图像通信基础知识部分的运动估计章节
HEVC中运动估计确定参考帧的搜索起点:利用AMVP(高级的MV预测技术)确定当前块在参考帧中的搜索起点,AMVP选出的候选MV有多个,选择其中率失真代价最小的一个作为预测的MV,并以此MV确定搜索的起始点
帧间预测的量两种模式:
Merg模式:merg模式是一种编码模式,它直接利用时域或空域上相邻PU的预测信息,不存在MVD(运动矢量的残差)。但它需要建立一个merge候选列表,这个候选列表中总共有5种候选的MV
-
空域候选列表的建立:假设当前PU的左下角是A0,左侧是A1,左上角是B2,上方是B1,右上角是B0。空域最多只能提供4个候选列表,候选列表的选择先后顺序是A1>B1>B0>A0>B2,优先处理前面4个,当前面4个当中有1个或者多个不存在时,才对B2进行处理
-
时域候选列表的建立:与空域不同,时域候选列表不能直接使用候选块的运动信息,需要根据当前帧和参考帧之间的位置关系做相应的伸缩调整。时域最多只能提供一个候选MV,这就可能导致,当时域和空域的候选列表都建立了以后,整个候选列表中的个数不满5个,这种情况下用零向量进行填充
-
最后从MV候选列表中通过率失真优化选择出最优的MV,然后对该MV在候选列表中的索引进行编码
注意点:B Slice中的PU存在不同点,这里面的PU存在两个MV,因此MV候选列表需要提供两个预测MV。HEVC中提供的方法是,将按照上述方法建立的MV候选列表中的前4个候选MV进行两两组合,得到用于B Slice中PU的MV组合候选类表
非Merge模式:这种模式使用AMVP(高级的MV预测技术),得到预测MV之后还要进行运动估计等步骤,存在MVD(运动矢量差),这种模式同样需要建立一个候选列表,列表总MV的个数为2
-
空域列表的建立:假设当前PU的左下角是A0,左侧是A1,左上角是B2,上方是B1,右上角是B0。当前PU的左侧和上方需要个产生一个候选的MV,对于左侧和上方而言,只要找到了一个候选的MV就不再对其他候选者进行处理了。处理的顺序是左侧A0>A1,上方B0>B1>B2
-
时域列表的建立:非Merge模式下的时域列表建立和Merge模式相似。同样,如果当前候选列表的候选MV的数量不足两个,则用零向量进行填充。
-
最后从MV的候选列表中通过率失真优化的方式,选择最优的预测MV
总结:Merge模式是建立一个MV候选列表,然后希望从候选列表中选出一个MV可以直接代替当前预测块的MV,这样在编码是就可以时直接编码MV在候选列表中的索引就可以,同时直接使用MV确定匹配块,得到块的残差值,没有用到运动估计。但如果候选列表中的MV进过计算之后发现都不满足要求,则进入非Merge模式,即AMVP模式。AMVP模式也需要建立一个候选列表,但它的候选列表元素元素个数为2,并且它不直接编码列表的索引,而是编码运动矢量差MVD(当前搜索到的最佳MV和列表中选择用来确定搜索起点的MV的差值),需要用到AMVP确定的预测MV值确定运动估计的搜索起点。
加权预测详解:
背景:MV的作用是去模拟一个块的运动方向,但有的时候物体发生了变化并不一定代表它发生了运动,也有可能是因为物体的颜色发生变化了。当所有像素的做了一个整体的变化的时候,可以用加权预测来获得更好的预测效果。
当前块的预测像素值来自多个参考帧,而不是一个参考帧,通过某个权值分配公式对预测像素进行加权计算,然后在这些加权像素块上进行运动估计
HEVC使用两种加权预测方法:默认的加权预测和explicit加权预测
默认的加权预测:
- 如果只使用list0,预测的像素值计算方法如下
P r e d = ( s a m p l e + 32 ) > > 6 Pred=\left( sample+32 \right) >>6 Pred=(sample+32)>