H.266/VVC相关技术学习笔记25:H.264到H.265再到H.266中帧内角度预测模式发展历程以及各阶段技术细节详解

趁着国庆的时间,详细总结一下关于视频编码中的帧内预测,主要总结一下从H.264到H.265再到H.266中的帧内角度预测模式发展历程以及各个阶段角度模式的技术细节以及预测值计算流程。因为之前看了角度模式,也忘了记笔记,现在有点淡忘其中的细节了,趁这几天复习顺带总结一下。其中AVC和HEVC中角度预测的一大部分知识点是源于书的,但是感觉杨老师那本书中知识点脉络不是很清楚,而且其中的计算细节也没有讲清楚,我结合朱老师那本书(这本感觉适合新手,对新手比较友好,讲的很清楚,反观杨老师那本比较适合高手进阶)然后用自己的脉络捋了一遍,按照自己的理解去总结一遍,尽可能最简单直白地将角度预测讲清楚。如有理解不到位的,欢迎指正。

一、H.264/AVC中的帧内预测模式

H.264/AVC中的帧内角度预测模式不是很多,而且根据宏块的大小不同,角度预测的模式数量还不一样。由于AVC中是以宏块的形式进行编码的。

1、对于亮度像素而言,独立进行预测的块的大小可以是16×16宏块或者是4×4的子块

①对于4×4的亮度子块有9种可选的预测模式,适用于具有大量细节的图像的预测编码。这9种模式分别是8种角度模式+一个DC模式。具体角度模式的预测方向如下图所示(直接拿书上的图片了,自己画有点麻烦~)。图中虚线箭头的根部是参考像素,箭头所经过的是待编码的预测像素。预测时,通过箭头根部的一个或者多个参考像素的加权值来预测所经过的待编码的像素,具体要用多少个参考像素以及权重的选取,这些和预测的角度以及当前预测像素所在的位置有关。想要在深入了解的同学可以参考一个大神的博客:【H.264/AVC视频编解码技术详解】十七:帧内预测编码的预测实现方法。由于本人直接是从H.266/VVC标准开始做起的,关于H.264/AVC中具体的技术细节以及相关的代码我也没有太多深入学习过,可能总结的不是很到位,所以这里直接引用这位大佬关于AVC技术详解的博客。
在这里插入图片描述
②对于16×16的亮度宏块仅有4种可选的预测模式可以选择。因此适用于具有平坦区域的图像进行预测。这四种预测模式分别为0(垂直)、1(水平)、2(DC)、3(平面),具体如下图所示。注:这里的平面叫做“plane”,这就是后续HEVC以及VVC中的Planar模式的前身。从上面可以看出,DC模式以及Planar模式早在AVC标准中就已经出现。
在这里插入图片描述

2、对于色度像素而言,独立进行预测的块的大小只有8×8。

一方面考考虑到4:2:0的色度取样模式,所以16×16的亮度宏块对应的色度块是8×8,另一方面考虑到人眼对于色度信号的分辨率一般低于亮度信号,因此在色度信号的帧内预测中统一取8×8块的尺寸。色度的8×8块同亮度16×16块的预测模式数量一样,只有4种,这四种预测模式一样,但是编号的顺序不一样,对于色度块来说:0(DC)、1(水平)、2(垂直)、3(平面)

在AVC中,每一个宏块或者子块如何在多种预测模式中选择出一个最优的模式呢,这是很重要的一个问题,其中采用率失真优化(RDO)方法,也就是计算每种模式下预测值与原始值之间的失真,同时加上码率的判断,计算RDCost,cost最小的那个模式就是预测最准确、产生码字最少的最优模式。即4×4的子块需要在9种模式中进行率失真代价的比较,16×16的宏块需要在4种模式中进行率失真代价的比较。RDO的方法一直沿用到了HEVC以及目前的最新一代标准VVC中了。

二、H.265/HEVC中的帧内亮度预测模式

