HEVC算法和体系结构:预测编码之帧内预测
最后更新于:2022-04-01 16:05:36
# 预测编码之帧内预测(Intra-Picture Prediction)
预测编码(Prediction Coding)是视频编码的核心技术之一,指利用已编码的一个或几个样本值,根据某种模型或方法,对当前的样本值进行预测,并对样本真实值和预测值之间的差值进行编码。视频编码器对预测后的残差而不是原始像素值进行变换、量化、熵编码,由此大幅度提高编码效率。
对于视频信号来说,一帧图像内临近像素之间有着较强的空间相关性,即空域冗余;相邻图像之间也有很强的相关性,即时域冗余。去除空域冗余和时域冗余的技术分别是帧内预测技术和帧间预测技术。
本博文首先介绍预测编码的原理,其次重点分析帧内预测技术相关知识点。
### 一、预测编码的原理
我们可以简单地将视频当做是一种有记忆信源,预测编码通过预测模型消除像素间的相关性,得到的差值信号可以认为是没有相关性的,因此可以作为无记忆信源进行编码。
在预测编码时,不直接传送图像样值本身,而是对实际样值与它的预测值间的差值进行编码、传送,如果这一差值(预测误差)被量化后再编码,这种预测编码方式叫做差分脉冲编码调制(DPCM)。从统计上看,需要传输的预测误差主要集中在0附近的一个小范围内,由于人眼的“掩蔽效应”,对出现在纹理或运动较复杂区域的较大误差不易察觉,因此,预测误差量化所需要的量化层数要比直接传送图像样值本身减少很多。DPCM就是通过去除临近像素间的相关性和减少差值信号量化层数来实现码率压缩的。
预测差分编码的原理框架如下图所示,在预测编码系统中,预测器和量化器是非常关键的两部分。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-05_577af7b2ecf5c.jpg)
预测编码的基本过程:对于输入像素值x(n),首先利用已编码像素的重建值得到当前像素的预测值p(n),然后对二者的差值e(n)进行量化、熵编码,同时利用量化后的残差e’(n)与预测值p(n)得到当前像素的重建值x’(n),用于预测之后待编码的像素。对应的解码过程为:经熵解码可以得到当前像素预测误差的重建值e’(n),将其与预测值p(n)相加即可得到当前像素的重建值x’(n)。
为了保证编码器和解码器中预测有完全相同的参考基准,在利用空时域相关性进行预测时,需要用含失真的解码像素x’(n)作为参考像素,从而避免编码器和解码器中因不同预测参考产生误差累积,也就是说,在编码器内部需要内嵌一个解码器。
### 二、帧内预测技术
视频序列的时域相关性往往大于空域相关性,所以帧间预测技术的贡献往往大于帧内预测技术,但是这并不意味着可以对所有视频帧都采用帧间预测技术进行预测编码,其原因主要包括:
(1)、几乎所有的视频编码标准都支持I帧,这一帧可以不依赖临近参考帧进行独立解码,这一特点使得视频应用可以支持快进或快退播放,同时还避免了因编码失真累积而导致的图像逐渐恶化以及后续图像运动预测的效果逐渐恶化。
(2)、基于刚体平动的模型并不适用于所有场景,因为实际中的视频序列的运动是非常复杂的,尽管可变大小块分像素运动预测在一定程度上改善这一不足,但是还是有部分宏块或块不能获得很好地运动预测效果,而这些区域空间相关性也许比时域相关性强,采用帧内预测的预测效果往往好于帧间预测效果。研究表明,P帧和B帧中也有少数比例(1%~3%)的宏块实际上采用了帧内预测模式。
### 1、HEVC与H.264在帧内预测编码时尺寸、预测模式种类的区别
HEVC帧内预测与H.264类似,都是利用相邻块的重建值进行预测,因此,编码模式的选择与编码是帧内编码需要重点解决的问题。HEVC与H.264在帧内预测上最大的不同在于:HEVC采用了更大更多的尺寸以适应高清视频的内容特征,支持更多种的帧内预测模式以适应更加丰富的纹理。
H.264一共规定了3种大小的亮度帧内预测块:4*4、8*8和16*16,色度分量的帧内预测块都是基于8*8大小的块进行的。其中,4*4和8*8大小的亮度块包含9种预测模式(垂直、水平、DC、左下对角线模式、右下对角线模式、垂直向右模式、水平向下模式、垂直向左模式和水平向上模式),而16*16大小的亮度块和8*8大小的色度块只有4种预测模式(DC、水平、垂直和Plane)。需要注意的是“4*4和8*8大小的亮度块支持的9种预测模式”与“16*16大小的亮度块和8*8大小的色度块只支持的4种预测模式”二者模式编号顺序是不同的。
HEVC亮度分量帧内预测支持5种大小的PU(Prediction Unit):4 * 4、8 * 8、16 * 16、32 * 32、64 * 64,其中每一种大小的PU都对应35种预测模式,包括Planar模式、DC模式以及33种角度模式,如下图所示。对于色度分量,支持PU的大小为4 * 4/8 * 8/16 * 16/32 * 32,一共有5种模式,即Planar模式、垂直模式、水平模式、DC模式以及对应亮度分量的预测模式,若对应亮度预测模式为前4种中的一种,则将其替换为角度预测中的模式34。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-05_577af7b30b860.jpg)
总而言之,当预测模式选择为帧内时,对于所有的块尺寸,PB尺寸与CB尺寸相同。对于最小的CB尺寸,存在一个标志,用于表明CB是否被分成4个PB,每个PB均有自己的帧内预测模式,采用这种分割方式的原因是能为4 * 4大小的块选择帧内预测模式,当亮度的帧内预测模式以4 * 4大小块进行处理时,色度的帧内预测也采用4 * 4块。
所有的预测模式都使用相同的模板,如下图所示。从图中我们可以看出,与H.264相比,HEVC增加使用了左下方块的边界像素作为当前块的参考。这是由于H.264以固定大小的宏块为单元进行编码,在对当前块进行帧内预测时,其左下边方块很有可能尚未进行编码,无法用于参考,而HEVC的四叉树编码结构使得这一区域成为可用像素。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-05_577af7b32c2d2.jpg)
### 2、帧内预测过程
在HEVC中,35种预测模式是在PU的基础上定义的,而具体帧内预测过程的实现则是以TU为单位的。HEVC规定PU可以以四叉树的形式划分TU,且一个PU内的所有TU共享同一种预测模式。
HEVC的帧内预测过程可分为以下三个步骤:
(1)、相邻参考像素的获取
如下图所示,当前TU的大小为N * N,其参考像素按区域可分成5部分,左下、左侧、左上、上方和右上,一共4 * N+1个点,若当前TU位于图像边界或Slice、Tile边界,则相邻参考像素可能会不存在或不可用,并且在某些情况下,左下或右上所在的块可能尚未编码,此时这些参考像素也是不可用的。当像素不存在或不可用时,HEVC规定了可以使用最邻近的像素进行填补,例如左下的参考像素不存在,则左下区域的所有参考像素可使用左侧区域最下方的像素进行填补,若右上区域的参考像素不存在,则可以使用上方区域最右侧的像素进行填补(如下图中右侧示例)。需要说明的是,若所有参考像素都不可用,则参考像素都用固定值填充,对于8比特像素,该预测值为128,对于10比特像素,则该预测值为512。
![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-07-05_577af7b342ba5.jpg)
(2)、参考像素的滤波
H.264在帧内预测时对某些模式下的参考像素进行了滤波,以便更好地利用临近像素之间的相关性,提高预测精度。HEVC沿用这一方法并进行了拓展:一是针对不同大小的TU选择了不同数量的模式进行滤波;二是增加使用了一种强滤波方法。
(3)、预测像素的计算
预测像素的计算就是针对不同的预测模式采用不同的计算方式得到预测像素值。