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也是查表得到,如下表所示:
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 环内滤波比后置滤波的优势
- 环内滤波:编码端的图像重构过程中加入的滤波器,其要求解码端的滤波方式应采用相同的滤波过程;
- 后置滤波:仅在解码端送显前添加的滤波过程;注意经过后置滤波过后的图像不能作为参考帧;
优势:
- 环内滤波具有自适应性
能够适应不同的边界/获得不同的水平的图像质量
- 提高编码的效果及效率
环内的滤波后的重构图像作为后续图像编码的参考,可以提高更好的预测;从而可以避免因为量化导致的失真扩散,也可以提高编码的效率。
- 在解码端无需增加格外的帧缓存
我们知道后置滤波后的图像无法作为参考帧,故滤波前以及滤波后都需要帧缓存;而环内滤波则不需要
3.2 环内滤波自适应的理解
- 片级
H.264 Spec中在Slice Header中定义了α和β的偏移值;
负的偏移值可以减少滤波强度,有助于改善小的空间细节逼真度;
正的偏移值可以增加滤波强度,消除较强的方块效应
- 图像块边界级
滤波会根据“边界强度(Bs)”来选择不同强度的滤波算法
- 图像样点级
样点值以及量化参数相关的阈值可以决定是否需要对样点进行滤波