方块效应是指图像由于失真而造成的编码边界不连续而在视觉上产生“一块一块”的效果。方块效应的产生是由于现在的编码技术都是基于块的编码,不同块的预测变换量化等过程相互独立从而引入的量化误差大小及分布也相互独立。对块边界进行平滑滤波可以有效降低或去除方块效应,这就是去方块滤波(Deblocking Filter)。

去方块滤波处理流程如下:

H.265/HEVC中去方块滤波

H.265中去方块滤波有如下特点:

  • 无论是亮度还是色度分量,只按照8x8的块边界进行处理,且必须是TU或PU的边界,图像边界不处理。对于色度分量仅当边界两侧至少有一个块采用帧内预测时该边界才需要被滤波,这使滤波次数大大降低。

  • 滤波时,待处理边界两边最多各修正3个像素值,这使得8x8块边界空间独立可以并行处理。

  • 可以先处理整幅图像的垂直边界再处理水平边界,而非H.264中垂直边界和水平边界穿插处理。

滤波决策

虽然去方块滤波按照8x8块边界处理,而实际上是将8x8的块分成两部分独立处理,垂直边界以8x4为基本单位,水平边界以4x8为基本单位。如下图所示:

滤波决策是对所有PU和TU边界中8x8的块边界确定其滤波强度和滤波参数。只有平坦区域的不连续边界才需要滤波。下图是滤波决策过程:

对于亮度分量的块边界需要上面3个步骤确定滤波强度和滤波参数,而对于色度分量的块边界滤波决策环节只需要为其确定边界强度,且其边界强度值直接取自对应的亮度边界。

(1)获取边界强度

获取边界强度(Boundary Strength,BS)就是根据边界块的编码参数初步判断块边界是否需要滤波及滤波参数。BS的取值为0、1或2。对于亮度分量当BS为0时表示该边界不需要滤波,不再进行后续处理。当亮度分量的BS为1或2时才会进行后续处理。对于色度分量当BS为0或1时表示该边界不需要滤波,不再进行后续处理,只有BS为2时才需要滤波(也不需要进行后续的滤波开关决策和滤波强度选择)。

BS的获取过程如上图所示。P和Q分别为边界两侧的块,如前面图中所示。

边界强度计算在下面函数中实现。

Void xGetBoundaryStrengthSingle ( TComDataCU* pCtu, DeblockEdgeDir edgeDir, UInt uiPartIdx );

(2)滤波开关决策

由于人眼的空间掩蔽效应,图像平坦区域的不连续边界更容易被观察到。当边界两侧变化剧烈时边界处的不连续可能是由视频内容自身导致。另外,滤波会减弱强纹理区域应有的纹理信息。滤波开关决策就是根据边界块内像素值的变化程度判断该边界的内容特性,然后根据内容特性确定是否需要进行滤波操作。

下图是一个垂直块边界区域示意图。p(x,y),q(x,y)分别是边界两侧的像素值。

现定义首行和末行的像素变化率。

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

纹理度值越大表明该区域越不平坦,当大到一定程度时该边界不需要滤波。H.265/HEVC规定满足下面条件时该边界滤波开关打开,否则关闭。

阈值beta为判决门限,其与边界两侧块的量化参数QP有关,由下面方法得出。

const UChar TComLoopFilter::sm_tcTable[MAX_QP + 1 + DEFAULT_INTRA_TC_OFFSET] =
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5,5,6,6,7,8,9,10,11,13,14,16,18,20,22,24
};
​
const UChar TComLoopFilter::sm_betaTable[MAX_QP + 1] =
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,8,9,10,11,12,13,14,15,16,17,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64
};

(3)滤波强弱选择

在上一步滤波开关打开的前提下,需要对视频内容进行更细致的判断以进一步确定滤波强度。

上面3种边界情况,(a)与(b)相比,边界两侧像素平坦而边界处变化剧烈,在视觉上会形成更强的块效应,需要对边界周围像素进行大范围、大幅度修正。(c)边界处像素变化特别大,由于失真总会处于一定范围,当差值超出一定范围后,这种块边界则是由视频内容本身所致。