相比于AVC,为了提高预测的精度,HEVC中的帧内亮度预测模式总共增加到35种,其中有33种角度预测模式、平面模式(Planar)、直流模式(DC)。每种模式都有其对应的模式编号:0(Planar)、1(DC)、2-34(33种角度模式)。
1、Planar模式
适用于纹理比较平滑(即像素值变化缓慢)的区域,尤其是变化趋势比较一致的区域。Planar模式使用水平和垂直方向的两个线性滤波器,并将二者的平均值作为当前块像素的预测值。因此,每个像素的预测值可能是不同的。

2、DC模式
适用于大面积的平坦区域,对当前块内所有的像素都使用同一个预测值,即所有参考像素的平均值。

3、角度模式
HEVC的帧内亮度角度预测和AVC中的类似,但是更加细化了这些预测方向(扩展到33种),以更好地适应视频内容中不同方向的纹理。这33种角度模式如下图所示,其中模式26(上侧第0格)和模式10(左侧第0格)分别表示垂直和水平方向,其余模式的预测方向都可以看成在垂直或水平方向上做了一个偏移(偏移距离最多为32格),这个偏移值可正可负。(需要注意的是:对于模式11-25,当前块的预测需要同时用到上方以及左侧的参考像素(可以自己用尺子之类的比划一下,在这些角度下会有一部分的当前像素是需要用到当前角度放射不到地方的像素进行预测)。因为为了使用一种统一的形式来计算预测像素值,在HEVC标准中采用了一种“投影像素”的方法,对于模式18-25(垂直偏左类模式),由于有些当前像素需要用到左侧的参考像素,因此需要将左侧的参考像素按照给定的方向投影至上方参考像素的左侧;对于模式11-17(水平偏上类模式),由于有些当前像素需要用到上侧的参考像素,要将上方参考像素按给定的方向投影至左侧参考像素的上方)

在这里插入图片描述

HEVC中帧内预测过程(以下的用图都为PPT所绘,如有不规范的地方请多包涵~)

HEVC中帧内预测过程主要分为3个步骤:

1、参考相邻像素的获取:

在帧内预测最开始需要先确保相邻参考像素存在且帧内可用,因此这一步就是要对那些不可用的参考像素进行填充为接下来的帧内预测做好准备。在AVC中只有当前块的正上方和正左侧的像素能作为参考像素,这是因为AVC中的块划分都是固定的宏块,而HEVC中允许不同尺寸的编码块,因此有时候左下方和右上方的像素存在且可用,所以HEVC中帧内参考像素的范围扩展到了当前块左上角、左下方以及右上方的范围。如下图所示(nTbs为当前编码块的宽和高):
在这里插入图片描述
需要注意的是,在某些情况下参考像素有可能不可用。HEVC标准会使用最邻近的像素进行填充,具体的填充方法如下:
①如果ABCDE区域的所有像素都存在且帧内可用,则不需要进行填充;
②如果ABCDE区域的所有像素都不存在且帧内不可用,则所有的参考像素都填充为固定像素值,对于8比特深度,填充128;对于10比特深度,填充512。
③若ABCDE区域有部分像素不存在或者帧内不可用;
(1)若左侧最下面的像素点P[-1][nTbs×2-1]帧内不可用,则依次从下往上,然后从左到右遍历,直到找到第一个可用的像素点将该点出的像素值填充到到P[-1][nTbs×2-1]。
(2)然后再从左下像素点P[-1][nTbs×2-2]开始从下到上逐个遍历,若遍历到当前的像素点P[x][y]不存在或者帧内不可用,则用该点下方的像素点P[x][y+1]填充到当前点P[x][y]。
(3)最后对上侧的像素从左到右逐个遍历,如果当前的像素点P[x][y]不存在或者帧内不可用,则用该点左方的像素点P[x-1][y]填充到当前点P[x][y]。

2、参考像素的平滑滤波:

在AVC中,帧内预测时在某些角度模式下的参考像素会进行一定的滤波操作,以更好的利用邻近像素之间的相关性,从而提高预测精度。在HEVC中沿用这一做法,对8×8或者更大的预测块的部分参考像素在进行预测之前进行平滑滤波预处理,以减少噪声对预测的影响。而且对其进行了发展如下:
①HEVC根据预测块尺寸以及帧内预测模式的不同,会选择性地对预测块的参考像素集进行平滑处理:
(1)对8×8预测块的参考像素,只需要对2、18、34这三种角度模式进行常规平滑滤波
(2)对16×16预测块的参考像素,除了水平方向附近的9、10、11,以及垂直方向附近的25、26、27不需要进行滤波,其余的27个角度模式都需要进行常规平滑滤波
(3)对32×32预测块的参考像素,除了水平模式10和垂直模式26外,其余的31个角度模式都需要进行平滑滤波;对于32×32预测块总共有两种平滑滤波的方法:一种是常规滤波,一种是强滤波。关于这两种滤波下面详细介绍。
总结来说,较大的块和越远离垂直或者水平方向的预测模式,越是要对参考像素进行平滑处理。

②常规平滑滤波:
参考像素的常规平滑滤波可以通过一个3抽头的滤波器来实现,具体的如下图(a)所示:
当前参考像素P[x][y],是利用其左右两边或者上下两边的参考像素进行121的3抽头平滑滤波;需要注意的是,P[-1][nTbs×2-1]和P[nTbs×2][-1]处的像素不进行滤波;左上角的像素P[-1][-1]利用其右边以及下方的参考像素点进行平滑滤波;

在这里插入图片描述
③强平滑滤波:
强平滑滤波只对于32×32的大块进行,当在SPS中的强滤波标志有效的条件下,还需要估计参考像素集的局部活动性。如果活动性低于某个阈值,则用一个双线性插值滤波器对参考像素进行强平滑滤波。即一个32×32的预测块是否要进行强平滑滤波,需要同时满足以下四个条件:
(1)预测块的尺寸为32×32,即nTbs=32;
(2)允许强滤波标志的flag为1;
(3)Abs(P[-1][-1]+P[nTbs×2-1][-1]-2×P[nTbs×2-1][-1])<(1<<(BitDepthY-5));
(4)Abs(P[-1][-1]+P[-1][nTbs×2-1]-2×P[-1][nTbs×2-1])<(1<<(BitDepthY-5));
其中不等式左边的值就是表示参考像素的活动性。如果小于这个阈值,就表明参考像素处在低纹理的区域,强度为常数或者接近线性变化。
当满足上面四个条件以后,32×32的预测块的参考像素按照上图(b)中的方式进行线性插值,权值是当前像素点P[x][y]相距两头的距离,x和y就是当前参考像素在X轴和Y轴上的坐标值。上图的例子是拿一个32×32的预测块举例子的,因此两个权值的总和是64,当P[x][y]距离哪一头的像素越近,其权值就相对较大,因为其和当前参考像素点P[x][y]的纹理更接近,相关性更强;反之,权值越小。
强滤波通过沿着每个方向上的线性内插值取代真实样点值,取消了小的局部变化。尤其对于32×32的大样点区域,可以明显改善结构性失真。

3、预测像素的计算:

①Planar模式的预测值:
如下图所示,预测块内的像素P的预测值由4个参考像素来决定,首先要用当前像素左边参考像素b和右上的参考像素a按照距离进行加权和得到P_Hor=(nTbs-x)b+xa;再用当前像素上边参考像素d和左下的参考像素c按照距离进行加权和得到P_Ver=(nTbs-y)d+xc;最后求得最终的预测值P=(P_Hor+P_Ver+nTbs)>>(Log2(nTbs)+1)。这里是代码中的实现,实际上这三步的计算就是先对水平和垂直上的参考像素各自求加权平均,最后对插值之后的两个值求平均。
在这里插入图片描述
②DC模式的预测值:
DC模式的预测值就是对所有相邻参考像素求平均值,当前预测块中所有像素点的预测值就为该平均值。

