HEVC的帧内预测共有35中预测模式,模式编号分别对应为:
帧内模式编号 |
帧内预测模式名称 |
0 |
Planar模式 |
1 |
DC模式 |
2~34 |
33种角度预测模式 |
理论上,HEVC的帧内预测可以分为三个步骤:
1、判断当前TU相邻参考像素是否可用,获取相邻参考像素;
2、对参考像素进行滤波;
3、根据滤波后的参考像素以及预测模式,计算当前TU的预测像素值。
在代码实现中,这几部分分别对应,如以下的流程图所示:
函数initAndiPatternChType()实现以下第一部分与第二部分功能。
第一部分:判断相邻像素是否可用并根据一定规则获取像素值
当前TU的大小为NxN,其参考像素按区域可分为5部分,左下侧(A)、左侧(B)、右上侧(C)、上侧(D)、右上侧(E),共有4N + 1 个点,其中C部分只有一个参考点。
C |
D |
E |
B |
当前 T U |
|
A |
当某些区域的参考像素不存在时,会使用最邻近的像素点进行填充。若A区域不存在,则利用B区域最下方的那个像素点进行填充。若所有区域的参考像素都不存在,则用固定值填充,固定值由一下式子决定:
R = 1 <<(BitDepth - 1);例如在参考代码中BitDepth = 8,则R = 128。
假设TU的大小为4x4,则具体的参考示例图如下图所示:
帧内参考示意图
函数initAdiPatternChType()完成对当前TU相邻像素是否可用的判断,并获取相邻参考像素,如有需求,完成对参考像素的滤波。下面根据代码实现对这个函数解析.首先判断这5个参考区域是否存在且可用。进而调用函数fillReferenceSamples().
函数fillReferenceSamples()的作用是,根据前面对5个参考区域是否存在,依据以上所说规则获取这些区域的参考像素值。
第二部分:参考像素滤波
若函数参数bFilterRefSamples为真,则需要对参考像素进行滤波。相对于H.264,HEVC增加了一种强滤波模式,因此存在常规滤波和强滤波模式两种。如帧内参考示意图所示,上方边界和左侧边界的参考像素值,每个像素值需要利用它左侧,本身和右侧的像素值滤波,得到滤波后的像素值。
具体采取那种滤波方法,怎么样滤波,请参照书本《新一代高效视频编码H.265/HEVC:原理、标准与实现》的第119到120页。程序几乎是书上文字描述的完整实现,且较为简单,这里不做赘述。
以上就是函数initAdiPatternChType()的主要作用,分为两部分:判断相邻像素是否可用并根据一定的规则获取参考像素,参考像素滤波。
确定参考像素之后,接下来时根据当前TU的预测模式,利用参考像素,根据相应的规则预测TU的像素值。这一部分由函数predIntraAng()实现。
函数predIntraAng()实现确定当前TU的预测值。
第三部分:预测像素值的计算
预测模式具体可分为Planar模式,DC模式,33种角度预测模式,以及特殊
编码模式PCM模式。
PCM模式下,编码器直接传输一个CU的像素值,而不经过预测变换等其他操作,因此需要单独讨论。
DC模式预测:
在HEVC中,计算了各个参考点的均值后,为了更好的利用邻近像素的相关性,提高预测精度,还需要对当前TU的左上角像素,第一行像素与第一列像素(均不包含左上角像素)进行滤波处理。具体的计算方法参考下面所提的书本。
角度模式预测:
如上图所示,HEVC的角度预测方向相对于H.264增加到了33种。这样做的好处是能够更有效低表示图像的纹理特征,提高预测精度。
其中编号2到17的角度预测模式为水平类模式,编号为18到34的角度预测模式为垂直类模式。编号为10的为水平预测,编号为26的位垂直预测模式。
为了简化过程,根据选定的预测模式,在一个预测区块内的所有样本会被投影至单一的参考行或列,预测模式2至17会采用左边的参考行,预测模式18至34则会使用上方参考列。通过使用“投影像素”法将其需要用到的参考像素映射到左方行或上方列,变为一维的形式。具体投影方法参照下面所提到的参考书目。操作如下图所示:
帧内预测参考像素投影参考示意图
Planar Prediction(平面预测):
HEVC的Planar模式是由H.264的Plan模式发展而来的,它适用于像素值变化缓慢的区域。如下图所示,
Planar模式使用水平和垂直方向的两个线性滤波器并将两者的平均值作为当前块像素的预测值。这一做法综合了水平和垂直像素变化的特点,能够使预测像素变换趋向于平缓,与其他预测模式相比能够提高视频的主观质量。
这一部分代码的原理可参考书本《新一代高效视频编码H.265/HEVC:原理、标准与实现》的第121到124页.
2015.3.6
By LB