当上面6个式子都满足时采用强滤波,否则采用弱滤波。第1、2式用于判断边界两侧像素值变化率,第3、4式用于判断边界两侧像素是否平坦,第5,6式用于判断边界处像素的跨度是否控制在一定范围。tc是判决门限,其与边界两侧块的量化参数QP有关,由下面方法得出。

__inline Bool TComLoopFilter::xUseStrongFiltering( Int offset, Int d, Int beta, Int tc, Pel* piSrc)
{Pel m4  = piSrc[0];Pel m3  = piSrc[-offset];Pel m7  = piSrc[ offset*3];Pel m0  = piSrc[-offset*4];
​Int d_strong = abs(m0-m3) + abs(m7-m4);
​return ( (d_strong < (beta>>3)) && (d<(beta>>2)) && ( abs(m3-m4) < ((tc*5+1)>>1)) );
}

滤波操作

当上面滤波决策判定为需要滤波时,则需要进行滤波操作。包括3种情况:亮度边界的强滤波、亮度边界的弱滤波、色度边界的滤波。

亮度边界的强滤波

强滤波会对边界两侧像素进行大范围、大幅度修正。需要修正的像素为边界两侧各3个像素。

亮度边界的弱滤波:

弱滤波修正的像素范围和幅度较小。最多需要修正的像素为边界两侧各2个像素。需要根据每行像素具体情况进行滤波操作。

下面以第1行像素为例说明:

接着判断p(1,0)及q(1,0)是否需要修正。

下面代码是亮度强滤波和弱滤波的实现:

/**- Deblocking for the luminance component with strong or weak filter.\param piSrc           pointer to picture data\param iOffset         offset value for picture data\param tc              tc value\param sw              decision strong/weak filter\param bPartPNoFilter  indicator to disable filtering on partP\param bPartQNoFilter  indicator to disable filtering on partQ\param iThrCut         threshold value for weak filter decision\param bFilterSecondP  decision weak filter/no filter for partP\param bFilterSecondQ  decision weak filter/no filter for partQ\param bitDepthLuma    luma bit depth
*/
__inline Void TComLoopFilter::xPelFilterLuma( Pel* piSrc, Int iOffset, Int tc, Bool sw, Bool bPartPNoFilter, Bool bPartQNoFilter, Int iThrCut, Bool bFilterSecondP, Bool bFilterSecondQ, const Int bitDepthLuma)
{Int delta;
​Pel m4  = piSrc[0];Pel m3  = piSrc[-iOffset];Pel m5  = piSrc[ iOffset];Pel m2  = piSrc[-iOffset*2];Pel m6  = piSrc[ iOffset*2];Pel m1  = piSrc[-iOffset*3];Pel m7  = piSrc[ iOffset*3];Pel m0  = piSrc[-iOffset*4];
​if (sw){//!<强滤波piSrc[-iOffset]   = Clip3(m3-2*tc, m3+2*tc, ((m1 + 2*m2 + 2*m3 + 2*m4 + m5 + 4) >> 3));piSrc[0]          = Clip3(m4-2*tc, m4+2*tc, ((m2 + 2*m3 + 2*m4 + 2*m5 + m6 + 4) >> 3));piSrc[-iOffset*2] = Clip3(m2-2*tc, m2+2*tc, ((m1 + m2 + m3 + m4 + 2)>>2));piSrc[ iOffset]   = Clip3(m5-2*tc, m5+2*tc, ((m3 + m4 + m5 + m6 + 2)>>2));piSrc[-iOffset*3] = Clip3(m1-2*tc, m1+2*tc, ((2*m0 + 3*m1 + m2 + m3 + m4 + 4 )>>3));piSrc[ iOffset*2] = Clip3(m6-2*tc, m6+2*tc, ((m3 + m4 + m5 + 3*m6 + 2*m7 +4 )>>3));}else{//!<弱滤波/* Weak filter */delta = (9*(m4-m3) -3*(m5-m2) + 8)>>4 ;
​if ( abs(delta) < iThrCut ){delta = Clip3(-tc, tc, delta);piSrc[-iOffset] = ClipBD((m3+delta), bitDepthLuma);piSrc[0] = ClipBD((m4-delta), bitDepthLuma);
​Int tc2 = tc>>1;if(bFilterSecondP){Int delta1 = Clip3(-tc2, tc2, (( ((m1+m3+1)>>1)- m2+delta)>>1));piSrc[-iOffset*2] = ClipBD((m2+delta1), bitDepthLuma);}if(bFilterSecondQ){Int delta2 = Clip3(-tc2, tc2, (( ((m6+m4+1)>>1)- m5-delta)>>1));piSrc[ iOffset] = ClipBD((m5+delta2), bitDepthLuma);}}}
​if(bPartPNoFilter){piSrc[-iOffset] = m3;piSrc[-iOffset*2] = m2;piSrc[-iOffset*3] = m1;}if(bPartQNoFilter){piSrc[0] = m4;piSrc[ iOffset] = m5;piSrc[ iOffset*2] = m6;}
}