③角度预测模式的预测值:
结合下面各角度的偏移值表格以及上图中各种预测模式的方向所示,我们可以发现各个模式的格点(角度)分布是不均匀的,就拿模式18-34举例,越是靠近垂直方向(26),分布就越是密集,越是靠近对角方向的分布就越是稀疏。这样设计的原因就是由于自然界中景物的垂直运动或者边缘的占比很高,水平方向的分布也是如此。在帧内的33种角度预测模式中,称2-18为水平方向类预测模式,18-34为垂直方向类预测模式,需要注意的是,表格中所表示的格数是在1/32像素插值精度下表示的,也就是说,将一个整像素放大了32倍,32格实际上只表示一个整像素的距离,因此在后面计算预测值的时候需要进行除以32的归一化操作。
在这里插入图片描述
下面以垂直类18-34为例给出预测像素的具体的计算步骤:
(1)获取参考像素数组Ref[x]
获取参考像素之前需要清楚一些知识点,帧内角度模式预测的基本原理就是通过当前像素沿某个方向在参考像素集上投影,“投影中”的那个参考像素就是当前像素的预测值,但是很多情况下并不能投中某个参考像素,原因就是该方向上或者投在了两个像素之间。而且很关键的一点就是当前预测块内的像素既需要尝试投在上方参考像素,也需要尝试投在左方参考像素,这样就是导致计算复杂度的升高。因此HEVC中首次设计将上方和左侧的两个参考像素集通过投影的方式转化为一个一维的参考像素集。具体为:如果是模式11-17,需将上方的参考像素集投影到左侧参考像素集的上方;如果是模式19-25,需将左侧的参考像素集投影到上方参考像素集的左侧。
上面偏移值表格中的偏移值也可以称为intraPredAngle[k],其中k为模式号。因此参考像素集的获取如下图公式所示,intraPredAngle[k]<0表示在模式19-25之间,此时需要将左侧的参考像素投影到左上侧;intraPredAngle[k]>0表示在模式26-34之间:

在这里插入图片描述
这里“投影”的那部分在实际的代码操作部分中,需要设置一个如下表所示的反角度参数表invAngle用来代替计算预测时麻烦的除法运算,就是为了替代上图公式中的Round((32∗x)/(intraPredAngle[k])),在代码中替换为Ref[x]=p[-1][-1+((x×invAngle[k]+128)>>8)]。
在这里插入图片描述
经过上面一些列的操作,就可以得到一个一维的参考像素集Ref[x],接下来的预测就可以参考这个一维数组进行。
(2)设置计算预测值必要的参数iIdx和iFact
iIdx表示不同模式所对应的索引,实际上是相对于当前预测像素点X坐标或者Y坐标的相对偏移像素值(是除以32归一化后的整像素精度表示)。iFact表示权重参数,是在最后求预测值时候进行加权操作需要用到的权重。下面首先解释一下预测值计算的原理,才能更好的理解上面那些参数以及预测值计算的真正意义。这里就拿模式26-34来举例子,如下图所示,对于每个预测方向,可以根据比例关系C_x / y=d / 32计算出预测点p(x,y)在上方参考像素行中的真实的投影点位置,得到投影点横坐标相对于p(x,y)横坐标的位移C_x = (y×d)/32。
在这里插入图片描述
这里的C_x实际就是参数iIdx,d实际上表示预测模式方向相对于垂直方向的偏移格数(即前面提到的invAngle[k],范围为-32~+32),在上图中就表示当前块右下角的点在当前预测方向下的投影参考点相对于右下角点的横坐标偏移值。因此最终可以定义偏移索引iIdx和权重因子iFact如下:
               iIdx=C_x=(y×d)/32; (1)
               iFact=w=(y×d)&31; (2)
