H264解码——Deblocking Filter

1.简介

1.1何为宏块效应

视频图像有些小方块边界呈现不连续的情况;如下图所示:
宏块效应

1.2宏块效应出现的原因

  • 宏块残差值的变换系数经过量化后丢失图像细节,特别是低码率情况下会更加明显;
  • 帧间预测的运动估计:相邻块选取的参考帧或者参考块不是连续的,所以在运动补偿后,可能会引入边界效应;

1.3边界的定义

1)H264标准中,宏块的定义为16x16像素块;而变换的基本单位为4x4;故宏块内部边界如下图中的2、3、4(垂直边界);6、7、8(水平边界)所示;对于YUV420来说,Cb、Cr同理;
边界说明
另外上图中还存在 最上边1(Top MB Edge) 以及 最左边5(Left MB Edge);区别是这两条边界消除时依赖相邻宏块;但原理一致。
2)消除顺序:
按照先垂直后水平,先左后右,先上后下的原则;故图中Y分量的消除顺序为:1、2、3、4、5、6、7、8

1.4 真假边界

  • 真边界:实际图像中确实存在的边界;
  • 假边界:因为变换或者运动估计引入的边界;

真假边界消除的原理:

  • 真边界的两边像素的差值通常较大;
  • 即使真边界的两边像素差值不大,被误判断为假边界进行消除;那么对其主观影响不大

2.宏块消除

2.1 宏块消除思想

使用相邻像素进行“均值”运算来替换边界值

2.2 边界强度

区分边界强度的原因是:根据不同的边界强度,会采用不同的边界像素值计算方法。

判断条件边界强度BS
边界为宏块边缘,且边界两边块有一个块为帧内预测4
边界两边块有一个块为帧内预测3
边界两边块有一个块的变换系数包含非零系数2
边界两边块有一个块的变换系数不包含非零系数;并且边界两边块的参考帧或运动向量数目(前后向)不同1
边界两边块有一个块的变换系数不包含非零系数;并且边界两边块的参考帧或运动向量数目(前后向)相同0

2.3 真假边界的区分

根据真假边界的两个假设,H264标准设定两个阈值α和β用来判定真假边界。为了便于说明,我们假设判定的边界如下图红线所示。
边界
H264 Spec规定如下三个条件都满足时,才判定为虚假边界,才需要Deblocking;任一条件不满足,则认为为真实边界,无需Deblocking。

/*判断真假边界公式*/
|p0 - q0| < α[IndexA]
|p1 - p0| < β[IndexB]
|q1 - q0| < β[IndexB]
/*
 *其中p0、p1、q0、q1为上图中的像素点值;
 *IndexA = Clip3( 0, 51, QPave + FilterOffsetA )
 *IndexB = Clip3( 0, 51, QPave + FilterOffsetB)
 *QPave = (qPp + qPq +1) >> 1;qPp,qPq为q0、p0的量化值;
 *FilterOffsetA = slice_alpha_c0_offset_div2 << 1
 *FilterOffsetB = slice_beta_c0_offset_div2 << 1
 *- slice_alpha_c0_offset_div2, slice_beta_c0_offset_div2为Slice 
    Header中语法;取值应[-6, +6],默认为0;
 *- α、β值通过IndexA以及IndexB查表得到,如下表所示。
 *- clip3(a, b, c): a,c为上下限,若a < b < c,则返回b, 否则取上下限的值
*/

α以及β表

2.4滤波运算

首先声明t’c0,t’c0也是查表得到,如下表所示:
t'c0表1t'c0表2

2.4.1 BS < 4的边界滤波

/*Deblocking filter*/
/*bS < 4 */
tc0 = t'c0 * (1 << (BitDepth - 8));  /*BitDepth = (chromaEdgeFlag == 0 ) ? BitDepthy: BitDepthc*/

ap = Abs( p2 -p0 );       
aq = Abs( q2 -q0 );

tC = (chromaEdgeFlag == 0 ) ? ( tC0 + ( (ap<β) 1 : 0 ) + ( ( aq <β) ? 1 : 0 ) : (tC0 + 1);
Δ = Clip3(-tC, tC, ( (q0-p0)<<2 + (p1-q1) + 4 ) >> 3);

p0_de = Clip3(0, (1 << BitDepth) -1, p0 + Δ);//p0点Deblocking后值
q0_de = Clip3(0, (1 << BitDepth) -1, q0 - Δ);//q0点Deblocking后值

if (chromaEdgeFlag == 0 && ap < β)
{
    p1_de = p1 + Clip3(-tC0, tC0, (p2 + ((p0+q0+1)>>1)(p1<<1)) >> 1);//p1点Deblocking后值
    q1_de = q1 + Clip3(-tC0, tC0, (q2 + ((p0+q0+1)>>1)(q1<<1)) >> 1);//p1点Deblocking后值
}
else
{
    p1_de = p1;
    q1_de = q1;
}
p2_de = p2;
q2_de = q2;

2.4.2 BS == 4的边界滤波

/*Deblocking filter*/
/*bS == 4*/
if (chromaEdgeFlag == 0 && (ap < β) && (Abs(p0-q0) < ((a >> 2)+ 2))))
{
    p0_de = (p2 + 2*p1 + 2*p0 + 2*q0 + q1 + 4) >> 3;
    p1_de = (p2 + p1 + p0 + q0 + 2) >> 2;
    p2_de = (2*p3 + 3p2 + p1 +p0 + q0 +4) >> 3;
    q0_de = (q2 + 2*q1 + 2*q0 + 2*p0 + p1 + 4) >> 3;
    q1_de = (q2 + q1 + q0 + p0 + 2) >> 2;
    q2_de = (2*q3 + 3q2 +q1 +q0 + p0 +4) >> 3;
}
else
{
    p0_de = (2*p1 + p0+ q1 + 2) >> 2;
    p1_de = p1
    p2_de = p2;
    q0_de = (2*q1 + q0+ p1 + 2) >> 2;
    q1_de = q1;
    q2_de = q2;
}

3.附

3.1 环内滤波比后置滤波的优势

  • 环内滤波:编码端的图像重构过程中加入的滤波器,其要求解码端的滤波方式应采用相同的滤波过程;
  • 后置滤波:仅在解码端送显前添加的滤波过程;注意经过后置滤波过后的图像不能作为参考帧;

优势

  1. 环内滤波具有自适应性

能够适应不同的边界/获得不同的水平的图像质量

  1. 提高编码的效果及效率

环内的滤波后的重构图像作为后续图像编码的参考,可以提高更好的预测;从而可以避免因为量化导致的失真扩散,也可以提高编码的效率。

  1. 在解码端无需增加格外的帧缓存

我们知道后置滤波后的图像无法作为参考帧,故滤波前以及滤波后都需要帧缓存;而环内滤波则不需要

3.2 环内滤波自适应的理解

  1. 片级

H.264 Spec中在Slice Header中定义了α和β的偏移值;
负的偏移值可以减少滤波强度,有助于改善小的空间细节逼真度;
正的偏移值可以增加滤波强度,消除较强的方块效应

  1. 图像块边界级

滤波会根据“边界强度(Bs)”来选择不同强度的滤波算法

  1. 图像样点级

样点值以及量化参数相关的阈值可以决定是否需要对样点进行滤波

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值