色度边界的滤波:

当BS=2时,色度边界需要滤波。需要修正的像素为边界两侧各1个像素。

下面是色度滤波的实现:

/**- Deblocking of one line/column for the chrominance component.\param piSrc           pointer to picture data\param iOffset         offset value for picture data\param tc              tc value\param bPartPNoFilter  indicator to disable filtering on partP\param bPartQNoFilter  indicator to disable filtering on partQ\param bitDepthChroma  chroma bit depth*/
__inline Void TComLoopFilter::xPelFilterChroma( Pel* piSrc, Int iOffset, Int tc, Bool bPartPNoFilter, Bool bPartQNoFilter, const Int bitDepthChroma)
{Int delta;
​Pel m4  = piSrc[0];Pel m3  = piSrc[-iOffset];Pel m5  = piSrc[ iOffset];Pel m2  = piSrc[-iOffset*2];//!<deta计算delta = Clip3(-tc,tc, (((( m4 - m3 ) << 2 ) + m2 - m5 + 4 ) >> 3) );piSrc[-iOffset] = ClipBD((m3+delta), bitDepthChroma);piSrc[0] = ClipBD((m4-delta), bitDepthChroma);
​if(bPartPNoFilter){piSrc[-iOffset] = m3;}if(bPartQNoFilter){piSrc[0] = m4;}
}

感兴趣的请关注微信公众号Video Coding

