精华内容
下载资源
问答
  • h264解码之环路滤波
    2021-03-19 00:05:48

    代码以ffmpeg为例,h264解码代码在h264.c里。

    环路滤波(Loop Filter)部分

            FFmpeg的H.264解码器调用decode_slice()函数完成了解码工作。这些解码工作可以大体上分为3个步骤:熵解码,宏块解码以及环路滤波。

            环路滤波主要用于滤除方块效应。decode_slice()在解码完一行宏块之后,会调用loop_filter()函数完成环路滤波功能。loop_filter()函数会遍历该行宏块中的每一个宏块,并且针对每一个宏块调用ff_h264_filter_mb_fast()。ff_h264_filter_mb_fast()又会调用h264_filter_mb_fast_internal()。
             h264_filter_mb_fast_internal() 完成了一个宏块的环路滤波工作。该函数调用filter_mb_edgev()和filter_mb_edgeh()对亮度垂直边界和水平边界进行滤波,或者调用filter_mb_edgecv()和filter_mb_edgech()对色度的的垂直边界和水平边界进行滤波。

    decode_slice()

    decode_slice()用于解码H.264的Slice。该函数完成了“熵解码”、“宏块解码”、“环路滤波”的功能。它的定义位于libavcodec\h264_slice.c。

    decode_slice()的流程:

    (1)判断H.264码流是CABAC编码还是CAVLC编码,进入不同的处理循环。
    (2)如果是CABAC编码,首先调用ff_init_cabac_decoder()初始化CABAC解码器。然后进入一个循环,依次对每个宏块进行以下处理:

    a)调用ff_h264_decode_mb_cabac()进行CABAC熵解码

    b)调用ff_h264_hl_decode_mb()进行宏块解码

    c)解码一行宏块之后调用loop_filter()进行环路滤波

    d)此外还有可能调用er_add_slice()进行错误隐藏处理

    (3)如果是CABAC编码,直接进入一个循环,依次对每个宏块进行以下处理:

    a)调用ff_h264_decode_mb_cavlc()进行CAVLC熵解码

    b)调用ff_h264_hl_decode_mb()进行宏块解码

    c)解码一行宏块之后调用loop_filter()进行环路滤波

    d)此外还有可能调用er_add_slice()进行错误隐藏处理

    可以看出,环路滤波函数是loop_filter()。

    loop_filter

            loop_filter()循环遍历一行宏块,并且针对每一个宏块调用了ff_h264_filter_mb_fast()函数。ff_h264_filter_mb_fast()用于对一个宏块进行环路滤波工作。该函数的定义位于libavcodec\h264_loopfilter.c。ff_h264_filter_mb_fast()代码比较简单,其中调用了另一个函数h264_filter_mb_fast_internal()。

    h264_filter_mb_fast_internal

    h264_filter_mb_fast_internal()用于对一个宏块进行环路滤波。该函数的定义位于libavcodec\h264_loopfilter.c。通过源代码整理出来h264_filter_mb_fast_internal()的流程如下:
    (1)读取QP等几个参数,用于推导滤波门限值alpha,beta。
    (2)如果是帧内宏块(Intra),作如下处理:

    a)对于水平的边界,调用filter_mb_edgeh()进行滤波。
    b)对于垂直的边界,调用filter_mb_edgev()进行滤波。

    帧内宏块滤波过程中,对于在宏块边界上的边界(最左边的垂直边界和最上边的水平边界),采用滤波强度Bs为4的滤波;对于其它边界则采用滤波强度Bs为3的滤波。

    (3)如果是其他宏块,作如下处理:

    a)对于水平的边界,调用filter_mb_edgeh()进行滤波。
    b)对于垂直的边界,调用filter_mb_edgev()进行滤波。

    此类宏块的滤波强度需要另作判断。

    总体说来,一个宏块内部的滤波顺序如下图所示。图中的“0”、“1”、“2”、“3”为滤波的顺序。可以看出首先对垂直边界进行滤波,然后对水平边界进行滤波。垂直边界滤波按照从左到右的顺序进行,而水平边界的滤波按照从上到下的顺序进行。

    filter_mb_edgeh()用于对水平边界进行滤波。该函数定义位于libavcodec\h264_loopfilter.c。该函数首先计算了alpha,beta两个滤波的门限值,然后根据输入信息判断是否需要强滤波。如果需要强滤波(Bs取值为4),就调用 H264DSPContext中的滤波汇编函数h264_v_loop_filter_luma_intra();如果不需要强滤波(Bs取值为1、2、 3),就调用H264DSPContext中的滤波汇编函数h264_v_loop_filter_luma()。
        在这里有一点需要注意,对水平边界进行滤波的函数(函数名中包含“_edgeh”),调用的是垂直滤波函数(函数名中包含“_v”)。

    filter_mb_edgev()用于对垂直边界进行滤波。该函数定义位于libavcodec\h264_loopfilter.c,filter_mb_edgev()的定义与filter_mb_edgeh()是类似的。也是先计算了alpha,beta两个滤波的门限值,然后根据 输入信息判断是否需要强滤波。如果需要强滤波(Bs取值为4),就调用H264DSPContext中的滤波汇编函数 h264_h_loop_filter_luma_intra();如果不需要强滤波(Bs取值为1、2、3),就调用H264DSPContext中的 滤波汇编函数h264_h_loop_filter_luma()。下文将会对H264DSPContext中的 h264_h_loop_filter_luma()和h264_h_loop_filter_luma_intra()这两个汇编函数进行分析。

    环路滤波小知识

            H.264解码器在解码后的数据一般情况下会出现方块效应。产生这种效应的原因主要有两个:
    (1)DCT变换后的量化造成误差(主要原因)。
    (2)运动补偿
    正是由于这种块效应的存在,才需要添加环路滤波器调整相邻的“块”边缘上的像素值以减轻这种视觉上的不连续感。下面一张图显示了环路滤波的效果。图中左边的图没有使用环路滤波,而右边的图使用了环路滤波。

    环路滤波的门限

            并不是所有的块的边界处都需要环路滤波。例如画面中物体的边界正好和块的边界重合的话,就不能进行滤波,否则会使画面中物体的边界变模糊。因此需要区别开物体边界和块效应边界。一般情况 下,物体边界两边的像素值差别很大,而块效应边界两边像素值差别比较小。《H.264标准》以这个特点定义了2个变量alpha和beta来判决边界是否 需要进行环路滤波。只有满足下面三个条件的时候才能进行环路滤波:

    | p0 - q0 | < alpha

    | p1 – p0 | < beta

    | q1 - q0 | < beta

             简 而言之,就是边界两边的两个点的像素值不能太大,即不能超过alpha;边界一边的前两个点之间的像素值也不能太大,即不能超过beta。其中alpha 和beta是根据量化参数QP推算出来(具体方法不再记录)。总体说来QP越大,alpha和beta的值也越大,也就越容易触发环路滤波。由于QP越大表明压缩的程度越大,所以也可以得知高压缩比的情况下更需要进行环路滤波。

    环路滤波汇编函数的初始化函数ff_h264dsp_init()。f_h264dsp_init()用于初始化环路滤波函数(实际上该函数也用于初始化DCT反变换和Hadamard反变换函数)。该函数的定义位于libavcodec\h264dsp.c。ff_h264dsp_init()初始化了环路滤波函数,DCT反变换函数和Hadamard反变换函数。

    h264_v_loop_filter_luma_8_c()实现了亮度边界垂直普通滤波器(处理水平边界)。该函数的定义位于libavcodec\h264dsp_template.c。

    更多相关内容
  • 伊尔芬 卷积神经网络的环路滤波
  • 从H.263附录J开始,引入了“环路滤波”,之所以叫“环路”或者“In-loop”,是因为该滤波器在解码的闭环当中,如图红色模块所示,码流中的语法元素解析后,进行反量化和反变换,并与预测值叠加,得到重建图像,该...

    随着5G的成熟和广泛商用,带宽越来越高,让传输视频变得更加容易。移动设备算力的提升、存储容量的提升,也使得视频技术的应用越来越广泛。视频相关的技术,特别是视频压缩技术,因其专业性,深入开发的门槛较高,在实时通信场景中,视频压缩技术更面临严峻的挑战。因为在实时通信场景下,不仅对时延和设备适配的要求很高,对带宽适应的要求也非常高,因此开发一款满足实时通信要求的编解码器,难度很大。

    此前,我们已经在《深入浅出理解视频编解码技术》一文中简要介绍了视频编解码基本框架,也在《揭秘视频千倍压缩背后的技术原理之预测技术》深入分析了该框架中的预测技术,今天我们将继续深入剖析其中的环路滤波模块。

    PART 01 什么是环路滤波?

    基于块的混合编码框架一直是多种视频编解码标准的核心。在编码视频的时候,人为地将视频分割成不同大小的块,再进行预测和补偿,然后再对预测残差进行变换和量化,这一过程都是基于块进行的,在重建视频的时候,在不同的块的边界上就会出现不连续性,这样的不连续性,也就是常说的“块效应”,如图1-1。

    在这里插入图片描述

    ▲ 图1-1环路滤波前的重建图像

    通常人眼会对这样的不连续性比较敏感,很容易感受到视频的清晰度下降。块效应的产生,一方面是由于基于块的变换和量化操作,量化误差导致不同的块的重建样本产生了不同重建值,从而产生了边界;另外,由于运动补偿时,相邻的编码块的预测值,并不一定来自同一帧的相邻块,也会引入虚假边界;类似的,帧内预测不同的预测模式,生成预测值的方式不同,也会引入虚假边界。

    为了减少视频中块的不连续性带来的主观质量下降,可以对重建视频进行滤波操作,如图1-2,经过滤波之后,视频的主观质量有了明显地改善,虚假的块边界平滑了,更为接近原始图像。从图中也可以发现,平坦区域,块效应更加明显,纹理丰富的区域(树叶),有自然的图像边界,也有编码引入的块边界,块效应相对不明显,同时,环路滤波器的设计也需要考虑区分“真”、“假”边界,防止对图像本身已经有的自然边界进行平滑,导致失真。

    在这里插入图片描述

    ▲ 图1-2环路滤波后的重建图像

    在较早的编码标准中,如MPEG-2,该操作都是在后处理阶段进行的,即视频流在解码重建后,输出之前进行滤波,以减少主观上的不舒适性。从H.263附录J开始,引入了“环路滤波”,之所以叫“环路”或者“In-loop”,是因为该滤波器在解码的闭环当中,如图红色模块所示,码流中的语法元素解析后,进行反量化和反变换,并与预测值叠加,得到重建图像,该重建图像将先进行环路滤波,再输出显示,同时作为参考图像,以便于后续的视频帧进行运动补偿。

    由于环路滤波的引入,在提升视频主观质量的同时,也提高了预测的准确性,也进一步提高了编码效率。H.264的环路滤波只有去块滤波一种;从HEVC/H.265开始,环路滤波模块引入了多种类型的滤波器,例如HEVC中的SAO(Sample Adaptive Offset)[1]、AV1中的CDEF(Constrained Directional Enhancement Filter)[2]、LR(Loop Restoration)[3]、VVC中的LMCS(Luma Mapping With Chroma Scaling)、ALF(Adaptive Loop Filter)[4]等。本文将简要介绍HEVC中的去块滤波和AV1中的CDEF,以深入理解环路滤波的作用和效果。

    在这里插入图片描述

    ▲ 图2 混和编码框架中的环路滤波

    PART 02 HEVC中的去块滤波器

    环路滤波的主要功能是去除块效应,设计去块滤波器的主要难点在于对于某一个块边界,是否要进行滤波,以及滤波的强度应该是多少。对块边界进行过度的平滑操作,会导致原有的图像纹理丢失;然而较低强度的平滑,却无法完全去除虚假边界。

    因此,去块滤波器不但要考虑图像本身的纹理特性,也要考虑编码时采用的编码参数,如此才能将真正因为编码引入的人为边界去除。HEVC中,8x8的块的水平和竖直的边界是去块滤波的滤波对象,去块滤波器取边界两侧各4个像素点进行滤波。如此一来,去块滤波以8x8为基本单位,并且不同的8x8的样本之间无重叠,可以进行并行处理,提高处理速度。但并非所有的8x8边界都要进行处理,只有满足一定的条件才会进行:

    • 该边界是预测单元或者变换单元的边界;
    • 块边界的强度非零;
    • 边界两侧样本的局部特征满足一定的统计特性。

    边界强度

    边界强度将决定是否滤波以及滤波器的强度。边界强度可能的取值为0,1,2。取值为0,即不进行滤波操作。边界强度取决到边界两侧的编码块是否是Intra模式,是否有非零系数,是否有不一致的运动方向,是否参考了不同的帧等。这里充分考虑了编码失真才会引入虚假边界这一事实,避免对自然的平坦区域进行不必要的滤波操作。

    局部特征

    当边界强度非零,将进行一步检查图像的局部统计特征。基本的思路是,假设边界两侧的样本连续变化,这些样本将在一条直线上,换言之,像素点的梯度是一个常量;反之,如果边界两侧的梯度相差较大,则有虚假边界引入,如图3所示。当然,偏离程度与量化参数是相关的,标准给出了不同量化参数下的阈值。为了降低运算的复杂度,只计算第一行(列)和第四行(列)样本偏离直线的程度。同时,该偏离程度也与滤波的强度有一定的联系,它决定了滤波的两种模式,即普通滤波和强滤波。

    在这里插入图片描述

    ▲ 图3 块边界两侧样本的局部特性

    去块滤波器

    普通滤波和强滤波两种模式由边界两侧像素点的梯度根据一定的规则进行决策。在普通滤波模式下,可能修改边界两侧最近的各一个或者各两个像素点,其中p0或者q0的滤波器的冲激响应为(3 7 9 −3)/16,p1或者q1的滤波器的冲激响应为(8 19 −1 9 −3)/32。在强滤波模式下,边界两侧各三个像素点会被修改,对p0、p1、p2的滤波器的冲激响应分别为(1 2 2 2 1)/8、(1 1 1 1)/4、(2 3 1 1 1)/8。

    HEVC中的去块滤波与H.264相比,复杂度大大降低了。一方面HEVC的去块滤波是以8x8的块为基本单位,而264是4x4为基本单位;另一方面,HEVC的变换核尺寸和预测单元的尺寸都变大了。除此之外,HEVC的去块滤波的并行度也有了改进,8x8的块的边界两侧各取4个点进行滤波操作,多条边界使用到的像素点互不重叠,可以并行处理;竖直边界和水平边界以帧为单位进行,比H.264以宏块为单位进行更能进一步提高并行度。

    PART 03 AV1中的CDEF

    CDEF滤波器的基本作用是在保持视频图像细节的前提下,使用非线性的空域滤波器来消除编码中出现的失真。视频中的各种纹理细节,方向多种多样,CDEF首先检测纹理的方向,然后沿纹理的方向进行自适应滤波。

    CDEF的纹理检测

    为了保持图像本身的纹理细节,滤波操作应当按照纹理的基本方向进行,避免将纹理本身当作失真进行处理,造成质量下降。CDEF被置于去块滤波操作之后,在重建图像上进行纹理检测。纹理检测的基本单元是8x8的块,这样做的好处,既能有效地处理纹理 又可以便于将滤波操作进行并行处理(SIMD优化)。CDEF设计了8种纹理方向,如图4所示。

    在这里插入图片描述

    ▲ 图4 CDEF的纹理方向定义 [2]

    一个8x8的重建图样块内的像素,搜索某一个方向时,按照该方向定义的不同的分组,对像素进行分组并求其均值,以均值填充分组内的像素,形成一个8x8的“纹理方向预测块”。然后计算它与8x8的重建图像块的平方差的和。各个方向采用相似做法,从而选择最小平方差的和所对应的方向作为最优方向进行滤波操作。
    以图5为例,该8x8的重建图像为45度的纹理(第一行方块所示),8组方向如第二行方块所示,按照方向所定义的像素分组,生成了每种方向的“纹理方向预测块”(第三行方块所示),以及对应的RMS(实际运算中只需要计算“纹理方向预测块”的平方和,便可以得到最佳方向)。按照文章[2]给出的该操作的计算复杂度,它和HEVC中8x8的IDCT的复杂度相当。需要指出的是,最佳纹理方向的决策,是标准定义的一部分,需要编码和解码做到完全一致。
    在这里插入图片描述

    ▲ 图5 CDEF选择最佳方向示例[2]

    Constraint function

    CDEF使用非线性低通滤波器来消除编码出现的失真,同时又能保持图像中原有的纹理不被过度模糊。该滤波器的特点是,滤波系数的位置是基于前文中得到的纹理方向的;同时,横穿纹理方向上,当相邻的像素与被处理的像素差别较大时,减少其影响,以防止纹理被过度平滑,即引入了Constraint function。以一维信号为例,
    该滤波器可以表达为:
    在这里插入图片描述

    其中是滤波器的系数,f(d,S,D)是Constraint function,其表达式为:
    在这里插入图片描述

    它与被滤波的像素与相邻像素的差别大小有关。如果差别较小,f(d,S,D) =d ,就是线性低通滤波器;如果差别较大,f(d,S,D) ,该位置滤波器系数将被忽略。参数S控制了像素差的阈值,参数D控制了f(d,S,D)何时取0。
    在这里插入图片描述

    ▲ 图6 参数S和D的影响[2]

    滤波器的抽头系数

    只沿着纹理的方向进行滤波,有的情况下,无法去除纹理两侧出现的假纹理(Ringing失真)。因此,除了在纹理方向上的像素点之外的其它像素点,也要参与滤波。为此,CDEF设计了两组滤波器抽头系数,一组Primary taps,一组Secondary taps。Primary taps就是沿着纹理方向的,而Secondary taps使用了与纹理方向呈45度角的十字,如图7所示。

    在这里插入图片描述
    在这里插入图片描述

    ▲ 图7 Primary taps and Secondary taps[2]

    与纹理方向检测一样,非线性滤波操作也以8x8的像素块为基本单元,8x8块内的像素共用同一组滤波参数,为了尽可能的并行处理,滤波器的输入都是去块滤波后的像素,CDEF滤波后的像素不会用作后续CDEF滤波器的输入。滤波器的参数在帧级和块级都有相应的语法元素进行传输,可以满足不同的纹理特性的滤波处理。通常需要在编码器中设计合理的算法,进行CDEF滤波参数的选择。

    随着深度学习的蓬勃发展,特别是卷积神经网络在图像恢复、超分、识别、分类等领域表现得非常优秀。深度学习在视频压缩,特别是视频质量恢复和环路滤波领域涌现了许多优秀的算法。卷积神经网络可以更好地提取图像里的纹理等特征,通过学习得到不同纹理特征的对应的网络参数,与人工地基于先验知识(例如CDEF的纹理方向)的滤波算法相比,理论上具有更大优势。例如VRCNN[5]、PRN[6]、RHCNN[7]、Content-Aware CNN[8]、MFRNet[9]等。JVET也专门建立了Exploration Experiments,许多优秀的提案正致力于将深度神经网络应用于视频压缩标准中。环路滤波技术作为混合编码框架中的组成部分,在视频压缩中对提升视频主观质量发挥了至关重要的作用。

    [1] Fu, Chih-Ming, et al. “Sample adaptive offset in the HEVC standard,” IEEE Transactions on Circuits and Systems for Video technology 22.12 (2012): 1755-1764.
    [2] Midtskogen, Steinar & Valin, Jean-Marc. (2018). The Av1 Constrained Directional Enhancement Filter (Cdef). 1193-1197. 10.1109/ICASSP.2018.8462021.
    [3] D. Mukherjee, S. Li, Y. Chen, A. Anis, S. Parker and J. Bankoski, “A switchable loop-restoration with side-information framework for the emerging AV1 video codec,” 2017 IEEE International Conference on Image Processing (ICIP), 2017, pp. 265-269
    [4] M. Karczewicz et al., “VVC in-loop filters,” IEEE Trans. Circuits Syst. Video Technol., early access, Apr. 9, 20217
    [5] Dai, Yuanying, et al. “A Convolutional Neural Network Approach for Post-Processing in HEVC Intra Coding” arXiv:1608.06690, 2016.
    [6] D. Wang, S. Xia, W. Yang, Y. Hu, and J. Liu, “Partition tree guided progressive rethinking network for in-loop filtering of HEVC,” in 2019 IEEE International Conference on Image Processing (ICIP). IEEE, 2019, pp. 2671–2675.
    [7] Y. Zhang, T. Shen, X. Ji, Y. Zhang, R. Xiong, and Q. Dai,“Residual highway convolutional neural networks for in-loop filtering in HEVC,” IEEE Transactions on Image Processing, vol. 27, no. 8, pp. 3827–3841, 2018.
    [8] C. Jia et al., “Content-Aware Convolutional Neural Network for In-Loop Filtering in High Efficiency Video Coding,” in IEEE Transactions on Image Processing, vol. 28, no. 7, pp. 3343-3356, July 2019
    [9] D. Ma, F. Zhang and D. R. Bull, “MFRNet: A New CNN Architecture for Post-Processing and In-loop Filtering,” in IEEE Journal of Selected Topics in Signal Processing, vol. 15, no. 2, pp. 378-387, Feb. 2021

    展开全文
  • 一种基于HVS的快速环路滤波算法,尚鸿,郭宝龙,针对H.264/AVC视频编码标准中的环路滤波复杂度高的缺点,本文提出一种基于人类视觉掩蔽效应的快速环路滤波算法。利用视觉掩蔽函数将
  • 增强型环路滤波算法在HEVC中的应用,韦昭,全子一,本文介绍了在HEVC中采用的去块效应滤波器和自适应环路滤波器,HEVC即高效的视频编码,它的目标是保证图像质量不变的基础上,码率比H
  • HEVC-环路滤波 之去块效应滤波

    千次阅读 2020-06-03 00:09:40
    HEVC系列的目标: 1、对基本概念的进行了解,不深入公式推导当中。在学习进行之前存在的疑问,学习之后是不是都一一解决了? 2、在一段时间忘记相关概念的时候,是不是可以通过阅读之前...二、环路滤波在编码框架...

    HEVC系列的目标:

    1、对基本概念的进行了解,不深入公式推导当中。在学习进行之前存在的疑问,学习之后是不是都一一解决了?

    2、在一段时间忘记相关概念的时候,是不是可以通过阅读之前的记录 最快的回忆起相关概念。

         环路滤波是什么?环路滤波在编解码框架的哪个部分?环路滤波是为了解决什么问题的?环路滤波用了哪些技术?环路滤波的流程是怎样的?

    一、 环路滤波是什么?

        环路滤波顾名思义就是在环路上面对数据进行滤波操作,而所谓的滤波操作就是将数据乘上某一个权重数据。

    二、环路滤波在编码框架的哪个部分?

        从解码端考虑,解码端用于帧间/帧内预测解码的数据 是熵解码 反变换 反量化之后的数据。而在编码端,帧间预测的数据是经过环路滤波处理的。这样做虽然增加了复杂度,同时还需要多传输滤波相关的比特数。 但是滤波后的数据用于参考 能够减少残差的数据,这样从整个编码系统看来 编码出来的比特数反而少了。

    三、环路滤波是为了解决什么问题的?

       环路滤波主要是为了解决块效应和振铃现象而设置的模块。两个问题产生的原因不同,解决的方法也不一样。

    • 块效应和去块效应

        方块效应是指图像中编码块边界的不连续性。块效应是在环路滤波之前的模块引入的。

        1、变换量化过程中的TU分块导致的。

    TU块中变换量化编码过程相互独立,引入的量化误差大小及其分布特性相互独立,导致相邻块边界的不连续。

         2、预测编码PU分块导致。

    在运动补偿预测过程中,相邻块的预测值可能来自于不同图像的不同位置,这样就会导致预测残差信号在块边界产生数值不连续。另外,时域预测技术使得参考图像中存在的边界不连续可能会传递到后续编码图像。

         解决块效应的方法 是加入一个去块效应模块,这个模块的作用是将块与块边界附近的像素进行平滑滤波处理。使得边界的不连续性不那么明显。

    • 振铃效应和样点自适应补偿

        振铃效应 是从量化过程中引入的,数据经过DCT变换、量化后,高频的信息产生失真。这些失真的信息经过解码恢复的时候就会在图像边缘周围产生波纹现象。

        SAO(样点自适应补偿)滤波就是为消除这种振铃效应而设计的。它通过对重建图像的分类,对每一类图像像素值加减一个偏移,达到减少失真的目的。在HEVC中包含了两种像素值补偿方法:边界补偿(Edge Offset,EO)以及边带补偿(Band Offset,BO)。在HEVC中SAO是以CTU为基本单位的。

    四、环路滤波采用了哪些技术?

    4.1 去块效应

        去块效应的最终目的是: 为了 不同的块边界自适应选择是否滤波及滤波强度,如对平滑区域处的不连续边界做强滤波处理,对纹理较丰富的区域弱滤.波乃至不滤波。

        去方块滤波模块的总体流程:首先图像分割成一个个8x8块,找8x8块的边界,包括水平和垂直,取边界两侧的4x4进行组合形成8x4(垂直)或者4x8(水平),边界就落在这8x4/4x8的块中间了。对这些8x4/4x8进行边界强度(BS),然后BS>0的时候进行计算滤波开关的决策计算,对于滤波打开的情况下进行滤波强度的计算,以得到边界的滤波强度(不滤波、弱滤波或强滤波)及滤波参数,在BS大于0而且滤波开关打开的情况下才进行滤波操作,即根据所选择的滤波强度及滤波参数对像素进行相应的修正。

         如下图BS>0是BS的计算过程,计算得到的BS大于0,进入式7-1就是一个滤波开关的决策过程,如果开关时开的情况下 进入滤波强度的决策。然后根据不同的滤波强度进行滤波处理。

    •  分块找边界 确定边界的处理顺序

        对图像进行分块的大小是8x8。TU和PU最小都是8x8,所以块滤波取这个大小是为了覆盖所有TU和PU的边界。而实际是将8x8块分成两部分独立进行去方块滤波处理,垂直边界以8x4为基本单位,水平边界以4x8为基本单位

    • 计算边界强度BS

        边界强度跟滤波强度是两个概念,边界强度间接影响滤波强度,边界强度( Boundary Strength, BS),其取值为0、1或2。

        亮度分量:

        边界强度值为0时,表示该边界不需要滤波,亮度分量边界强度值为1或2时,会进行后续模块处理,并且值会影响后续“滤波强弱选择”中的阈值。

        色度分量:

        边界强度值为0、1时,表示该边界不需要滤波,只有边界强度值为2时,才会对其进行滤波。

        计算流程:

        如下图。P\Q如前图所示,边界强度值在一定程度上反映了两个相邻块编码参数的一致性。 相邻块采用的编码参数越一致,那么BS就越小,边界的块效应就越小。

     

    • 确定边界是不是要进行滤波(滤波开关)

    边界需不需要滤波的规则是 边界两边比较平滑但是边界处出现了差异,这个差异不能太大,太大就是图像边界而不是编码过程中引入的。如下图,

     

    问题是该如何取衡量边界的差异,HEVC中是用8X4块中最上6个和最下6个像素进行计算得到的,计算的值称为纹理度。

     

                垂直块边界区域的纹理度定义为

    Cb小于某个阈值时开启边界滤波,这个阈值通过边界两边块的QP值算出来的。

    • 确定边界是进行什么强度的滤波(滤波强度)

    滤波强度也跟边界处的差异有关,差异越大需要越强的滤波,但不能超过一定范围。判断的方式如下

    强滤波: 式(7-2) ~ (7-7) 均满足时,否则采用弱滤波。

    其中式(7-2)和式(7-3) 用于判断边界两边像素值的变化率。

    其中式(7-4)和式(7-5)用于判断边界两侧像素是否平坦。

    其中式(7-6)和式(7-7) 用于判断在边界处像素的跨度是否控制在一定的范围内。 其中tc是判断的阈值,跟QP、 slice_tc_offset div2 (片级补偿值)以及前面计算到的QS有关。

     

     

    • 进行滤波操作

    1、亮度分量强滤波

        强滤波会对边界两侧的像素进行大范围、大幅度的修正,边界像素p(m,n)和q(m,n)都要进行修正,m取值0,1,2,且n取值0,1,2。也就是对边界左右两边3个共6个像素进行修正。像素值的修正公式略。但是是跟前面tc有关 也就是其中跟QP、 slice_tc_offset div2 (片级补偿值)以及前面计算到的QS有关。

    2、亮度分量弱滤波

        弱滤波操作中修正的像素范围及幅度较小,而且需要根据每一行像素的具体情况确定每行的滤波操作。一般情况下不修复或者只修复一个点。

    3、色度分量滤波

        当获取边界强度模块判定BS=2时,色度分量需要进行滤波操作,色度滤波的过程跟边界左右两边4 共8个像素都有关系。

    五、解码相关的语法

    1. SPS级语法语义

           pcm_loop_filter_disabled_flag: 该语法元素用于说明对于一个编码单元CU,在pcm_ enabled_ flag 为1的条件下是否采用环路滤波技术,包括

    去方块滤波以及像素自适应补偿。当该语法元素取值为1时,表示不使用;取值为0时,表示使用。

          loop_filter_across_tiles_enabled_flag: 该语法元素用于说明在tile的边界处是否执行环路滤波操作,包括去方块滤波和像素自适应补偿。当取值为1时,表示执行;取值为0时,表示不执行。

         pps_ loop_ filter_ across_ slices_ enabled_ flag: 该语法元素用于说明在Slice的左边界以及上边界处是否执行环路滤波操作。当取值为1 时,表示执行;取值为0时,表示不执行。

        deblocking_filter_ control_ present_ flag: 该语法元素指出控制去方块滤波的语法元素是否出现在PPS中。当取值为1时,表示在PPS中有控制.去方块滤波的语法元素;取值为0时,表示没有。

        deblocking_filter_override_ enabled_flag: 该语法元素指出在Slice 头部是否出现语法元素deblocking_filter_override_flag。 当取值为1时,表

    示在Slice头部存在语法元素deblocking_filter_ override_ flag; 取值为0时,表示在Slice头部不存在该语法元素。其默认值为0。

        pps_ deblocking_ filter _disabled_ flag: 该语法元素表示在语法元素

        slice_ deblocking filter_ disabled_ flag 未出现的条件下,是否对各个Slice执行去方块滤波。当取值为1时不执行;取值为0时执行。默认值为0。

        pps beta_ offset_ div2& pps_ tc_ offset_ div2: 该语法元素表示去方块滤波参数p/2和tc/2的默认补偿值,该补偿值还可以在Slice的头部进行重载。其取值范围为[- 6,6],当该语法元素未出现时,认为其值为0。

    2. Slice 级语法语义

        deblocking_filter_ override_ flag: 该语法元素表明在Slice的头部是否出现去方块滤波参数。当取值为1时,表明出现了去方块滤波参数;当取值为0时,表明未出现。其默认值为0。

        slice_ deblocking_ filter_ disabled_ flag: 该语法元素表明对于当前Slice是否进行去方块滤波操作。当其取值为1时,表示不进行;取值为0时,

    表示进行。当该语法元素未出现时,其值等于语法元素pps_deblocking_filter_disabled_flag 的值。

        slice_ beta_ offset_ div2&slice_ tc_ offset_ div2: 该语法元素表明当前Slice的去方块滤波参数β/2和tc/2的补偿值,其取值范围为[-6,6]。 当该语法元素未出现时,slice_beta_offset_ div2 的值等于pps_ beta_ offset_ div2的值,slice_ tc_ offset_ _div2 的值等于pps_ tc_ offset_ _div2 的值。

    slice_loop_filter_ across_ slices_ enabled_ flag: 该语法元素表明对于当前Slice的左边界及上边界是否进行环路滤波操作,包括去方块滤波和像素自适应补偿。当取值为1时,表示可能进行( 具体情况要根据后续条件判断);取值为0时,不进行环路滤波。当该语法元素未出现时,其值等于pps_ loop_ filter_ _across_ slices_ enabled_ flag 的值。

    六、总结

        块效应是编码块与块之间的预测,变换参数方法等不一样导致的块边界像素的不连续。 解决这个问题的方法是对边界周围的像素点进行滤波修正。滤波修正处理的是左右或者上下两个8x8之间的垂直和水平边界,实际计算的范围是边界周围8x8像素矩阵拆分成的两个4x8或者8x4像素矩阵。首先计算边界强度,边界强度跟边界周边两个4x4块采用的预测和变换的参数相关。计算得到边界强度后,对于边界强度大于0的,进一步判断是否需要滤波。是否需要滤波是通过边界像素的差异来决定的。如果是需要滤波的情况,还需继续判断是使用强滤波还是弱滤波。这一步的判断跟边界差异,QP,边界强度以及sps 中片级偿值 有关。最后就依照公式进行滤波像素修正。强滤波修正的范围比较大。

     

     

     

     

     

     

    展开全文
  • H.264/AVC 环路滤波

    2021-10-15 10:30:17
    今天看看264的滤波。 和265、266比起来,264只有一个DBF,看看有没有有意思的地方。 264的滤波位置与265和266相同。 具体的处理方式和265有区别:265是以8x8的块为基础,264是以宏块中的4x4块为基础。 ...

    今天看看264的滤波。

    和265、266比起来,264只有一个DBF,看看有没有有意思的地方。

    264的滤波位置与265和266相同。

    具体的处理方式和265有区别:265是以8x8的块为基础,264是以宏块中的4x4块为基础。

    Filtering is applied to vertical or horizontal edges of 4x4 blocks in a macroblock excluding edges on slice boundaries, in the following order:

    1. Filter 4 vertical boundaries of the luma component in order a,b,c,d in Figure 6.45

    2. Filter 4 horizontal boundaries of the luma component in order e,f,g,h Figure 6.45

    3. Filter 2 vertical boundaries of each chroma component (i,j)

    4. Filter 2 horizontal boundaries of each chroma component (k,l)

    以竖直方向的边界为例,简单说明滤波:

    p和q分别是边界两边的像素值

    滤波里面有两个概念:边界强度Bs和滤波强度

    边界强度是指:看当前这个块边界有没有明显到需要进行滤波

    边界强度的计算方式如下

    1. 如果p或者q使用intra模式编码并且当前边界是宏块的边界,那么Bs=4

    2. 如果p或者q使用intra模式编码并且当前边界不是宏块边界,那么Bs=3

    3. 如果p和q都没有使用intra模式编码;如果p或者q包含编码系数,那么Bs=2

    4. 如果p和q没有使用intra模式编码;p和q都不包含编码系数;

        p和q的参考帧不同或者参考帧数量不同或者MV不同,那么Bs=1

    5. 如果p和q没有使用intra模式编码;p和q都不包含编码系数;

        p和q参考帧相同并且MV相同,那么Bs=0,不进行滤波

    滤波强度是指:如果确定要进行滤波,那么要进行多狠的滤波

    滤波操作最多影响边界上的三个像素点,滤波强度取决于QP、相邻块的编码模式和边界周围图像梯度。

    (p2,p1,p0,q0,q1,q2)会在下面两种情况下滤波:

    (1) Bs > 0

    (2) |p0-q0|,|p1-p0| and |q1-q0| 分别小于α和β,α和β是定义在标准中的,随QP的增大而增大。这是在视频图像内容有明显纹理的情况下尽可能不去滤波,防止模糊。

    实际滤波的过程中会影响边界周围几个像素点取决于下面(都是规矩,没什么好理解的,直接截图了):

    总体来说,和265、266的没什么区别,甚至会更简单。

    展开全文
  • 文章目录1、去块滤波介绍2、滤波决策2.1、获取边界强度2.2、滤波开关决策3、滤波操作3.1、亮度分量的强滤波3.2、亮度分量的弱滤波3.3、色度分量的滤波 1、去块滤波介绍 方块效应是指图像中编码块边界的不连续性。...
  • 为了进一步提高基于块与四叉树的自适应环路滤波算法(BQ ALF) 的编码性能, 提出了最优对称性的快速 自适应环路滤波算法(FALF OS). 首先根据区域对称性和平均绝对差值门限确定最优的对称性滤波器; 然后在I 帧中...
  • 环路滤波

    千次阅读 2019-01-28 22:15:12
    去块效应滤波 产生原因 各个块变换量化过程相对独立,因此引入的量化误差大小及其分布特性相互独立,导致相邻块边界的不连续; 运动补偿中,相邻块的预测值可能来自不同图像的不同位置,导致预测残差信号在块边界...
  • DATE: 2020.10.20 文章目录1、简介2、ALF2.1、滤波器形状2.2、块分类2.3、...除了去块滤波和SAO(HEVC中采用了这两种环路滤波),还采用了ALF。ALF包含了亮度ALF,色度ALF和跨分量ALF(CC-ALF)。这三个ALF过程可以
  • 环路滤波Loop Filter

    万次阅读 2018-12-06 15:52:36
    再经过反量化(Rescale)和IDCT后恢复的矩阵与原矩阵存在一定的误差,特别宏块的边界,会照常恢复的图像呈现方块化,而方块化的图片对于后面的图片预测存在极大的影响,所以我们需要通过环路滤波进行去方块化 ...
  • VVC环路滤波(一):ALF

    万次阅读 2020-02-16 12:13:51
    在VTM5中提供了三种环路滤波技术:去方块滤波(Deblocking filter,DF),样点自适应补偿(Sample adaptive offset,SAO)和自适应环路滤波(adaptive loop fitler,ALF)。在VTM5中这些滤波工具的使用顺序为DF,SAO,ALF。 ...
  • VVC的去块滤波过程和HEVC的类似,主要包含三个步骤 根据边界两侧的编码模式和编码参数确定边界强度 根据边界两侧像素值,确定滤波强度(包括滤波开关决策和滤波强度决策) 进行滤波处理过程 1、边界强度(BS)的...
  • SAO(Sample Adaptive Offset)像素自适应偏移,在编解码环路内,位于Deblocking之后。 H.265标准中的SAO以CTB为基本单位,通过选择一个合适的分类器将重建像素划分类别,然后对不同类别像素使用不同的补偿值,可以...
  • 针对低码率编码情况下块效应严重的现象,提出一种环路滤波去除块效应的算法。该算法基于图像特征在时域和频域对应的原理,利用变长码编码特点,在频域分析编码块的特性,自适应选择不同强度和模式的滤波算法,从而...
  • 自适应环路滤波(ALF)是面向高清的多视点视频编码(MVC)中的一项新的滤波技术,虽然能提高视频压缩的主观质量和客观质量,但是其复杂度过高阻碍了其实时应用。本文提出了一种低复杂度的ALF算法,充分利用了视点间相关性和...
  • 环路滤波(五):SAO

    万次阅读 2020-02-25 09:51:09
    样点自适应补偿(Sample Adaptive Offset,SAO)用于消除振铃效应。振铃效应是由于高频交流系数的量化失真,解码后会在边缘周围产生波纹的现象,变换块尺寸越大振铃效应越明显。如下图所示,虚线是原始像素值,实线是...
  • 样点自适应补偿SAO技术包含两滤波类型,边缘补偿(Edge Offset,EO)和带补偿(Band Offset,BO),在实际编码中,以CTU为单位,针对每个CTU的不同特性,由RDO准则决定使用哪种SAO滤波类型或者不使用SAO滤波。...
  • 今天来看下环路滤波部分的代码。下图,这里所说的环路滤波器包含了去块效应滤波器和像素自适应补偿SAO滤波器,属于环路后处理。 在解码端,解码码流生成预测帧后,会对预测帧+残差得到的重构帧进行环路滤波环路...
  • HEVC的环路滤波(1)

    千次阅读 2016-09-07 15:07:31
    HEVC的环路滤波(1) 1. 概述 HEVC的环路滤波包括两个部分:去方块滤波(deblocking filter)和样本自适应缩进滤波(sample adaptive offset filter,简称SAO)。 首先进行去方块滤波(见第2节),输入为重构后...
  • 使用CNN进行环路滤波(一) 本文介绍一种在VVC环路滤波中使用CNN的技术,该算法来自于JVET-O0056 CNNLF 该卷积网络模型称为CNNLF,用于VVC的环路滤波的ALF阶段之后,如下图所示。 CNNLF的输入是ALF的输出,...
  • SAO(样点自适应补偿)滤波就是为消除这种振铃效应而设计的。它通过对重建图像的分类,对每一类图像像素值加减一个偏移,达到减少失真的目的。在HEVC中包含了两种像素值补偿方法:边界补偿(Edge Offset...
  • 针对低码率的情况下效应比较严重的情况,提出在低码率下对环路滤波的一种改进的方法。对于空间基本层的环路滤波,采取与H.264/AVC兼容的环路滤波算法。但是对于空间增强层,特别是在低码率的情况下,加入一个对图像...
  • 面向3D-HEVC的感知自适应环路滤波
  • 低载噪比GPS信号载波跟踪环路滤波算法.pdf
  • DF作用于相邻CU的边界(除开图像边界),共分为三个步骤 判定边界强度 判定滤波强度 滤波过程 关于HEVC中的DF可见博文:HEVC滤波—去方块滤波 本文主要介绍VVC和HEVC在DF过程中不同的地方 基于重建亮度等级...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,405
精华内容 1,762
关键字:

环路滤波