Deblock的作用是消除块之间的明显的边界,也就是编码中产生的块效应,振铃效应等。对于AVC,DBK作用在4x4或者8x8块的边界。当宏块采用4x4变换的时候,DBK作用在4x4边界,对于每个宏块,有4条竖直边界和4条水平边界,一共8条边界。处理的顺序为先从左到右处理竖直边界,再从上到下依次处理每条水平边界,如图 1所示。当宏块采用8x8变换的时候,DBK作用在8x8边界,则只需要处理图 1中实线,竖直和水平各两条。
图 1 Deblock处理的边界
1.计算边界强度
在每个宏块进行去块滤波之前,需要进行边界强度BS的计算,后续根据边界强度来选择进行滤波的滤波器。BS计算的方式如表 1所示。
表 1 BS的计算方式
后续每条边界会根据边界的BS选择相应的滤波方式,总的来说,BS越大,需要的滤波强度也越大。BS=0的时候不滤波。
2.识别边界类型
在确定边界强度之后,对于bs非0的边界,还需要check边界的类型,这是因为边界有的可能是由于变换量化引起的假边界,而有的才是图像内原本就有的真边界。对于真边界,是不需要滤波的。所以这里需要将假边界识别出来进行滤波。假边界和真边界进行区分的依据:(1)假边界两侧的像素的差距比真边界更小;(2)假边界两边的块内部像素变化差距较小(不一定成立)。
具体而言,判断为需要滤波的边界需要满足如下条件:
图 2 块边界像素示意图
|p1 - p0| < β[IndexB]
|q1 - q0| < β[IndexB]),
BS != 0,
其中:
IndexA = Clip3( 0, 51, QPaverage + FilterOffsetA )
IndexB = Clip3( 0, 51, QPaverage + FilterQffsetB )
QPaverage = ( QPp+QPq+1) / 2
FilterOffsetA 和FilterOffsetB 偏移量默认为0,也可以在slice级别指定,从而进行特别的优化。通过传递负的偏移以减少滤波强度,可以有助于小的空间细节的逼真度,特别是高分辨率的视频内容,因为这时小的方块效应不容易被觉察。相反,采用正的偏移以增加滤波强度,可以去除默认表所不能滤除的方块效应,增加图像主观质量。这有助于平滑过渡的低分辨率内容的亮度块情况,去除可能由次优的运动估计、模式选择或残差编码引起的额外方块。α和β计算的方式和QP有关,具体如表 2所示。
表 2 α和β和index对应的索引表
3.对于满足1中BS在1到4之间和2中的假边界进行滤波
(1)对于Bs=4的边界,
如果满足|p2-p0|<β[indexB]和|p0-q0|<α/4+2,则需要对p0,p1和p2进行滤波,滤波方法为
p1=(p2+p1+p0+q0+2)/4
p2=(2*p3+3*p2+p1+p0+q0+4)/8
否则只滤波p0,滤波方法为
类似的,如果满足|q2-q0|<β[indexB]和|p0-q0|<α/4+2,则需要对q0,q1和q2进行滤波,滤波方法为
q1=(q2+q1+q0+p0+2)/4
q2=(2*q3+3*q2+q1+q0+p0+4)/8
否则只滤波q0,滤波方法为
q0=(2*q1+q0+p1+2)/4
(2)对于Bs为1-3强度的边界,滤波方法为:
第1,对p0和q0滤波.
p0=clip3(0, 255, p0+delta)
q0=clip3(0, 255, q0-delta)
delta的计算方式
delta = clip3(-tc, tc, (4*(q0-p0)+(p1-q1)+4)/8)
表 3 滤波时对像素clip的阈值推导
tc的计算方法为:首先根据indexA和BS的值查询表 3,获得阈值tc0 。对于亮度tc = tc0+(|p2-p0|<β[indexB])+( |q2-q0|<β[indexB]), |p2-p0|或者|q2-q0|小于阈值说明说明边界两边内部的变化强度小于b阈值,需要对边界进行更强的滤波。对于色度tc=tc0+1
第2,|p2-p0|<β[indexB]满足时,还需要对p1进行滤波,滤波方法为
delta = ((p0+q0+1)/2+p2)/2-p1
delta = clip3(-tc0, tc0, delta)
p1=p1+delta
第3,|q2-q0|<β[indexB]满足时,对q1进行滤波,滤波方法为
delta = ((p0+q0+1)/2+q2)/2-q1
delta = clip3(-tc0, tc0, delta)
q1=q1+delta