环路滤波(二):HEVC去方块滤波相关推荐

  1. HEVC学习(三十四) —— 去方块滤波之五

    本文考察实现去方块滤波的核心函数xDeblockCU: Void TComLoopFilter::xDeblockCU( TComDataCU* pcCU, UInt uiAbsZorderIdx, ...

  2. HEVC中的去方块滤波——Deblocking Filter

    Deblocking Filter的作用 Deblocking与SAO都是HEVC中的环路滤波器,重建图像会首先经过Deblocking,再进行SAO.Deblocking主要用来去除编码的块效应,S ...

  3. h.264 去块滤波

    块效应及其产生原因 我们在观看视频的时候,在运动剧烈的场景常能观察到图像出现小方块,小方块在边界处呈现不连续的效果(如下图),这种现象被称为块效应(blocking artifact). 首先我们需要 ...

  4. 9 概率机器人 Probabilistic Robotics 二值贝叶斯滤波 占据栅格地图 occupancy grid mapping

    文章目录 1 前言 2 二值贝叶斯滤波 2.1 理论基础 2.2 算法流程 2.3 重要公式推导 3 实例:占据栅格地图(occupancy grid mapping) 4 参考文献 1 前言 如果通 ...

  5. H.266/VVC技术学习之环路滤波:去块滤波(Deblock)技术

    一.方块效应 目前主流的视频编码标准都是基于分块的混合编码机制,其处理过程是针对每个块单独进行处理的,因此由于编码模式的差异以及量化误差的原因,会导致相邻块重建像素不连续的现象.对于一个两侧强相关性的 ...

  6. SVACH.264AVS去块滤波比较

    Date:2017/10/21 Content: SVAC&H264&AVS标准的去块滤波比较 一.去块滤波条件 H.264:支持4x4边界的环路滤波: SVAC:在H.264的基础上 ...

  7. 动态二维码中值滤波处理_使用中值滤波原理过滤异常数据

    最近有一个程序需要做一些数据分析,遇见一个求平均值的需求.数据序列由传感器输出类似如下:[10,12,11,25,9,10,9,45,13,12,10,11,78,12,12,13,10,9].在这个 ...

  8. matlab频域滤波处理,手动滤波,图像去网格背景:频域中手动选择目标区域进行滤波,滤掉噪声,灵活地达到理想的效果。

    目录 一.原理简介 二.现有方法 三.代码实现 四.测试结果图 一.原理简介 主要思路为:通过傅里叶变换,将图像显示在频率域中,通过观察频谱图,如果了解频谱图与原图之间的关联,可以较为容易地发现噪声在 ...

  9. 传统图像去噪方法(二)之引导滤波

    各向同性滤波 我们知道对于滤波器而言,在均值滤波中W时是1/n,n是w中所有像素个数.在高斯平滑中,W服从二维的高斯分布. 但是无论是均值滤波还是高斯滤波,他们都有一个共同的弱点,它们都属于各向同性滤 ...

  10. 图像处理之积分图应用二(快速边缘保留滤波算法)

    图像处理之积分图应用二(快速边缘保留滤波算法) 一:基本原理 传统的图像边缘保留滤波算法-如高斯双边模糊.Mean-Shift模糊等计算复杂.效率比较低,虽然有各种手段优化或者快速计算方法,当时算法相 ...

最新文章

  1. 两种方法可以达到背景图不缩放的效果
  2. [ARM异常]-ARMV8的中断的routing和Mask表
  3. 2015各地高温补贴发放标准时间一览表
  4. Android之okdownload下载提示奔溃Expected URL scheme ‘http‘ or ‘https‘ but was ‘data‘
  5. P5268-[SNOI2017]一个简单的询问【莫队】
  6. 排序算法(1) 快速排序 C++实现
  7. linux18.0.4安装mysql
  8. 信息奥赛一本通(1096:数字统计)
  9. JavaScript仿淘宝智能浮动
  10. 【推荐实践】推荐技术在旅游电商中的应用及挑战.pdf(附下载链接)
  11. necos 分布式配置中心 配置方法 动态修改值 切换生产环境
  12. word2016 图片去底灰_Word 2016 可以删除图片背景
  13. STM32F103的DAC实现播放WAV音乐
  14. html做一个条码扫描页面,vue h5页面如何实现扫一扫功能,扫条形码获取编码
  15. 驰骋BPM工作流后台常用接口与前台常用方法
  16. 如何发表一篇核心期刊论文
  17. 手机屏幕投到Windows系统
  18. 小程序内嵌二维码长按识别内测QA
  19. 工具篇:解压缩工具 tar
  20. 解决‘parent.relativePath‘ of POM xxx points at yyy instead of zzz please verify your project structure

热门文章

  1. mac上开发abp-zero(三) —— 代码调试篇
  2. 无法远程连接到计算机 凭证,远程连接凭据不工作如何处理_远程桌面连接提示凭据无法工作的解决教程-win7之家...
  3. 互联网计算机远程建立连接怎么回事,qq远程协助一直正在建立连接?最全分析解决方法送上!...
  4. 电脑使用android手机摄像头,电脑怎么使用安卓手机摄像头 电脑使用手机摄像头的方法...
  5. (CVPR 2019) GSPN: Generative Shape Proposal Network for 3D Instance Segmentation in Point Cloud
  6. Kotlin中问号 ? 和两个叹号 !! 的含义
  7. 中华第一考----系统架构设计师考试
  8. 新版本itunes如何设置iphone铃声
  9. Ubuntu: Firefox 的profile missing解决
  10. Arduino驱动HDC1080测量温湿度