十八去块滤波器
Posted 叮咚咕噜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了十八去块滤波器相关的知识,希望对你有一定的参考价值。
一、去块滤波器基本原理
1.1去块滤波的作用
- 去块滤波器(Deblocking Filter)是视频编解码器中的重要组成部分
- 核心作用在于消除编码过程中产生的图像块效应
- 提升整体视觉主观体验,否则编码再解码的数据看起来就上罩了一层铁丝网一样
1.2块效应的产生
图像中的块效应主要因为以宏块为基本单元的编码结构而产生。在编码中,每个宏块的子块都会按照既定分割方式进行预测、变换和量化编码,在这个过程中可能导致块效应的因素主要有以下几种:
- 由于变换和量化编码的运算精度误差导致边界出现不连续
- 由于码率设置较低,量化强度较大,或者相邻宏块的量化参数不一致导致重建图像的细节部分产生差异
- 由于运动补偿时的参考块位置与当前块位置关系不一致导致重建像素的内容实际上缺乏相关性
1.3去块滤波的定义
- 在H.264的标准文档中,去块滤波器定义在8.7节中。在H.264的以下profile中,去块滤波是必要的组成部分:
- Baseline, Constrained Baseline, Main, Extended, High, High 10, High 4:2:2, High 4:4:4 Predictive;
- 在以下profile中,去块滤波器推荐而不强制使用:
- High 10 Intra, High 4:2:2 Intra, High 4:4:4 Intra, CAVLC 4:4:4 iNTRA;
在H.264帧解码的过程中,去块滤波器在该帧所有宏块的解码像素数据重建完成之后进行。在执行中,该过程按照宏块地址的顺序(即:逐行操作),对所有的NxN分割模式的宏块的像素块分割边界分别进行(对宏块的边沿和子块的边沿,分别进行去块滤波的操作),其中不包括整个图像的边界以及被标志值disable_deblocking_filter_idc所禁用的边界。
二、去块滤波的执行过程
2.1基本概念
- 去块滤波对于每一个宏块的亮度和色度分量分别进行
- 对于宏块的每一个分量的滤波过程分为两个方向:
- 垂直方向:垂直方向的滤波从左向右进行
- 水平方向:水平方向的滤波从上向下进行
- 在水平和垂直两方向上,待滤波的块边沿分为两类:
- 半宏块
- 1/4宏块:垂直或水平方向进行1/4等分
上图整体表示一个16 * 16的宏块,每个小框表示的是子块,左边表示垂直方向的边沿,右边表示水平方向的边沿,实线表示半宏块的边沿,虚线表示1/4宏块的边沿。
对于亮度/色度以及不同的参数设置,去块滤波操作的边沿不同。对于亮度分量,根据transform_size_8x8_flag(宏块信息中)的值判断:
- 如果transform_size_8x8_flag为0,即采用4×4尺寸变换,对实线和虚线的边沿进行滤波;
- 如果transform_size_8x8_flag为1,即采用8×8尺寸变换,只对实线的块边沿进行滤波;
对于色度分量,只考虑4:2:0格式,只对半宏块边沿即实线部分进行滤波。
2.2宏块去块滤波的过程
- 确定当前宏块的邻域有效性:当前是否存在相邻的像素或者宏块
- 获取几个关键的标识参数:
- fieldMbInFrameFlag:只考虑帧编码,该值应为0;
- filterInternalEdgesFlag:如果当前slice中的disable_deblocking_filter_idc的值设为0,则该flag为1;反之为0;
- filterLeftMbEdgeFlag:如果当前slice中的disable_deblocking_filter_idc设为1,或disable_deblocking_filter_idc设为2而且该宏块不可得,或宏块为图像的左侧边沿宏块,则该flag设为0;反之设为1;
- 如果当前slice中的disable_deblocking_filter_idc设为1,或disable_deblocking_filter_idc设为2而且该宏块不可得,或宏块为图像的上方边沿宏块,则该flag设为0;反之设为1;
- 根据上述关键标识参数执行滤波过程
- 左宏块边沿滤波
- 上宏块边沿滤波
- 内部块边沿滤波:水平方向and垂直方向
三、滤波边界像素
如何针对某一条待滤波的块边沿,进行某一个像素点位置的滤波操作,针对边界滤波强度不同的像素点,采用的方法也相应不同。滤波过程修改的像素值包括边界两边的相邻像素以及分别向两个方向扩展两个的像素值,即根据边界左右对称的6个相邻像素。
- 滤波边界像素通过边界上某个点两侧的8个参考像素,滤波其中的若干个像素值
- 定义于标准的8.7.2.3节
- 对于滤波每一个像素点的方法,根据滤波强度为3或4,当前数据属于亮度或色度分量不同
3.1滤波强度为4的边界点(亮度):
- 左侧(垂直边沿)或上方的三个像素
- p′0 =(p2 +2p1 +2p0 +2*q0 +q1 +4)>>3
- p′1 =(p2 +p1 +p0 +q0 +2)>>2
- p′2 =(2p3 +3p2 +p1 +p0 +q0 +4)>>3
- 右侧或下方的三个滤波后像素的计算方法为:
- q′0 =(p1 +2p0 +2q0 +2*q1 +q2 +4)>>3
- q′1 =(p0 +q0 +q1 +q2 +2)>>2
- q′2 =(2q3 +3q2 +q1 +q0 +p0 +4)>>3
3.2滤波强度为4的边界点(色度)
修改的为左右两边相邻的两个像素点
- 左侧或上方的三个滤波后像素的计算方法为:
- p′0 =(2*p1 +p0 +q1 +2)>>2
- p′1 = p1
- p′2 = p2
- 右侧或下方的三个滤波后像素的计算方法为:
- q′0 =(2*q1 +q0 +p1 +2)>>2
- q′1 = q1
- q′2 = q2
3.3
- 滤波强度为3的像素点(即内部块边沿),采用的滤波方法略复杂:
- 依据上面获得的indexA和边界滤波强度查表获得C0值,该值由标准文档中的表8-17获得
- 获取参考像素的二级差分值:
ap =Abs(p2 −p0 ) //差值求绝对值,反应像素值的变化剧烈程度
aq =Abs(q2 −q0 )
- 计算阈值变量tc:
亮度:tC =tC0 +((ap <β)?1:0)+((aq <β)?1:0)
色度:tC =tC0 +1
- 计算边界相邻像素:
Δ =Clip3(−tC,tC,((((q0 −p0 )<<2)+(p1 −q1 )+4)>>3)) p′0 = Clip1( p0 + Δ )
q′0 = Clip1( q0 − Δ )
- 对亮度分量,p1/q1的推导方式为:
p′1 =p1 +Clip3(−tC0,tC0,(p2 +((p0 +q0 +1)>>1)−(p1 <<1)) >> 1)
q′1 =q1 +Clip3(−tC0,tC0,(q2 +((p0 +q0 +1)>>1)−(q1 <<1)) >> 1)
其它,p2/q2以及色度分量的p1/q1/p2/q2像素维持原值不变。
以上是关于十八去块滤波器的主要内容,如果未能解决你的问题,请参考以下文章
H.264/AVC视频编解码技术详解二十H.264的去块滤波算法