HEVC预测编码

一、树形编码块

1、CTU(Coding Tree Units)编码树单元

   在编码器划分CTU之前,帧还会被划分为slice和tile。
    根据编码器指定,将图片划分为互不重叠的编码树单元。 编码树单元的大小为2N*2N,其中,N=4,5,6。当采用YUV 4:2:0进行采样时,一个编码树单元会包含 一个2N*2N的亮度CTB两个2N-1*2N-1的色彩CTB相关的句法元素 。较大的CTU可以提供更高的压缩效率。 可以通过设置N来影响编码速度和质量。

2、CU(Coding Unit)编码单元

  每个CTU可以基于四叉树的循环分层结构划分为若干个CU。
在这里插入图片描述

图一

  如图一所示,将一个64x64大小的CTU分为了不同尺寸的CU,其中,CU最小的尺寸为8x8。一个CU由一个亮度CB 、两个色度CB和相关的句法元素组成。一方面大的CB可以使得平缓区域编码效率提高,另一方面小的CB可以很好处理图像局部的细节。其中,使用Split flag标志位来表示是否继续向下划分。
  编码块(CB)是判断执行帧间预测还是帧内预测的决定点。

3、PU(Prediction Unit) 预测单元

  预测单元包含一切与预测相关的信息,例如:帧内预测方向,帧间预测的分割方式、运动矢量预测等。
  预测单元基于CU进行一次划分,对于大小为2Nx2N的CU其划分模式如下图所示。
请添加图片描述

图二

  (1)、skip模式是帧间预测模式之一,但编码的运动信息只有运动参数集索引,编码残差不需要编码。此时CU不用进一步划分。
  (2)、帧内编码模式,此时预测单元可选2Nx2N或NxN。NxN仅对8x8的CU可用(避免语法冗余,因为对于不是最小尺寸的CU来说,已经判断过一次划分判定,并且结果为不划分)。
  (3)、帧间编码模式,此时预测单元可选有8种。其中,2N × \times ×nU和2N × \times ×nD分别以上下1:3、3:1的比率划分,nL × \times × 2N和nR × \times × 2N分别以左右1:3、3:1的比率划分。

4、TU(Transform Unit)变换单元

HEVC以TU作为变换和量化的基本单元。TU以四叉树的形式划分。
请添加图片描述

图三

  如图三所示,TU的划分依赖于CU。在一个CU内,允许TU跨越多个PU,以四叉树的形式递归划分。TU的大小为4x4~32x32。大块的TU能将能量更好的集中,小块的TU能保存更多的图像细节。

二、帧内预测模式

  帧内预测主要基于已编码像素的重建值进行预测: f ^ \hat{f} f^(x,y)= ∑ ( k , l ) ∈ Z \sum_{(k,l)\in Z} (k,l)Z ak,l f ~ \widetilde{f} f (k,l)。其中,Z为参考像素区域,k,l为参考像素坐标,ak,l为二维预测系数。预测误差为:e(x,y) = f(x,y)- f ^ \hat{f} f^(x,y)。

1、亮度帧内预测

  HEVC的帧内预测支持5种大小的PU:4 × \times × 4、8 × \times × 8、16 × \times × 16、32 × \times × 32、64 × \times × 64,其中每种大小都对应着35种预测模式,分别是模式0:Planar模式;模式1:DC模式;模式2~34为33种角度模式,其中角度如图四所示。
请添加图片描述

图四

请添加图片描述

图五

(1)、Planar模式

 Planar模式适用于像素缓慢变化区域。其在(x,y)点处的预测值为:
p r e d V [ x ] [ y ] = ( N − y ) p [ x ] [ 0 ] + y ∗ p [ 0 ] [ N + 1 ] p r e d H [ x ] [ y ] = ( N − x ) p [ 0 ] [ y ] + x ∗ p [ N + 1 , 0 ] p r e d s a m p l e s [ x ] [ y ] = ( p r e d V [ x ] [ y ] + p r e d H [ x ] [ y ] + N ) > > ( l o g 2 N + 1 ) predV[x][y] =(N-y)p[x][0] + y*p[0][N+1]\\ predH[x][y] =(N-x)p[0][y] + x*p[N+1,0]\\ predsamples[x][y]=(predV[x][y] +predH[x][y]+N)>>(log_2N+1) predV[x][y]=(Ny)p[x][0]+yp[0][N+1]predH[x][y]=(Nx)p[0][y]+xp[N+1,0]predsamples[x][y]=(predV[x][y]+predH[x][y]+N)>>(log2N+1)
 其中,p[x][0]表示的是Rx,0处的像素值,>>表示C++中的右移运算符。

(2)、DC模式

