H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测

1、仿射运动补偿预测

  HEVC中,运动补偿预测MCP仅采用平移运动模型。而在现实世界中,有很多种运动,比如放大/缩小、旋转、透视等不规则运动。在VTM中,采用了基于块的仿射变换运动补偿预测方法。如图所示,通过两个控制点(4参数)或三个控制点运动向量CPMV(6参数)来描述块的仿射运动场MF。
H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测_第1张图片
  实际上Affine模式使用2组或者3组运动矢量来描述一个块的运动信息,块内每个点的运动矢量可以通过以下公式计算:
4参数:
在这里插入图片描述
6参数:
在这里插入图片描述
  为了简化计算VTM中将编码块划分为4x4子块(色度块也是4x4),分块计算每个子块的运动矢量,如下图所示。

H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测_第2张图片
  跟平移运动帧间预测相同,affine模式也有两种模式:merge模式和AMVP模式。

2、Affine merge模式

  merge模式用于宽高均大于8的块,产生长度为5的候选列表,编码时仅传输CPMV在列表中的索引。merge候选列表的构造顺序为:
  1、继承自CU相邻位置的CPMVs。
  2、利用旁边CU的平移MV构造CPMVs。
  3、0 MVs
注:上述顺序为编码描述文档中给出的顺序,实际上文本中最先进行的sbTmvp构造。。

2.1、 继承

  首先,如果CU左侧和上侧都有affine模式,最多可以得到两个CPMV加入候选列表。左侧搜索顺序是下图中A0->A1,上侧搜索顺序是B0->B1->B2,只有第一个满足条件的块会加入到候选列表。

H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测_第3张图片

2.2、构造

  用CPMVk表示第k个控制点,搜索CU周边的MV,搜索MV顺序为:
  CPMV1:B2->B3->A2
  CPMV2:B1->B0
  CPMV3:A1->A0
  CPMV4:T,使用TMVP(如果可用)
H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测_第4张图片
  6参数CPMV按以下顺序构造:
  {CPMV1, CPMV2, CPMV3}, {CPMV1, CPMV2, CPMV4}, {CPMV1, CPMV3, CPMV4},{CPMV2, CPMV3, CPMV4}
  4参数CPMV按以下顺序构造:
  { CPMV1, CPMV2}, { CPMV1, CPMV3}

2.3、0 MVs

  当使用继承和构造两种方法后,候选列表仍然未满,使用0来填充生于位置。

3、Affine AMVP模式

  Affine AMVP可以在长宽都大于16的块使用。这种模式下,预测值 CPMVPs在候选列表中的索引,以及它和运动搜索到的实际运动信息 CPMVs的差值会被传输。候选列表长度为2,建立顺序为:
  1、继承自CU相邻位置的CPMVs。
  2、利用旁边CU的平移MV构造CPMVs。
  3、直接使用旁边CU的平移MV。
  4、0 MVs。
  继承的顺序与merge模式相同,区别是只考虑参考帧相同的CU。
  构造的顺序同样与merge模式相同,同样只考虑参考帧相同的CU,注意此时只添加一个CPMVP到候选列表。
  如果候选列表长度仍然小于2,使用相邻的平移MV填充mv0、mv1和mv2。
  如果候选列表仍然未满,使用0填充。

4、Affine运动信息存储

  在VTM中,CPMV被单独存储,只用来产生merge和AMVP中的继承CPMVPs。子块的MV用CPMV计算,用来进行运动补偿、平移MV候选列表构造和解码。
  从上方CTU获取affine运动信息更加困难,因此如果CU的affine运动信息继承自上方的CTU行,改用上方CU的左下子块和右下子块的MV来代替CPMV作为候选,如下图所示,EBC块的黄色MV将会作为候选。
H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测_第5张图片

5、光流预测增强PROF

  基于分块的Affine可以降低很多复杂度,为了进行更细粒度的运动补偿,VTM使用了PROF(prediction refinement with optical flow),根据光流公式对亮度预测值进行调整,同时不增加内存访问带宽。

5.1、计算方法

1、通过子块仿射运动补偿得到子块预测值I(i, j)。
2、计算子块预测值的梯度gx(?, ?)和gy(?, ?),与BDOF相同,
gx(i, j) = (?(i + 1, j) ≫ shift1) − (I(i − 1, j) ≫ shift1)
gy(i, j) = (?(i, j + 1) ≫ shift1) − (I(i, j − 1) ≫ shift1)
shift1用于控制精度。不增加额外内存带宽,超过边界的值用边界值填充。
3、计算亮度差值,
ΔI(i, j) = gx (i, j) ∗ Δvx (i, j) + gx(i, j) ∗ Δvx (i, j)
Δv(i, j)表示点(i, j)的运动矢量v(i, j)与其所属自块的运动矢量MV的差值。由于各子块affine参数不变,各样点位置与子块中心的关系不变,因此可以计算第一个子块的Δv(i, j)来应用的所有子块。
用dx(i, j)和dy(i, j)来代表样点(i, j)和子块中心位置(xSB, ySB),的差值,
dx(i, j) = i − xSB
dy(i, j) = j − ySB
Δvx (i, j) = C ∗ dx(i, j) + D ∗ dy(i, j)
Δyx (i, j) = E ∗ dx(i, j) + F ∗ dy(i, j)
C、D、E、F计算方式为:
H.266/VVC技术描述_3-帧间预测_1-Affine模式:仿射运动补偿预测_第6张图片
4、计算调整后预测值,
I′(i, j) = I(i, j) + ΔI(i, j)

5.2、使用条件

PROF在两种条件下使用:
(1) 控制点运动矢量相等。
(2) 由于空间限制,将子块affine运动补偿分解为基于CU的运动补偿,导致affine运动参数大于一个阈值。
PROF在两种条件下不使用:
(1) CU节点不为根节点并且CU的父节点没有选中affine。因为此条件下CU选中affine的几率不高。
(2) 参数C、D、E、F的幅值小于一个阈值并且不为Lowdelay模式。因为此条件下PROF增益很低。

你可能感兴趣的:(H.266/VVC,视频编码)