来自 hg平台 2019-10-01 14:17 的文章

方块效应滤波器的结构设计

AVC/H.264 标准为新一代全球性互操作标准奠定了技术基础,得到了广播、电信、移动通信和流媒体等领域的广泛关注,在低码率传输中尤其表现突出。为了消除方块效应以获得最佳的主观视觉效果,H. 264标准引入了去方块滤波器。它是一种自适应滤波器,不会将真正的图像轮廓弄得模糊不清,同样也比普通的FIR滤波器要复杂很多。首先需要确定方块是什么原因造成的,粗燥的量化、相异的运动矢量还是真实轮廓。然后根据决策器选择不同类型的滤波器来维持真实轮廓的清晰度而减少方块效应产生的锐化效果。其中抽头个数,滤波器系数的设置以及阈值都是随编码方式的不同而各异的。   


方块效应产生的原因  

目前,基于块变换的编解码器已广泛应用于静态及动态图像的压缩技术中。在这些编解码器中,将图像像素分割成互不重叠的小方块,然后使用离散DCT变换对这些小方块的数据从空间域转换到频域,然后将所得的DCT系数进行量化、可变长编码。BDCT变换原理是利用图像的空间相关性,但是由于像素方块是当作单个整体并分别编码的,因此编码过程中并没有考虑到相邻块之间的相关性,从而在重建的图像中可能会看到方块边界。粗燥的量化也是造成方块效应的原因之一。尤其是当量化步长比较大时,有可能将原来相邻像素之灰度的连续变化演变成“台阶”变化,看起来就有“伪边界”的方块现象,影响人们的主观视觉感受。   

通过消除或减少方块现象,图像质量可以大幅度改善。当然增加传输带宽或提高码率可以获得更佳的图像质量,但是其代价比较昂贵。另一种方法就是提高退化图像的主观质量。为了获得高压缩率而使用BDCT变换,但必须减少随之产生的伪边界现象对人们主观感受的影响。这一过程就是“去除方块效应”(deblocking)。去方块效应就是在尽量使图像总能量保持不变的条件下,把这些“台阶”很高的阶跃型变化重新变成“台阶”很小或者近似连续的变化。  


算法  

在H.264/AVC编解码器中,去方块滤波器所处的位置是在反DCT变换之后。DCT变换采用的方块大小是4 4,运动估计时采用的最小块大小也是4 4,所以去方块效应滤波同样应用于大小为4 4的方块边缘。根据H.264/AVC,滤波顺序是按照宏块(microblock)顺序进行的,各个宏块的亮度、色度数据都要进行滤波。先从左至右对竖直边界进行滤波,随后从上至下对水平边界进行滤波,如图1所示。  

消除竖直边界上的伪边界现象时,参与滤波的有当前宏块的数据、其左侧宏块中与当前宏块相邻的四小块数据。同样的,消除水平边界上的伪边界现象时,参与滤波的有当前宏块的数据、其上方宏块中与当前宏块相邻的四小块数据。  


滤波过程是可选的,边缘强度(Boundary Strength,BS)的可能值为0、1、2、3、4。图2是用于确定 BS 的判决树。  

从边缘强度判决树的结构可以发现强度的大小主要取决于编码中产生的残差大小。帧内编码时由于帧内预测所涉及的参考像素相对较少,产生的残差通常比帧间编码要大。因此对残差变换量化后产生的误差就比较大,块边缘就有可能存在较强的虚假边界。此时 BS = 4 或3。而帧间预测相对比较准确,残差较小,所以边缘强度也较小。当运动搜索的时候找到完全一样的参考块时,残差的变换系数为0,此时相邻两个像素块如果使用的参考块在同一帧内并且也相邻,在解码后边界上就不会出现不连续的现象,因此不需要滤波,也就是 BS = 0 的情况。参考块不相邻则 BS=1。如果参考块和当前块并不完全相同时,变换系数不为 0,则BS = 0。色度块的边缘强度与亮度宏块中相应位置的边缘强度一致。  


图3是跨块边界像素图。对于每次滤波操作,位于边界两侧的八个像素 (p0,p1,p2,p3 及 q0,q1,q2,q3) 将输入到滤波器。  

