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


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

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

    核心思想

    假设现在有一个P1帧和一个P2帧,P1帧编完之后会作为P2帧的参考。那么与其让P1帧的编完后的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 &mvs, const PelStorage &input, PelStorage &output) const

    抽头系数如下:

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

    • 双边滤波

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

     其中,加权系数如下:

    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%的码率节省。

  • 相关阅读:
    treap树:hdu 4585 Shaolin
    服务端修改Cookie——跨域cookie发送机——通信加密——异或加密
    JSD-2204-Dubbo实现微服务调用-Seata-Day03
    【Spark的五种Join策略解析】
    力扣日记3.11-【贪心算法篇】455. 分发饼干
    Linux之Shell(二)
    数据结构与算法学习(day5)——队列算法
    Github 2024-04-18 开源项目日报 Top10
    Docker实战技巧(一):常用命令与最佳实践
    源码分析:如何开发规则链
  • 原文地址:https://blog.csdn.net/zzy_pphz/article/details/127132543