一 、帧内预测简要说明
帧内预测,是针对一帧图像内部信息做的一种预测模式,它主要针对的是图像中的空间冗余(空间冗余指的是图像相邻像素或像素块之间有较强的相关性,粗鲁的说,就是一副图像中有些地方看起来差不多)。
如下图,这位美女的头上的两个红色方框看上起是差不多的(专业的说法叫做相关性强,对于相关性当然是有专门的相关性判别函数的),既然差不多那么我可以考虑只把左边的图像块编码,而右边的图像块直接从左边的图像块生成,那么可以说右边的那个色块是由左边那个色块做帧内预测而来的。
再看下面这张图片,这是编码的一瞬间,左边有图片的区域是已经完成编码的区域,而右边白色的区域是待编码的区域,T1~T6是正在编码的块(这个还涉及WPP相关的内容此处暂时不予讨论),可以看出,如果是帧内编码,那么已编码的块就是当前正在编码的T1~T6的左边、上边、左上方的一些色块。对于一副图像而言,由于图像内部的连续性以及相关性(如上图1中的两个红色框就是连续的,相关性强),那么T1~T6就可以直接由以编码的色块做预测处理,预测出来,而不需要再进行编码。
二 、帧内预测回路
帧内预测的整个回路如下图3所示
Step1:
一帧图片进入编码器,被分割成CTU之后,通过红色的线,进入(1)帧内估计中,这里色块对应于图2中的T1~T6,是待预测的色块。在(1)中找到和当前色块相关性最高的色块,这些相关性高的色块是已解码的色块,在图1中对应于T1~T6左边、左上、上边已解码的色块。
注意:Intra-Picture Estimation这个模块是有两个输入一个输出的,上面箭头的输入是待预测的当前的色块,而右边的输入是已经预测完成并经过了编码量化和反编码反量化之后的色块。
也就是说,在(1)中基于前面已经解码出来的色块,在已解码的色块中,找到和当前色块先关性最高的色块,并且将这个相关性最高的色块的方向向量和预测模式做Intra Prediction Data放入码流中,以便解码器找到当前块做帧内预测时的参考块。
找到相关性最高的色块后,再进入(2),基于相关性最高的色块对当前色块做帧内预测。
有一点必须注意,(1)、(2)输入的解码块,是没有经过滤波的。主要是因为帧内预测是根据一副图片内部的相关性来做预测的,帧内预测之后的图片相邻色块间的相关性强,在视觉上不存在特别大的块效应(就是马赛克),所以并没有做滤波处理(这是相对于帧间预测的,帧间预测所依赖的已解码块是需要做滤波的)。
Step2:
经过(1)(2)之后,得到的是做完帧内预测之后的图片,然后经过篮紫色的那条线,进入(3),与原始图片做差,求出残差Residual。
因为编码器内部有解码器,而预测是基于解码器解码之后的图片完成的,也就是说,在真正的解码端,可以通过码流中的Intra Prediction Data,得到当前色块的参考块及其预测模式,从而得到当前块的预测值。但是,预测值和实际值总是有差别的,(3)的作用就是求出预测值Prediction和原始值Original之间的差别,即残差Residual。
Residual= Original – Prediction
而解码端可以自己得到Prediction,只要解码端再得到Residual,那么它就可以得到Original了。
Original= Residual + Prediction
Step3:
图3中浅蓝色的线表示的就是对Residual的变换和量化,主要DCT变换的方法来实现数据压缩,将变换量化之后的系数放入码流中。通过反变换和反量化就可以得到当前色块的Residual了。