您的位置:首页 > 其它

HEVC之-------sample adaptive offset(SAO)

2014-10-30 21:23 190 查看
1.视频压缩的路滤波

原因:因为视频中采用基于块的压缩变换,帧间预测采用了分数域(需要插值,滤波器长度为8),量化引起信息的损失都可以引起块效应,闪烁,抖动,造成视觉的不连贯。因为得到的重建帧将做为下一帧的参考图像,直接影响了后续帧的编码的码流。对于重建图像进行滤波,以提高重建图像的质量就显的十分的重要。

2.SAO:一共分为两个部分:边缘补偿

(edge offset) 和条带补偿(band offset)

   2.1 边缘补偿

   下图是吉布斯现象,其中虚线是视频的初始像素值,实点为重建后的像素值。因为视频压缩导致了高频信息的丢失,而引起了吉布斯现象,导致了重建像素以原始值成上下波动。这样出现了振铃效应,边缘补偿的目的就是让这些上下波动的像素,尽量的靠近原始值。例如图中的红点 给他一个负的offset,让他接近原始值。

   

    具体的做法:(1)根据邻近的像素(如下图2)的大小关系 ,这里采用了四个方向的邻近像素,可以看做着四个方向上都有可能发生了吉布斯效应。我们队其分类的原因是找到看哪个方向上发生了吉布斯效应,即上下波动。

                             (2) 将当前的像素分成5类(如图3)。主要是用来判断波动的类型。如第一个小图,如果c是向上波动的,即C的值大于b和a(第四类), 那么我们给c 一个负的补偿值(红色矩形)。如果向下波动的,即C的值小于b 和a (第一类),那么我们给c一个正的补偿值(红色圈圈)。于是就有了示意图4。

2.2 条带补偿

      基本做法:视频编码可以看做是原始像素和重建后的像素的一个映射。由于有了位置的信息,我们不能将每一位置的原始值和重建像素值告诉解码器。(没必要,这不是成了无失真了)但是,在同一个LCU里,不同像素位置的具有相同的像素值(p)的所有像素经过了相同的一个函数(编码器)映射得到的值(Fp)。SAO的做法是传递p和这个Fp的差值,来进行补偿。

  条带补偿之所以叫条带的原因是 将0~255 共 265个像素值,分成了32区间,一个band 有8个像素。编码器只传递4个条带的补偿值同时需要指明第一个条带是哪一个条带。具体如下图

3. SAO 的句法结构的设计

sao_merge_left_flag: 因为相邻的CTB之间的SAO的参数很有可能相同,这个句法元素就是用来指明是否用左侧的CTB的SAO的参数。同理sao_merge_up_flag

sao_type_idx:SAO的类型,一共有6种类型,其中边缘补偿有5类+条带补偿。

sao_offset_abs[i]:如果是边缘补偿,该值传递的是四种类型的边缘的补偿值;如果是条带补偿传递四个条带的补偿值(知道为啥4个条带了吧)

sao_offset_sign:这个是专门为条带补偿设计的。因为边界补偿的四种类型的补偿的正负是知道的。这个语法就是条带补偿值的符号。

4.HEVC的实现

4.1 入口点函数

Void TEncSampleAdaptiveOffset::SAOProcess(TComPic* pPic, Bool* sliceEnabled, const Double *lambdas)


这个函数中



可以看出来SAO是编码完整个图像,而每个SAO的参数是基于一个CTU的。

进入decideBlkParams函数之前先看几个结构:





进入该函数的核心:







结构很清晰,第一层循环是关于CTB的

第二层循环是使用选择使用左上merge的SAO参数,还是使用自己的参数。在这层循环里有个modecost<mincost,可见是通过比较cost的大小来决定是否用merge的SAO参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: