视频前处理:时域滤波MCTF技术学习
Posted 神遁克里苏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了视频前处理:时域滤波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%的码率节省。
以上是关于视频前处理:时域滤波MCTF技术学习的主要内容,如果未能解决你的问题,请参考以下文章
JVET提案学习:块重要性映射Block importance mapping