HEVC/H.265——帧内预测

转载至:https://blog.csdn.net/NB_vol_1/article/details/53288626 感谢一下作者
一、帧内预测,利用当前图像内已经编码的像素生成预测值

二、生成预测值之后,和原始的值相减,得到残差,后续的变换量化等操作就是基于残差进行处理的

三、帧内预测的大致流程是这样的
(1)遍历所有的预测模式,得到每种模式下的残差信号,再对残差信号进行Hadamard变换计算SATD值
(2)利用SATD值计算每种预测模式的率失真代价,选取率失真代价最小的几种模式(与PU大小相关)为预测模式集
(3)将已编码相邻块的预测模式补充到预测模式集中
(4)遍历模式集合中的所有模式,并对残差信号进行正常编码(熵编码),计算率失真代价
(5)选取最优的预测模式作为该PU的最优模式
(6)当亮度块的模式确定之后,把该模式以及DC、planar、水平方向模式、垂直方向模式作为色度块的候选模式,选取最优的模式即可

四、HEVC的帧内预测
1、支持五种大小的PU(PU就是预测单元,由CU分割得来):4x4~64x64
2、每一种PU都有35种预测模式,包括planar模式(模式0) ,DC模式(模式1)和33种角度模式,模式2~17是水平类模式,模式18~34称为垂直类模式
3、HEVC的PU会参考右上角、上面、左上角、左边、左下角的相邻块的边界像素(但是不一定全部都参考)
4、planar模式把水平和垂直方向上的平均值作为当前像素的预测值;DC模式适用于大面积的平坦区域
5、亮度模式的预测
     (1)先用率失真优化的方式选取几个代价小的模式作为预测模式集
     (2)利用相邻块的预测模式来对当前块的模式进行预测,得到若干模式(存放在candList中),然后添加到预测模式集中
          ①假设当前块的左边是A,上面的是B     
          ②如果modeA==modeB
               a)modeA和modeB都是planar或者DC模式,那么candList[0] =planar,candList[1]=DC,candList[2]=26
               b)modeA和modeB都是角度模式,那么,candList[0]=modeA,candList[1]和candList[2]等于modeA相邻的两个模式
          ③如果modeA!=modeB,那么candList[0]=modeA,candList[1]=modeB,candList[2]则要分几种情况
               a)modeA和modeB都不是planar模式,那么candList[2]=planar
               b)当a)不满足,而且modeA和modeB都不是DC模式,那么candList[2]=DC
               c)当a)和b)不满足,candList[2]=26
     (3)遍历预测模式集,获取最优的模式(假设为modeC),需要进行下面一些处理:
          ①如果modeC在candList中出现(就是说最优模式modeC是candList的成员),那么只需编码modeC在candList中的位置即可
          ②如果modeC不在candList中出现,那么按照下面的步骤编码modeC
               a)把candList中的模式按照从小到大的顺序重新排序
               b)遍历candList的元素,分别与modeC比较,如果modeC >=candList[i],那么modeC自减1
               c)对modeC的值进行编码         
6、色度模式的预测
     (1)色度模式的候选模式是:planar模式,DC模式、水平模式、垂直模式,对应的亮度分量的模式
     (2)调整模式:如果对应的亮度分量的模式和(planar,DC、水平、垂直)这几种模式中的一个重复了,那么把对应亮度分量模式改成模式34
     (3)遍历候选的模式,选出最优的模式,然后直接对色度分量的模式的编号进行编码(会经过一定的判断和调整,细节就不说了)。附色度分量的模式的编号:
          模式0:planar
          模式1:垂直模式(即角度模式26)
          模式2:水平模式(即角度模式10)
          模式3::DC模式
          模式4:对应亮度分量模式

四、实现技术
1、理论上预测模式是在PU的基础上定义的,但是实际的实现中是以TU为单位的,因为PU可以按照四叉树的方式划分成为TU。但是呢,一个PU内的所有TU都是用同一个预测模式(因此实际上还是相当于以PU即单位进行的)
2、判断当前TU相邻参考像素是否可以使用,然后做相应的处理
     (1)slice(或者tile)的帧内参考是不能跨越slice边界的,因此处于slice边界的TU的某些参考像素是不可用的
     (2)当某些参考像素不可用时,HEVC会使用最邻近的像素进行填充;如果所有的参考像素都不可用,那么使用固定值填充,即把所有的参考值填充为某一个固定值,固定值R=1<<(BitDepth - 1)
3、对参考像素进行滤波
     (1)滤波的目的是为了更好利用邻近像素之间的相关性,提高预测精度
     (2)针对不同大小的TU选择不同数量的模式进行滤波(所谓滤波就是,如果当前TU选择了某一个模式进行预测,那么需要判断,对于该模式,是否需要对参考像素进行滤波)
          ①DC模式和以及4x4大小的TU不需要进行滤波
          ②32x32的TU:除了水平模式(模式10)和垂直模式(模式26),其他模式都需要进行滤波
          ③16x16的TU:在32x32TU的基础上去除最接近水平和垂直方向的4个模式——模式9、模式11、模式25、模式27
          ④8x8的TU:仅对3个45度的模式(模式2,18,34)以及planar模式进行滤波
     (3)常规滤波,有一个计算的公式,不细讲
     (4)强滤波,这是HEVC新增的一个滤波方法,不细讲
4、根据滤波后的参考像素计算当前TU的预测像素值,反正就是根据一些公式计算出预测值

猜你喜欢

转载自blog.csdn.net/liumoude6/article/details/80846425