H.265/HEVC —— 帧内预测

在H.265/HEVC中,35种预测模式是在PU的基础上定义的,而具体帧内预测过程的实现则是以TU为单位的。编撰规定PU可以以四叉树的形式划分TU,且一个PU内所有TU共享同一种预测模式的形式划分TU,且一个PU内的所有TU共享同一种预测模式。H.265/HEVC帧内预测可分为以下3个步骤:
**
1.判断当前TU相邻参考像素是否可用并做相应的处理
2.对参考像素进行滤波
3.根据滤波后的参考像素计算当前TU的预测像素值
**


1.相邻参考像素的获取

如图,当前的TU大小为NxN,其参考像素按区域可分为5部分:左下(A)、左侧(B)、左上(C)、上方(D)和右上(E),一共4N+1个点。若当前TU位于图像边界,或Slice、Tile的边界(H.265/HEVC规定在帧内编码中,相邻Slice或Tile不能相互参考),则相邻参考像素可能会不存在或不可用。另外,在某些情形下A或E所在的块可能尚未进行编码,此时这些参考像素也是不可用的。

相邻参考像素位置

当参考像素不存在或不可用时,H.265/HEVC标准会使用最邻近的像素进行填充。例如,若区域A的参考像素不存在,则区域A所有参考像素都用区域B最下方的像素进行填充;若区域E的参考像素不存在,则区域E所有参考像素都用D最右侧的像素进行填充。需要说明的是,若所有参考像素都不可用,则参考像素都用固定值填充,该固定值大小为

                                         R = 1 << (BitDepth -1)

源码解析:
fillReferenceSamples这个函数,它主要功能是在真正进行帧内预测之前,使用重建后的Yuv图像对当前PU的相邻样点进行赋值,为接下来进行的角度预测提供参考样点值。
源码解析可以参考:http://blog.csdn.net/hevc_cjl/article/details/8175721

帧内预测一个很重要的函数initAdiPattern,它的主要功能有三个,(1)检测当前PU的相邻样点包括左上、上、右上、左、左下邻域样点值的可用性,或者说检查这些点是否存在;(2)参考样点的替换过程,主要实现的是JCTVC-J1003即draft 8.4.4.2.2的内容,主要由函数fillReferenceSamples来完成;(3)相邻样点即参考样点的平滑滤波,主要实现draft 8.4.4.2.3的内容。
源码解析可以参考:http://blog.csdn.net/HEVC_CJL/article/details/8184276


2.参考像素的滤波

1.不同大小TU需要进行参考像素滤波的模式
DC模式以及4x4大小的TU都不需要进行参考像素滤波。其他情形介绍如下:
32x32TU:除了模式10(水平)、模式26(垂直)之外的所有角度模式以及Planar模式。
16x16TU:在32x32TU的基础上进一步出去最接近水平个垂直方向的4个模式——模式9、11、25、27
8x8TU:仅对3个45度倾斜方向的模式(模式2、18、34)以及Planar模式进行参考像素滤波。

2.常规滤波与强滤波方法
这部分就是需要满足几个条件进行常规滤波或者强滤波。


2.预测像素的计算

与h.264/avc相比,h.265/hevc增加使用了左下方块的边界像素作为当前块的参考。这是由于h.264/avc以固定大小的宏块为单元进行编码,在对当前块进行帧内预测时,其左下方块很有可能尚未进行编码,无法用于参考;而h.265/hevc四叉树形的编码结构使得这一区域成为可用像素。此外,这一区域像素的使用也提供了更多可能的预测方向,在某些情形下(如倾斜向上方向的纹理等)能够大幅度提高预测精度。

h.264 4x4 luma prediction modes

h.265/hevc 帧内参考示意图


H.265/HEVC亮度分量帧内预测支持5种大小的PU: 4x4, 8x8, 16x16, 32x32, 64x64
每一种大小的PU都有35种预测模式:
1. Planar模式
2. DC 模式
3. 33种角度模式
所有预测模式都使用相同的模板。


1.Planar模式(解决渐变式的平滑纹理区域)

Planar模式是由H.264/AVC中的Plane模式发展而来的,它适用于图像值缓慢变化的区域。Planar模式使用水平和垂直方向的两个线性滤波器,并将二者的平均值作为当前块像素的预测值。

帧内Planar模式预测

a)对应像素的计算公式 b)其计算效果图


2.DC模式(适用于大面积平坦区域)

DC模式适用于大面积平坦区域,其做法与H.264/AVC基本相同。当前块预测值可由其左侧和上方(注意不包含左上角、左上方和右上方)参考像素的平均值得到。

在4X4的非边缘块,即蓝色透明部分


3.角度模式

H.264/AVC使用了8中不同的预测方向(4x4大小),H.265/HEVC则进一步细化了这些预测方向,规定了33种角度预测模式,以更好地适应视频内容种不同方向的纹理。

下图给出了33种角度模式的具体方向,其中V0(模式26)和H0(模式10)分别表示为垂直和水平方向,其余模式的预测方向都可以看成再垂直或水平方向上做了一个偏移,该偏移角的大小可由模式下方的数字计算得出。

33种角度模式的预测方向

θ 为正表示预测方向向左偏移,θ为负表示预测方向向右偏移;对于水平类模式,θ为正表示预测方向向上偏移,θ为负表示预测方向向下偏移。

对于模式1125,当前块的预测需要同时用到上方和左侧的参考像素。为了能够使用一种统一的形式来计算预测像素值,H.264/HEVC标准采用了一种“投影像素”的方法,对于模式1825(垂直类模式),须将左侧参考像素按给定方向偷影至上方参考像素的左侧(水平排列),而对于模式11~17(水平类模式),须将上方参考像素按给定方向投影至左侧参考像素的上方(垂直排列)。


step:

  1. 对于给定垂直类模式M,使用“投影像素”法将其需要用到的参考像素映射为一维形式,记为Ref.
    2.计算当前像素对应参考像素的Ref中的位置,记为pos:
    pos = (y* offset[M]) >> 5
    3.计算当前像素对应参考像素的加权因子w:
    w = (y * offset[M]) & 31
    其中,&表示按位与运算。
    4.计算当前像素的预测值:
    Px,y = ((32-w)Ref[pos]+wRef[pos+1]+16)>>5
    需要注意的是,对于模式26(垂直模式),预测像素值改由下式计算:
    Px,y = Rx,o +((Ro,y - Ro,o) >> 0)

源码解析:
HM中TComPrediction.cpp文件下有以上模式的函数,具体的解析可以参考:
http://blog.csdn.net/hevc_cjl/article/details/8175721
http://blog.csdn.net/hevc_cjl/article/details/8184276
http://blog.csdn.net/hevc_cjl/article/details/8200793
http://blog.csdn.net/hevc_cjl/article/details/8216065
http://blog.csdn.net/hevc_cjl/article/details/8259844
http://blog.csdn.net/hevc_cjl/article/details/8259844

TComPrediction.cpp



作者:Persistently
链接:https://www.jianshu.com/p/d19d7eb3844a
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自blog.csdn.net/huangyifei_1111/article/details/84248118