整个帧内预测编码如下图所示:
第一步:参考像素准备
说明:由于图像存在空域的相关性,所以总是选择距离当前预测块(PU)最近的已编码像素作为当前预测块(PU)内像素的参考像素,在HEVC
中就是选择当前PU上面的一行和左边的一列。具体可以描述为,当前N * N的预测块(PU)正上方的N个像素,右上方N个像素,左侧N个像素,左下方N个像素,左上角1个像素,共4N+1
个像素作为参考像素,示意图如下:
需要注意的是,在某些情况下,在图像的边界或者Tile或Slice边界时某些参考像素不可用,也有可能A和E区域尚未编码,所有其像素不可用,这时就要寻找其他像素对这些区域进行填充,分别存在以下几种情况:
- 若A区域像素不存在是则用B区域最下方的像素点对该区域进行填充,若E区域不存在则用D区域最右侧的像素点进行填充,如下图所示
- 如果所有区域的像素都不存在,则所有参考像素都用
R=1<<(BitDepth-1)
的值来填充,例如对于8比特像素用128填充,10比特像素用512填充
第二步:参考像素滤波
在利用参考像素对当前预测块进行预测前,通常要先进行参考像素的滤波,目的是为了更好的利用邻近像素之间的相关性,提高预测的精度,并不是所有的预测块大小和所有的预测模式都要进行参考像素的滤波处理,只有某些块和某些预测模式需要,通常的操作是使用一个3抽头的低通滤波器进行处理,具体的情况如下
- 非角度模式:对于尺寸大小为4 * 4 的PU不需要进行平滑滤波(角度预测模式同),对于其他尺寸的PU,如果它的预测模式是DC模式,则不需要进行平滑滤波;如果是planar模式则需要平滑滤波
- 角度模式:
- 对于8 * 8的PU只对模式2,18,34进行常规平滑滤波
- 对于16 * 16的PU除了模式9,10,11,25,26,27外,其他所27个角度模式都需要进行常规平滑滤波
- 对于32 * 32的PU除了模式10,26外其他所有31个角度模式都要进行常规平滑滤波或者强滤波处理
常规滤波与平滑滤波
- 常规滤波:3抽头的低通滤波器的抽头系数为[1,2,1]/4
- 强滤波:强滤波只在32 * 32 PU上进行,且要满足下列条件
a b s ( R 0 , 0 + R 0 , 2 N − 2 R 0 , N ) < T h r e s h o l d abs\left ( R_{0,0}+R_{0,2N}-2R_{0,N} \right ) < Threshold abs(R0,0+R0,2N−2R0,N)<Threshold
a b s ( R 0 , 0 + R 2 N , 0 − 2 R N , 0 ) < T h r e s h o l d abs\left ( R_{0,0}+R_{2N,0}-2R_{N,0} \right ) < Threshold abs(R0,0+R2N,0−2RN,0)<Threshold
其 中 T h r e s h o l d = 1 < < ( B i t D e p t h − 5 ) 其中Threshold = 1 << \left ( BitDepth-5 \right ) 其中Threshold=1<<(BitDepth−5)
强滤波的计算方法:
R F x , 0 = ( ( 64 − x ) ∗ R 0 , 0 + x ∗ R 2 N , 0 + 32 ) > > 6 RF_{x,0}=\left ( \left ( 64-x \right )*R_{0,0}+x*R_{2N,0}+32 \right ) >> 6 RFx,0=((64−x)∗R0,0+x∗R2N,0+32)>>6
R F 0 , y = ( ( 64 − y ) ∗ R 0 , 0 + y ∗ R 0 , 2 N + 32 ) > > 6 RF_{0,y}=\left ( \left ( 64-y \right )*R_{0,0}+y*R_{0,2N}+32 \right ) >> 6 RF0,y=((64−y)∗R0,0+y∗R0,2N+32)>>6
其 中 下 标 为 x , y = 1 , 2 , … … 2 N − 1 的 像 素 点 以 及 R 0 , 0 , R 2 N , 0 , R 0 , 2 N 像 素 点 不 需 要 滤 波 其中下标为x,y=1,2,……2N-1的像素点以及R_{0,0},R_{2N,0},R_{0,2N}像素点不需要滤波 其中下标为x,y=1,2,……2N−1的像素点以及R0,0,R2N,0,R0,2N像素点不需要滤波
第三步:帧内预测模式的选择
HEVC
中总共有35种帧内预测模式,分别为DC模式,Planar模式和33中角度模式。其中217为水平模式,1934为垂直模式,模式10是水平方向,模式26是垂直方形,这些角度模式中越靠近水平或垂直方向分布越密集,原因在于自然界中物体在水平或垂直方向运动较为普遍,所以这些方向的角度模式更多一些。
根据具体帧内预测模式利用参考像素计算预测值的方法:
(1)、Planar模式:对于(x,y)位置处的像素P,如果利用Planar模式计算它的预测值,需要用到的参考像素点有正上方、正左方、当前PU右上方第一个和左下方第一个像素,具体计算方式如下(对PU内的每个像素都采用这样的方法计算)
P
x
,
y
H
=
(
N
−
x
)
⋅
R
0
,
y
+
x
⋅
R
N
+
1
,
0
P_{x,y}^{H} = \left ( N-x \right )\cdot R_{0,y}\ +x\cdot R_{N+1,0}
Px,yH=(N−x)⋅R0,y +x⋅RN+1,0
P x , y V = ( N − y ) ⋅ R x , 0 + y ⋅ R 0 , N + 1 P_{x,y}^{V} = \left ( N-y \right )\cdot R_{x,0}\ +y\cdot R_{0,N+1} Px,yV=(N−y)⋅Rx,0 +y⋅R0,N+1
P x , y = ( P x , y H + P x , y V + N ) > > ( l o g 2 ( N ) + 1 ) P_{x,y} = \left ( P_{x,y}^{H}+P_{x,y}^{V}+N \right )>>\left ( log_{2} \left ( N \right )+1\right ) Px,y=(Px,yH+Px,yV+N)>>(log2(N)+1)
(2)、DC模式:这种模式下首先由计算当前PU上方和左侧像素的平均值
若当前PU为色度PU或尺寸大于1616的亮度PU,则PU内所有像素预测值都为下面计算出的dcValue
d
c
V
a
l
u
e
=
(
∑
x
=
1
N
R
x
,
0
+
∑
y
=
1
N
R
0
,
y
+
N
)
>
>
(
l
o
g
2
(
N
)
+
1
)
dcValue =\left ( \sum_{x=1}^{N}R_{x,0}+\sum_{y=1}^{N}R_{0,y}+N\right ) >> \left ( log_{2}\left ( N \right )+1 \right )
dcValue=(x=1∑NRx,0+y=1∑NR0,y+N)>>(log2(N)+1)
其他情况预测值的情况(尺寸小于或等于1616的亮度预测块),需要按照下面的方法对预测值进行计算:
左
上
角
的
像
素
:
P
1
,
1
=
(
R
1
,
0
+
R
0
,
1
+
2
⋅
d
c
V
a
l
u
e
+
2
)
>
>
2
左上角的像素:P_{1,1}=\left ( R_{1,0}+R_{0,1}+2\cdot dcValue+2 \right )>>2
左上角的像素:P1,1=(R1,0+R0,1+2⋅dcValue+2)>>2
第 一 行 像 素 ( P 1 , 1 除 外 ) : P x , 1 = ( R x , 0 + 3 ⋅ d c V a l u e + 2 ) > > 2 , x = 2 , 3 … N 第一行像素\left ( P_{1,1} 除外\right ):P_{x,1}=\left ( R_{x,0} +3\cdot dcValue+2\right )>>2, x=2,3…N 第一行像素(P1,1除外):Px,1=(Rx,0+3⋅dcValue+2)>>2,x=2,3…N
第 一 列 像 素 ( P 1 , 1 除 外 ) : P 1 , y = ( R 0 , y + 3 ⋅ d c V a l u e + 2 ) > > 2 , y = 2 , 3 … N 第一列像素\left ( P_{1,1} 除外\right ):P_{1,y}=\left ( R_{0,y} +3\cdot dcValue+2\right )>>2, y=2,3…N 第一列像素(P1,1除外):P1,y=(R0,y+3⋅dcValue+2)>>2,y=2,3…N
其 他 像 素 : P x , y = d c V a l u e , x , y = 2 , 3 … N 其他像素:P_{x,y}=dcValue,x,y=2,3…N 其他像素:Px,y=dcValue,x,y=2,3…N
(3)、角度模式
因为角度预测的角度延伸方向即可能涉及到上方的参考像素以及左方参考像素,若将这些像素都投影到一行或者一列就更利于处理。例如对于垂直类的角度模式将左侧的的像素投影到上方。因为每个角度方向都不同,所以每个角度对于垂直方向(模式26)或水平方向都有一个偏移值,具体如下图所示:
以垂直类模式M(对应的偏移值为offset[M])为例构造它的一维参考像素列表Ref[]
第一种情况:offset[M]<0,即模式18到25,构造参考像素列表的计算方法如下:
R
e
f
[
x
]
=
{
R
x
,
0
,
x
≥
0
R
0
,
y
(
x
)
,
x
<
0
Ref\left [ x \right ]=\left\{\begin{matrix} R_{x,0},x\geq 0 & \\ R_{0,y\left ( x \right )},x< 0 & \end{matrix}\right.
Ref[x]={Rx,0,x≥0R0,y(x),x<0
y ( x ) = R o u n d ( 32 ⋅ x o f f s e t [ M ] ) , 其 中 R o u n d 表 示 四 舍 五 入 y\left ( x \right )=Round\left ( \frac{32\cdot x}{offset\left [ M \right ]} \right ),其中Round表示四舍五入 y(x)=Round(offset[M]32⋅x),其中Round表示四舍五入
第二种情况:offset[M] >= 0 ,即模式26到33,构造参考像素列表的计算方法如下:
R
e
f
[
x
]
=
R
x
,
0
,
x
=
0
,
1
,
…
2
N
Ref\left [ x \right ]= R_{x,0},x= 0,1,…2N
Ref[x]=Rx,0,x=0,1,…2N
下面以4*4大小的PU为例,展示所有预测模式的参考像素投影示例:
通过上述计算便可以得到当前预测块PU的一个一维的参考像素列表Ref[],
下面介绍预测块中每一个具体像素(x,y)对应的参考像素在Ref中的位置pos
的计算方法:
p
o
s
=
(
y
∗
o
f
f
s
e
t
[
M
]
)
>
>
5
pos= \left ( y*offset\left [ M \right ] \right )>>5
pos=(y∗offset[M])>>5
像素(x,y)对应的权重因子w的计算方法如下:
ω
w
=
(
y
∗
o
f
f
s
e
t
[
M
]
)
&
31
,
其
中
&
表
示
按
位
与
运
算
\omega w=\left ( y*offset\left [ M \right ] \right )\&31,其中\&表示按位与运算
ωw=(y∗offset[M])&31,其中&表示按位与运算
可计算像素(x,y)的预测值为:
P
x
,
y
=
(
(
30
−
ω
)
⋅
R
e
f
[
p
o
s
]
+
ω
⋅
R
e
f
[
p
o
s
]
+
16
)
>
>
5
P_{x,y}=\left ( \left ( 30-\omega \right )\cdot Ref\left [ pos \right ]+\omega \cdot Ref\left [ pos \right ] +16\right )>>5
Px,y=((30−ω)⋅Ref[pos]+ω⋅Ref[pos]+16)>>5
注 意 , 对 于 模 式 26 计 算 方 法 如 下 : 注意,对于模式26计算方法如下: 注意,对于模式26计算方法如下:
P x , y = R x , 0 + ( ( R 0 , y − R 0 , 0 ) > > 1 ) P_{x,y}=R_{x,0}+\left ( \left ( R_{0,y} -R_{0,0}\right )>>1 \right ) Px,y=Rx,0+((R0,y−R0,0)>>1)
第四步:PU边界值平滑
目的:去除边界的不连续效应,对于小于32*32的PU,当使用模式1、10、26时,PU预测后的第一行和第一列要进行滤波处理
第五步:帧内模式编码
帧内预测模式选定之后,预测模式要被编码送到解码端。因为帧内预测有35中模式需要6比特才能编码。HEVC
为当前PU定义了3种最可能的帧内预测模式(Most Probable Modes)MPM
[0]、MPM
[1]、MPM
[2],如果当前帧内预测模式在MPM
中,则只需要编码器索引即可,如果不在MPM
内而在另外32种模式中只需要5bit
即可编码。
MPM
的构造需要利用其左侧和上方相邻已编码PU的模式信息作为参考
构造MPM
的方法:
(1)、ModeA
和ModeB
的帧内预测模式相同的情况下:
-
ModeA
和ModeB
都为DC模式或Planar模式MPM
[0]=PlanarMPM
[1]=DCMPM
[2]=26 -
ModeA
和ModeB
都为角度模式MPM
[0]=ModeA
MPM
[1]和MPM
[2]为与ModeA
相邻的两个角度模式
(2)ModeA
和ModeB
不相同
MPM
[0]=ModeA
MPM
[1]=ModeB
- 若
ModeA
和ModeB
都不是Planar模式,MPM
[2]=planar - 当上一条不满足时,若
ModeA
和ModeB
都不是DC模式,MPM
[2]=DC - 当上面条件都不满足时,
MPM
[2]=26
欢迎关注博主微信公众号,一起学习交流!!!