【视频编解码-05】预测编码详解-帧内预测

定义

预测编码最基本的思想是不直接对信号进行编码,而是用前一信号对当前信号做出预测,对当前信号与预测值的差值进行编码传送。

为什么要用差值来编码呢?

举个例子,假设图片是4x4,且没个像素点都是255,那么对255进行二进制编码至少需要8位,如果我们假设预测值是255,那么差值就是255-255=0,那么仅仅对0进行编码一位即可,这样就大大减少了码元的个数。

什么是帧内预测呢?

帧内预测的目的就是使用比完整一帧少很多的数据来表示当前的一帧。

为什么可以进行帧内预测呢?

一般的,相邻像素的亮度和色度值经常是非常接近的,也就是说,假设两个像素相邻记为A/B,使用A像素的原始值编码,然后使用C(C=|A-B|)来表示B的值,因为非常接近,这个差值很小,缩短了编码长度。节约了空间。

对于一帧数据,具体是怎么预测编码的呢?

在H.265/HEVC帧内预测可分为以下3个步骤:
1.判断当前TU相邻参考像素是否可用并做相应的处理;
2.对参考像素进行滤波;
3.根据滤波后的参考像素计算当前TU的预测像素值;

TU: transform unit,变换单元
在这里插入图片描述

如上图,当前需要编码的区域是TU(NxN),他的参考像素分为5部分:左下(A)、左侧(B)、左上(C)、上方(D)和右上(E),一共4N+1个点。

若当前TU位于图像边界,或Slice、Tile的边界(H.265/HEVC规定在帧内编码中,相邻Slice或Tile不能相互参考),则相邻参考像素可能会不存在或不可用。另外,在某些情形下A或E所在的块可能尚未进行编码,此时这些参考像素也是不可用的。
当参考像素不存在或不可用时,H.265/HEVC标准会使用最邻近的像素进行填充。例如,若区域A的参考像素不存在,则区域A所有参考像素都用区域B最下方的像素进行填充;若区域E的参考像素不存在,则区域E所有参考像素都用D最右侧的像素进行填充。需要说明的是,若所有参考像素都不可用,则参考像素都用固定值填充,该固定值大小为【R = 1 << (BitDepth -1)】

在这里插入图片描述

帧内预测编码流程图

  1. 首先,是上图中蓝色的部分,假设现在我需要对一个像素X进行编码,在编码这个像素之前,先假设我已经有一个参考像素X’了,这个参考像素与同一帧的临近像素有关,根据参考像素X’的值,我得到了一个预测值Xp。
  2. 然后,是上图中红色的部分,我用编码的像素X减去预测值Xp,得到了残差d,这个残差d代替原始值X被编码进最终的图像,起到了节省码率的作用
  3. 最后,是上图中黑色的部分,残差d和预测值Xp相加,得到了X’,用于下一个像素的预测。

步骤很简单,但是里面有几个问题要明确,首先要知道的是,我们固然可以按像素来进行预测,但是这样太费事了,要计算很多次,而且由于帧内预测的特性,你要预测当前的像素,能参考的像素只能是它的临近像素,也就是前面已经编码完成的,它后面的像素还没有编到,所以自然是不能用来编码当前像素的,因此我们只能一个像素一个像素进行编码,编完了一个才能编下一个,这样显然会很慢。于是H.264标准中提出按块进行计算,一个宏块是16x16像素,然后它可以分成子块,最小是4x4的(这个大小是对于亮度编码而言,至于色度编码,4:2:0格式的色度宏块的长和宽都是亮度宏块的一半),这样也能大大提高计算速度。因此下面提到的“值”可以代表“像素”也可以代表“块”,从原理上来说是一样的,而实际采用的是“块”,因此我也就统一用块这个词了。

问题来了X’和Xp的值怎么来的:
Xp,是预测的值,为了使得预测值与原始值的差值最小,需要使用相关公式计算得到,也就是根据公式通过计算ABCDE五个部分而得到;
当我们得到Xp之后,与原始值的差值就得到了;

上面提到的这个某个公式是什么?根据白皮书,Intra(帧内预测)有两种,一种是4x4大小的亮度块,一种是16x16大小的亮度块。

对于4x4大小的亮度块,我们有9种预测模式,如下图所示
在这里插入图片描述

预测模式0(vertical),当前块的十六个像素值,完全由其上方块最后一行的那四个像素值决定,第一列所有的Xp值都等于A,第二排都等于B,以此类推。

预测模式1(horizontal)也是一样,完全由图中IJKL四个像素值决定。

预测模式2(DC),则十六个像素值完全相等,等于ABCDIJKL这八个像素的平均值。

预测模式3-8,倾斜方向的,各个像素是由A到L像素通过权重不等的公式加权计算的
在这里插入图片描述

对于模式3(diagnal down-left)来说,a=(A+2B+C+2)/4,这里+2代表四舍五入,b和e=(B+2C+D)/4,cfi=(C+2D+E+2)/4,dgjm=(D+2E+F+2)/4,hkn=(E+2F+G+2)/4,lo=(F+2G+H+2)/4,p=(G+2H+H+2)/4=(G+3H+2)/4

模式4(diag down-right),加权系数也是(1,2,1)/4,afkp用IMA三个像素计算,以此类推。

模式5(vertical right),aj=(M+A+1)/2,同理bk是AB均值,cl是BC均值,d是CD均值(因为这几个像素延长线都不在预测用的13个像素里面)。en在M的延长线上,所以等于(I+2M+A+2)/4,同理fo\gp\h\i\m都可以计算出来。

同理模式6、7、8也基本跟5一样,注意对于模式8来说,klmnop四个像素都等于L,因为其延长线在L的下面和前面,没有可以平均的像素,于是只好用L一个值代替了。

举例
P是预测值,q是残差
在这里插入图片描述

总结:

  1. 预测的步骤
    首先,确定取帧数据的一部分原始数据作为编码;
    其次,根据公式计算对应TU的预测值,并得到差值
    最后,解码时,差值与预测值相加得到原始值
  2. 解码之后得到的“原始值”与真正的原始值,还是有区别的,而这越接近效果越好。
  3. 评价预测的效果方法:SAD,SATD;
  4. 要进行编码的话,我们除了把残差编进去,总得知道我预测的时候用了哪种模式吧,9这个数就尴尬了,因为刚好三个比特可以表示8种,四个比特可以表示16种,所以3bit不够4bit又浪费了。怎么办呢?有个方法就比较巧妙,我有1bit用来表示我当前用的模式和前面的是不是一样的,因为经常有这样的情况,我前面块用的预测方向和现在这个块用的预测方向一样(比如物体边缘是一条直线,那么对应的那几个块用的预测方向很可能都是一样的),如果一样,我只用1bit就足够存储了,如果不一样,我再用用4个bit存储,也就达到了节约bit的目的。

参考:

https://app.yinxiang.com/client/web#?n=a51a0bf8-fe6c-4ec0-a3d3-2d47495fb7d5&s=s59&stack=%E9%9F%B3%E8%A7%86%E9%A2%91&
https://www.jianshu.com/p/d19d7eb3844a
https://www.jianshu.com/p/d5d92421186a

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值