只有当位于块边界两侧的采样数据同时满足以下四个条件时才进行滤波处理:其中 、 是与量化参数QP有关的阈值。当BS确定后,主要有两种类型的滤波处理过程。当0< BS <4时,一般情况下都会修改 p0、q0的值,而亮度块中的p1、q1可能会更改。当BS = 4时,滤波器可能是三抽头、四抽头或五抽头的。同时根据八个采样数据以及跟QP有关的一些参数,对不同位置上的像素分别应用不同抽头的滤波器。  


结构设计  

图4中,我们将整个宏块分割成大小为4 4的方块,亮度部分有16个,色度部分共有8个。并且整个宏块的所有数据(亮度、色度部分)分成三大部分,第一部分(I)是亮度模块的0-7块数据,第二部分(II)是亮度部分模块中的8-15块数据,第三部分(III)是色度模块的Cb、Cr数据。  


根据H.264视频标准中的描述,先进行跨竖直边界上的水平方向滤波,然后是跨水平边界上的竖直方向滤波,可以得到最基本的滤波顺序,如图5所示。  


反DCT变换后,每个像素的取值范围是0~255,可以按8位存储。将一小块同一行上四个像素的值拼接组合成一个32位的单元,正好可以存储于32位数据宽度的存储器并在32位的数据总线上传送。由前端反DCT变换模块输入至块效应消除模块RAM的空间大小为1688位,因此同时只有上述I、II、III部分中的一个部分数据可以存储到缓存区中供使用。  
考虑如果按照基本的滤波顺序运行去方块滤波程序时,没有充分利用相邻4 4数据之间的相关性,譬如完成“1”滤波后需要将其右侧方块的数据写回RAM中,等到要进行“5”之前再从RAM中读取将这个方块的数据。对于每一个方块都要从RAM中读取数据,完成滤波后还需要将数据写回至相应的地址,如此频繁读取RAM,对RAM的带宽要求比较高。因此提出了一种改进的滤波顺序,如图6所示。  


如果当前处理的是I部分数据,则依次执行序号为1 - 16号滤波过程;如果处理第II部分数据,则执行序号为17 - 32号滤波步骤;若处理色度模块数据即III部分时,则执行序号为33 - 40号滤波步骤。  
一般来说,每个4 4块会经过四次去方块滤波过程。采用改进的滤波顺序时,如果4 4块尚未完成所有的滤波处理,则这些块可以存储到一些buffer或寄存器中。例如:当执行完上图中的“1”后,不需要将右侧方块数据回送至RAM中而是先在buffer中暂存一下,以便在执行“2”时可以直接从buffer中读取。同样当执行完“2”后将左侧的数据存放至寄存器(RE)组中,右侧方块的数据替换buffer中的数据。这样做减少RAM的访问次数,可以提高整个滤波器模块的处理速度。  


图7中Luma_mem、chroma_mem、prediction_mem,output_mem均是采用32位数据线的RAM。Luma_mem、chroma_mem中分别存储当前处理宏块上方4行,左侧4列像素的亮度及色度数据。Prediction_mem中存储由前端预测模块输入至此的、位于当前宏块的一部分数据,也即前文中讲述的第I、第II或第III部分的数据。 而Output_mem中是用于存储经过滤波处理的输出数据,包括当前宏块上方四行、左侧四列数据及当前宏块数据。  

Get_strength模块的功能是按照H.264视频标准中的描述,根据相邻块与本块像素的编码方式等参数得出边界强度(BS)。Do_filter模块则是处理八个采样数据的滤波过程。 根据计算,完成整个宏块的去块效应滤波需要近500个周期,而不采用buffer及RE寄存器组的结构由于每次滤波都需要从RAM中读取数据,完成之后又需要将数据写回至RAM中,消耗了很多时钟周期在读写RAM上。可见结构设计具有一定的可行性。  


验证与仿真  

为了验证滤波器结构的正确性,已经在C 语言环境下进行了测试并通过。上述结构也将用硬件描述语言Verilog HDL代码加以实现并进行仿真。  


结论  

本文首先分析了动态图像中“虚假边缘”产生的原因,简单介绍H. 264标准中清除方块效应的算法,然后提出了一种用于实现该滤波器的大规模集成电路结构。这种结构充分利用相邻块数据之间的相关性,通过增加寄存器组暂存数据来减少对RAM的访问次数,从而可以提高该滤波器的运行速度。这种结构对H.264编解码器具有一定的实用价值。