织梦CMS - 轻松建站从此开始!

罗索

MVC学习的第九周小结(2009.7.6-2009.7.12)-deblocking,CABAC

jackyhwei 发布于 2010-01-28 21:26 点击:次 
In-loop Deblocking Filter是在H.264中采取的编码环路去方块滤波器,其作用是改善图像的主客观质量,区分图像的真实边界和编码人为引入的边界,并滤除后者。
TAG:

1. 去方块滤波

In-loop Deblocking Filter是在H.264中采取的编码环路去方块滤波器,其作用是改善图像的主客观质量,区分图像的真实边界和编码人为引入的边界,并滤除后者。视频图像的块效应来自两个方面:首先是基于块的帧内帧间预测残差的DCT和量化过程引入的误差,造成了图像块边界视觉不连续。其次是来源于不同参考帧的运动估计,造成边界数据不连续。【1】对图像的去方块滤波是在输出重构帧之前进行的,对编解码器都一样。

在JMVC编码部分的具体代码中,PicEncoder::xEncodePicture()编好slice数据之后,会调用PicEncoder::xFinishPicture(),在这个函数里,将会调用去方块化过程m_pcLoopFilter->process(),m_pcLoopFilter是LoopFilter类对象,实现具体的deblocking逻辑。在【2】中已经对整个环路去方块滤波器做了很好的总结。现在结合【1】【2】的知识来说一下大概原理,具体的运算是基于4x4块的每个像素点,要分别处理亮度快和色度块里的垂直和水平边界,这里只以亮度为例。下图一说明了宏块内边界情况,图2进一步把边界精确地一行或一列像素点。
 

图3展示了根据不同编码模式确定滤波器强度(bs,boundary strength )的流程图,滤波器强度将决定采取不同的公式做具体滤波,具体过程见下图4。那些具体的几抽头公式可以参考【1】或H.264标准文档8.7节。
 

在图4中,除了bs外,还可以看到流程图的判断条件中有alpha,beta等和像素点差值比较的阈值。这些阈值是根据经验公式与QP及其偏移值联系起来的,QP反应了像素点量化失真引入的块效应,而偏移值用于反应slice级的优化需求,其将在语法slice_header()的slice_alpha_c0_offset_div2和slice_beta_offset_div2中被定义传送。

讨论清楚这些理论知识后,再看看代码实现。在类LoopFilter中通过重载方法LoopFilter::process()实现滤波的逻辑过程,它根据参数个数的不同被编码器或解码器调用。分析一下编码端的函数,也就是参数比较多的那个,该函数对输入图像的每个宏块进行循环,按当前代码,会去执行LoopFilter::xFilterMb(),xFilterMb()里分为计算bs和滤波两部分,都是分别对水平和垂直进行操作。这里的各函数逻辑清晰,按图3类型计算bs存放在m_aaaucBs[][][]的数组中,然后在滤波的时候,逐行并逐列按图4计算对现有像素点的调整值。特意追踪了一下理论分析提到的QP偏移值,他们是在配置文件中可以被设置的,缺省值为0。

2.CABAC

cabac毕竟复杂的熵编码方式,上周写了一些基本的认识以后,一直觉得还有必要深入探讨。cabac的相关知识还可以参考【3】的相关章节,它的编码步骤如图5所示:

                                                          figure 5


按照图5,结合【3】和本人的理解一步步的分析:

(1) 输入数据的二值化(Binarization)

根据【4】的9.3.2节,或其他H.264标准文档相应章节,编码器将首先对输入cabac的语法元素进行二值化预编码。9.3.2.1 到 9.3.2.4 节规定了一元(U)二值化过程,舍位一元(TU) 二值化过程,串联一元/ k 阶顺序Exp-Golomb(UEGk) 二值化过程和固定长度(FL)二值化过程。其他二值化过程见9.3.2.5到 9.3.2.7。【4】不同的语法元素按协议使用相关的二值化方式,通过这个预编码过程,可以得到MPS概率高的输出比特流。

MPS(most probability Symbol和LPS(least probability Symbol)分别表示字符出现的高低概率,根据算术编码原理,出现更多的MPS字符可以提高压缩概率。具体的算术编码原理举例看【5】69页开始的例子。

(2) 上下文模型

根据【3】,CABAC的上下文模型特点是:由邻近符号组成的有限模板被构成不同的上下文模型,而这些上下文模型对应于选定的二进制符号。上下文模型根据语法元素类型可以分为四类:

  • MVD其邻块(上,左宏块)的上下文编码,相关过程可以看JMVC代码的CabacWriter::xWriteMvd(),通过邻宏块绝对值的和ek与比特的序号来判定选择的上下文模式,如下表:
  • mb_type和sub_mb_type的上下文模型,根据【3】464页的树结构来决定。
  • 第三种模型仅用于残差编码,不依赖于历史数据,只有字节的扫描顺序决定
  • 第四种模型也仅用于残差编码,用于DCT和量化后的系数提取,根据累计的编码值是否大于1(大多数是0)来决定上下文。公式是【3】的9-16和9-17

把以上四种模型总结成【4】的“表9-11-所有条带类型初始化过程所需的ctxIdx和语法元素联合列表”。

(3) 二进制算术编码

根据【1】和【5】的知识,可以知道:算术编码的思想是用一个[0,1)区间中的数来编码一个字符输入码流,它将逐个输入码流字符,根据字符概率来递归确定区间。所以其中必要的状态值是:(1)当前区间下限L(2)当前区间大小R(3)当前字符(4)各字符概率。每个区间计算结束后,要把当前字符算入概率表中作为更新。由于更新概率表的浮点乘法运算复杂度高,所以实际运算中以查表代替。

在0-0.5范围内定义64个值作为LPS字符对应概率,MPS值是1-Plps,由于是二进制编码,实际上,只对0,1作用,所以又可能0对应于LPS而此时1对用MPS。那么四个状态值基于此模式等价于:(1)当前区间下限L(2)当前区间大小R(3)当前MPS字符(4)LPS概率编号。


通过以上公式,可以根据语法元素每比特的上下文模型索引ctxIdx查表得到的m和n来求valMPS和pStateIdx,就是上面的(3)和(4)。加上对乘法运算的优化,CABAC根据如下流程图运行:

 

 

写到这里,至少我自己已经理解清楚了CABAC,一些具体的例子可以参照【6】和上周小结的一些资料。至此对JMVC的第一阶段学习小结结束了,对各模块都分析走过一遍,由于对视差预测的优化没有在当前JMVC运用,代码有很大的算法优化空间,等对视觉和标准做一段时间的酝酿,确定感兴趣的主题,再继续开展第二阶段学习探讨。

【参考文献】

1. 毕厚杰,“新一代视频压缩编码标准:H.264/AVC”

2. Gulistan Raja1and Muhammad Javed Mirza2,“In-loop Deblocking Filter for H.264/AVC Video”

3. Hari Kalva,“The VC-1 and H.264 Video Compression Standards for Broadband Video Services”

4. “H.264官方中文文档2005”

5. Iain E. G. Richardson, "H.264 and MPEG-4 Video Compression"

6. Detlev Marpe, Member, IEEE, Heiko Schwarz, and Thomas Wiegand,Context-Based Adaptive Binary Arithmetic Coding in the H.264/AVC Video Compression Standard”

(jacky)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201001/8434.html]
本文出处:网络博客 作者:jacky
顶一下
(1)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容