学习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]=(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)>>(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=1∑Np[x][0]+y=1∑Np[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]+2⋅dcVal+2)>>2p[x][1]=(p[x][0]+3⋅dcVal+2)>>2,x=2,3,……Np[1][y]=(p[0][y]+3⋅dcVal+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),x⩾0x<0y(x)=Round(offset[M]32⋅x)
其原理是相似三角形
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=(y⋅offset[M])>>5ω=(y⋅offset[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:对应的亮度分量模式。