接着再根据下图继续解释上述两公式,下图(a)中表示实际的整像素点阵,i=x+C_x。其中 i 为过预测点p(x,y)的预测方向线和参考像素行的交点。上式(1)中(y×d)除以32后使C_x称为归一化的长度单位(即归一化到整像素的单位长度),目的是使其和x的实际坐标定义相一致。因为前面提到的各角度的偏移值表格实际上是以1/32像素精度表示的也就是说那个表格是以将整像素单位扩展了32倍为基础而设计的表中的一格就代表1/32像素32格才代表1个整像素。或者我们可以换个角度,从数学的角度来分析,式(1)其实就是利用相似三角形的定律求出C_x,这样理解会比较简单,但还是建议搞清楚其中包含的像素精度的问题。接下来说说上式(2),其中(y×d)也可以表示未进行归一化的C_x,就是以32格为单位,即仍然是以1/32精度表示的距离,在和“31”进行“按位与”的操作后,实际上就是去掉了大于32的部分,保留下来的小于32的部分就是作为下图(b)中表示R_(i,0)到 i 点的距离,也就是权重w。
在这里插入图片描述
以上两个参数在代码中的实现实际如下:
               iIdx=((y+1)×intraPredAngle[k])>>5;
               iFact=((y+1)×intraPredAngle[k])&31;

(3)预测值的计算
仍然如上图(a)所示,其中的 i 点可以看成p(x,y)点沿着预测方向向参考像素行的投影点,p(x,y)点的预测值就等于这个投影点的插值,该插值就是由其左右相邻的两个参考像素R_(i,0)和R_(i+1,0)的线性内插而得,也可以说是加权求和。靠近i点的参考像素权重大,远离i点的参考像素权重小。如上图(b)所示,相邻两个参考像素的距离在1/32精度下为32个格单位,因此最终的加权预测值表示如下:
             P(x,y)=((32-w)×R_(i,0) + w×R_(i+1,0)+16)>>5;
具体地,在代码中的最终预测值计算分两种情况:
当iFact不等于0时,即i点夹在两个参考像素点之间,预测值计算如下:
       PredSamples[x][y]=((32-iFact)×Ref[x+iIdx+1] + iFact×Ref[x+iIdx+2]+16)>>5;
当iFact等于0时,即i点正好投影在左相邻的那个参考像素点上,预测值计算如下:
       PredSamples[x][y]=Ref[x+iIdx+1] ;

注意:这里需要说明的是,在以上所有公式中的“>>5”表示右移5,即除以32,目的就是将放大了32倍的权重归一化,将1/32精度下的距离恢复为整像素精度。还有以上所有的分析结果都是针对模式26-34的情况,其余2-25模式的预测值的计算也和上述方法类似。

三、H.266/VVC中帧内角度预测模式

1、VVC中的65种常规角度模式以及针对矩形块的宽角度模式

在VVC的早起版本VTM1.0之前(包括VTM1.0)中的角度预测模式仍然为33种角度,但是从BMS1.0之后的版本为了能够捕捉到自然视频中呈现的任意边缘方向,因此将常规角度预测模式扩展到65种,加上Planar、DC模式总共有67种角度帧内预测模式(针对亮度分量)。如下图所示,VVC中新添加的角度模式在图中用红色虚线箭头表示,Planar模式和DC模式保持不变:
在这里插入图片描述
而且由于在HEVC和VVC中的划分方式的不同,在HEVC中的划分方式只能划分出正方形的块,因此沿顺时针方向将常规角度帧内预测方向定义为45度(角度模式2)至-135度(角度模式34)。而且其每一侧的长度是2的幂,因此在使用DC模式的时候,可以不需要用除法,直接用移位表示除法计算出DC的预测值。而在VVC中,由于划分方式的多样化,允许混合树以及二叉树、三叉树的划分,使得最终的编码块极有可能不是正方形的,而是长宽不等的矩形。因此在VVC的VTM1.0版本之后就新引入了针对这种非正方形块的宽角度帧内预测模式(wide-angle intra prediction modes),即对于非正方形的块,会根据块的宽高比自适应地将几种常规的角度帧内预测模式替换为宽角度帧内预测模式,所谓的宽角度就是对于宽度大于高度的块,右上角的角度允许超过45度;对于高度大于宽度的块,左下角的角度允许超过45度。而且对于DC模式,非正方形的块可能会难免引入除法运算,因此为了避免复杂的除法运算,就仅仅将较长的那一面用于计算非正方形块的平均值。

