编码器性能的高低可以从解码后图像的质量(失真度)和编码后码流的大小决定。
图像失真度的评价指标有以下几种:
平方误差和SSD(sum of square difference):
SSD=∑x=0M−1∑y=0N−1|f(x,y)−f′(x,y)|2
S
S
D
=
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
|
f
(
x
,
y
)
−
f
′
(
x
,
y
)
|
2
绝对误差和SAD(sum of absolute difference):
SAD=∑x=0M−1∑y=0N−1|f(x,y)−f′(x,y)|
S
A
D
=
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
|
f
(
x
,
y
)
−
f
′
(
x
,
y
)
|
其中 f(x,y) f ( x , y ) 原图像在像素点x,y处的值, f′(x,y) f ′ ( x , y ) 代表解码后的图像在x,y处的值。对比起来,SAD的运算少了很多乘法运算,相对来说运算没那么复杂。
均方误差MSE(mean square error):
MSE=1MN∑x=0M−1∑y=0N−1|f(x,y)−f′(x,y)|2
M
S
E
=
1
M
N
∑
x
=
0
M
−
1
∑
y
=
0
N
−
1
|
f
(
x
,
y
)
−
f
′
(
x
,
y
)
|
2
在SSD的基础上求了一个均值。
PSNR:
PSNR=10log10((2BitDepth−1)2MSE)
P
S
N
R
=
10
log
10
(
(
2
B
i
t
D
e
p
t
h
−
1
)
2
M
S
E
)
由此可见PSNR是与MSE成反比的。BitDepth指像素的深度,一般是8bit或10bit。也可以发现,如果MSE无穷小,也就是说,基本上每个点在解码后都和原图像没什么误差,PSNR就无穷大了,但这基本上是不可能的。因为当PSNR等于99.99的时候,带入上式(BitDepth取较大的10比特)可得 MSE=25521010 M S E = 255 2 10 10 ,为了方便,我们就定义当MSE小于这个值的时候,PSNR强制取99.99,因为MSE基本不可能取到那个值一下,因此不会影响计算。
PSNR往往和码率BitRate一起来计算BD-Rate,用来衡量编码器的性能。
图像质量和码流大小是不可兼得的,因此,我们需要做一个权衡。
公式
cost=ΔD+λR
c
o
s
t
=
Δ
D
+
λ
R
其中
ΔD=f(Mode)
Δ
D
=
f
(
M
o
d
e
)
,
R=g(Mode)
R
=
g
(
M
o
d
e
)
,Mode是编码器选择的一些帧间帧内预测模式,R代表码流的大小,也就是每秒编多少比特;
ΔD
Δ
D
表示图像失真,也就是编码后图像与编码前图像的偏差(可以参照之前的SAD等图像失真度计算方法),对于硬件,更倾向于用SAD计算
ΔD
Δ
D
;
λ
λ
是拉格朗日乘子,就是一个实系数而已。这个公式就是要求在
R>R′
R
>
R
′
的条件下,求最小的
ΔD
Δ
D
,即求条件极值。其中的数学我们可以暂时忽略,总之,我们就是要计算不同模式下的cost的最小值,取之即可。