编码器性能的高低可以从解码后图像的质量(失真度)和编码后码流的大小决定。
图像失真度的评价指标有以下几种:
平方误差和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的最小值,取之即可。