2、下面具体来看看宽角度模式具体是怎么用的:

首先对于尺寸为W×H像素的预测块,顶部参考像素集和左侧参考像素集的尺寸均为(W + H + 1),需要覆盖所有预测像素在顺时针方向上从45度到-135度的范围。如下图所示,不论是正方形块还是不对称的矩形块,其预测角度都被限制在这个范围之内:
在这里插入图片描述
当出现不对称的非方形块时,对于某些预测模式,将从较远的参考像素集中去获取当前的预测像素,虽然距离较近的参考像素集中的像素更可信,相关性也更强,但是由于预测角度的限制,使得不能够获取到距离较近的参考像素,例如下图所示,对于左边(W>H)的块,右上方的参考像素T和预测点A的距离更近,但是由于预测角度不能超过(-135,45)度的范围,因此只能去选择其对角方向的左侧参考像素L;右图的(H>W)的块也是类似的情况。

在这里插入图片描述
所以宽角度就是应对以上问题而被设计的,宽角度模式并不增加帧内预测模式的总数,仍然是67种帧内亮度预测模式,并且帧内编码方式不变。宽角度在使用的时候实际上是自适应地替换了非方形块的几种常规帧内角度预测模式,而且替换后的宽角度模式仍然使用被替换的那个常规角度模式的索引发送到解码端,在解码端解析该常规模式索引,然后再重新映射到相对应的宽角度模式的索引。
宽角度模式是否使用是根据一个wide-angle “flip mode”的标志位来标识当前块宽角度模式是否开启。当宽角度模式启用的时候如果实际的预测样本使用的是需要被翻转的的那个常规(2-66)角度模式则需要根据翻转信号所指示的宽角度方向切换参考像素集如果原本是Top,现在使用Left;如果原本是Left,现在使用Top)。在当前的VVC版本中,宽角度模式总共有28种方向,一侧各14个宽角度模式,左侧为(-1、-2…-14),上侧为(67,68…80)。但是实际上,这28种模式号并没有真正加入到帧内预测模式的索引中去,就是因为如上所说,宽角度模式需要传递的是其对应的常规角度的模式索引。不过仍然还是为宽角度模式预留了14个模式的“隐形位置”,由于每一侧只有14种宽角度,因此最多预留14个就足够了,所以导致色度帧内预测模式中的三种CCLM模式要排到81,82,83了(当然实际的代码中还是67,68,69)。

由于宽角度模式下所替换的常规角度模式的数量取决于当前预测块宽高比,具体如下表所示:
在这里插入图片描述
下图展示了如何将矩形块的常规角度模式替换为宽角度模式。在此示例中,模式2和模式3替换为广角模式67和模式68,其中每个宽角度帧内预测方向都与一个常规帧内预测方向相关联,并且与该常规帧内预测方向相反,使用的参考样本也在相对侧。其中模式67的方向指向模式3的相反方向,而模式68的方向指向模式4的相反方向 。

在这里插入图片描述

3、宽角度模式存在的问题

当角度预测方向超过45度时会存在不连续的问题,如下图所示,在宽角度帧内预测的情况下,两个垂直相邻的预测样本可能会使用两个不相邻的参考样本,这两个参考样本中间的间隙可能会导致一些负面的影响。因此需要使用边缘平滑和低通参考像素样本滤波器去消除这种负面效应。当然如果满足非分像素偏移的宽角度模式是不需要进行任何插值操作,可直接复制参考样本像素值到当前预测像素中,这些模式有以下8种 [-14, -12, -10, -6, 72, 76, 78, 80]。
在这里插入图片描述

4、VVC中的角度预测具体步骤可以参考HEVC中的计算步骤,大致都是相同的,这里就不多做赘述,关于当前版本的VVC中角度预测模式的代码有时间我会在后续的博客更新~
  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值