d c V a l = ( ∑ x = 1 N p [ x ] [ 0 ] + ∑ y = 1 N p [ 0 ] [ y ] + N ) > > ( l o g 2 N + 1 ) dcVal =(\sum_{x=1}^Np[x][0]+\sum_{y=1}^Np[0][y]+N)>> (log_2N+1) dcVal=x=1Np[x][0]+y=1Np[0][y]+N)>>(log2N+1)
对于色度分量和大于16x16的亮度分量,块内像素预测值都等于dcVal。对于小于等于16x16的亮度分量,则块内紧邻参考像素的边缘像素点需要与参考像素加权处理。
p [ 1 ] [ 1 ] = ( p [ 1 ] [ 0 ] + p [ 0 ] [ 1 ] + 2 ⋅ dcVal + 2 ) > > 2 p [ x ] [ 1 ] = ( p [ x ] [ 0 ] + 3 ⋅ dcVal + 2 ) > > 2 , x = 2 , 3 , … … N p [ 1 ] [ y ] = ( p [ 0 ] [ y ] + 3 ⋅ dcVal + 2 ) > > 2 , y = 2 , 3 , … … N p[1][1]=\left(p[1][0]+p[0][1]+2\cdot\text{dcVal}+2\right)>>2\\ p[x][1]=\left(p[x][0]+3\cdot\text{dcVal}+2\right)>>2, x= 2,3,……N\\ p[1][y]=\left(p[0][y]+3\cdot\text{dcVal}+2\right)>>2, y= 2,3,……N\\ p[1][1]=(p[1][0]+p[0][1]+2dcVal+2)>>2p[x][1]=(p[x][0]+3dcVal+2)>>2,x=2,3,……Np[1][y]=(p[0][y]+3dcVal+2)>>2,y=2,3,……N

(3)、角度模式

参考像素获得

对于2~10和26~34个角度模式而言,参考像素分别是左侧和上侧的2N+1个像素值,无需投影。
R e f [ x ] = R 0 , x , x = 0 , 1 , ⋯   , 2 N R e f [ x ] = R x , 0 , x = 0 , 1 , ⋯   , 2 N \mathrm{Ref}[x]=R_{_{0,x}},x=0,1,\cdots,2N\\ \mathrm{Ref}[x]=R_{_{x,0}},x=0,1,\cdots,2N Ref[x]=R0,x,x=0,1,,2NRef[x]=Rx,0,x=0,1,,2N
对于11~25号模式,当前块的预测需要同时用到上方以及左侧的像素,所以需要用到“投影像素”,来得到参考像素列表。
在这里插入图片描述

图六

其中,对应关系的计算公式为:
Ref ⁡ [ x ] = { R x , 0 , x ⩾ 0 R 0 , y ( x ) , x < 0 y ( x ) = Round ⁡ ( 32 ⋅ x offset ⁡ [ M ] ) \begin{gathered} \operatorname{Ref}[x]=\begin{cases}R_{x,0},&x\geqslant0\\R_{0,y(x)},&x<0\end{cases} \\ y(x)=\operatorname{Round}\left(\frac{32\cdot x}{\operatorname{offset}[M]}\right) \end{gathered} Ref[x]={Rx,0,R0,y(x),x0x<0y(x)=Round(offset[M]32x)
其原理是相似三角形 y ( x ) x = 32 offset ⁡ [ M ] \frac{y(x)}{x}=\frac{32}{\operatorname{offset}[M]} xy(x)=offset[M]32,Round()表示四舍五入。offset[M]可以由图四查看。例如,模式20的offset[M]=-21 (将一条边划分为65个小格,每个角度模式对应着不同数量的小格的偏移)。

预测值获得

在获得参考像素之后,预测像素的得到过程:
p o s = ( y ⋅ o f f s e t [ M ] ) > > 5 ω = ( y ⋅ o f f s e t [ M ] ) & 31 P x , y = ( ( 32 − ω ) ⋅ R e f [ p o s + x ] + ω ⋅ R e f [ p o s + 1 + x ] + 16 ) > > 5 \mathbf{pos}=\left(\begin{matrix}y\cdot\mathbf{offset}[M]\\\end{matrix}\right)>>5\\ \omega=\begin{pmatrix}y\cdot\mathrm{offset}[M]\end{pmatrix}\&31\\ P_{x,y}=\left((32-\omega)\cdot\mathrm{Ref}\left[pos+x\right]+\omega\cdot\mathrm{Ref}\left[pos+1+x\right]+16\right)>>5 pos=(yoffset[M])>>5ω=(yoffset[M])&31Px,y=((32ω)Ref[pos+x]+ωRef[pos+1+x]+16)>>5
我的理解:
1、pos是利用相似三角形原理获得的参考像素的相对坐标运动。
2、因为实际位置通常不是整数,所以需要进行插值, ω \omega ω 就是插值的权重。a%b=a&(b-1),仅在b=2N 下成立。所以&31等价于对32取余数。
3、这里的公式一般都是为了C++上执行,所以pos出来的应该是int类型,+16是为了四舍五入。(猜测的)

2、色度帧内预测

色度仅有五种预测模式:
1、模式0:planar模式
2、模式1:垂直模式(角度模式26)
3、模式2:水平模式(角度模式10)
4、模式3:DC模式
5、模式4:对应的亮度分量模式。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值