视频前处理:时域滤波MCTF技术学习

参考提案:JVET-U0056、JVET-V0056

时域滤波MCTF(Motion Compensated Temporal Filter)是一种视频前处理技术,直接修改原始帧,目前已经集成到了VTM和HM中。

核心思想

假设现在有一个P1帧和一个P2帧,P1帧编完之后会作为P2帧的参考。那么与其让A帧的编完后的recP1去接近orgP1,不如让recP1去接近(orgP1+orgP2)/2。这样P2帧参考P1帧时预测会更准确,从而到压缩码率的目的。

MCTF就是基于上面思想,进行帧间平均。不过不是直接平均原始帧。而是使用运动估计和运动补偿的方法,也就是将最佳匹配块与当前块进行加权平均,起到降噪的效果,从而提升编码效率。

MCTF主要针对要多次被参考的帧使用,因此主要对低时间层的帧使用。使用当前帧前向4帧和后项4帧对当前帧进行MCTF操作。

RA配置下:

(POC%8)==0 以及(POC%16)==0  的帧使用MCTF

LD配置下:

(POC%4)==0 的帧使用MCTF

AI配置下不支持MCTF

具体步骤

运动估计、运动补偿、双边滤波

  • 运动估计

金字塔搜索

整像素搜索,以16x16的块为单位进行搜索。会将L0下采样两次得到L1、L2。

按照L2->L1->L0的顺序依次搜索,每一次都以上一次的最优MV进行进一步搜索。

分像素搜索,以8x8为单位进行搜索。每一次都以上一次的最优MV进行进一步搜索。

整体来说,运动估计的步骤相当于对下采样两次、然后上采样,得到多层图像。从分辨率最小的那一层搜索,每次都以上一层最优的为基础进行进一步搜索。

  • 运动补偿

在下面这个函数中进行运动补偿

void EncTemporalFilter::applyMotion(const Array2D<MotionVector> &mvs, const PelStorage &input, PelStorage &output) const

抽头系数如下:

const int EncTemporalFilter::m_interpolationFilter[16][8] =
{
  {   0,   0,   0,  64,   0,   0,   0,   0 },   //0
  {   0,   1,  -3,  64,   4,  -2,   0,   0 },   //1 -->-->
  {   0,   1,  -6,  62,   9,  -3,   1,   0 },   //2 -->
  {   0,   2,  -8,  60,  14,  -5,   1,   0 },   //3 -->-->
  {   0,   2,  -9,  57,  19,  -7,   2,   0 },   //4
  {   0,   3, -10,  53,  24,  -8,   2,   0 },   //5 -->-->
  {   0,   3, -11,  50,  29,  -9,   2,   0 },   //6 -->
  {   0,   3, -11,  44,  35, -10,   3,   0 },   //7 -->-->
  {   0,   1,  -7,  38,  38,  -7,   1,   0 },   //8
  {   0,   3, -10,  35,  44, -11,   3,   0 },   //9 -->-->
  {   0,   2,  -9,  29,  50, -11,   3,   0 },   //10-->
  {   0,   2,  -8,  24,  53, -10,   3,   0 },   //11-->-->
  {   0,   2,  -7,  19,  57,  -9,   2,   0 },   //12
  {   0,   1,  -5,  14,  60,  -8,   2,   0 },   //13-->-->
  {   0,   1,  -3,   9,  62,  -6,   1,   0 },   //14-->
  {   0,   0,  -2,   4,  64,  -3,   1,   0 }    //15-->-->
};

  • 双边滤波

最后需要对各帧结果按照下式进行加权平均:

 其中,加权系数如下:

w的值按照下面式子计算:

RA下:

 LD下:

 

 

剩下2个参数按照下面式子计算:

需要计算出块误差E和块频率F

其中V为当前块的方差。 

如果E小于50,则该块中来自该参考帧的像素的基本权重乘以1.2。如果E大于100,则基本权重乘以0.6。如果E大于50,则西格玛权重乘以0.8。

然后计算每个8x8块和参考系的频率度量F。为此,我们首先计算像素级的差异原始块和相应的块参考帧运动补偿后,创建一个差异块d.我们计算的平方差异水平相邻值D,称为HSD,相同的垂直相邻值,VSD。最后,我们计算D,SSD的平方值的平方和。然后我们计算F为

 如果F大于或等于25,则该块中来自该参考帧的像素的基本权重乘以0.6,西格玛权重乘以0.8。

性能:

如下为V0056中给出的性能,可以看到在VTM12.0上相对于不开MCTF,编解码时间降低同时还达到了5.45%的码率节省。

猜你喜欢

转载自blog.csdn.net/zzy_pphz/article/details/127132543