編碼器性能的高低可以從解碼後圖像的質量(失真度)和編碼後碼流的大小決定。
圖像失真度的評價指標有以下幾種:
平方誤差和SSD(sum of square difference):
SSD=∑x=0M−1∑y=0N−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)|
其中
f(x,y) 原圖像在像素點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
在SSD的基礎上求了一個均值。
PSNR:
PSNR=10log10((2BitDepth−1)2MSE)
由此可見PSNR是與MSE成反比的。BitDepth指像素的深度,一般是8bit或10bit。也可以發現,如果MSE無窮小,也就是說,基本上每個點在解碼後都和原圖像沒什麼誤差,PSNR就無窮大了,但這基本上是不可能的。因爲當PSNR等於99.99的時候,帶入上式(BitDepth取較大的10比特)可得
MSE=25521010 ,爲了方便,我們就定義當MSE小於這個值的時候,PSNR強制取99.99,因爲MSE基本不可能取到那個值一下,因此不會影響計算。
PSNR往往和碼率BitRate一起來計算BD-Rate,用來衡量編碼器的性能。
圖像質量和碼流大小是不可兼得的,因此,我們需要做一個權衡。
公式
cost=ΔD+λR
其中
ΔD=f(Mode) ,
R=g(Mode) ,Mode是編碼器選擇的一些幀間幀內預測模式,R代表碼流的大小,也就是每秒編多少比特;
ΔD 表示圖像失真,也就是編碼後圖像與編碼前圖像的偏差(可以參照之前的SAD等圖像失真度計算方法),對於硬件,更傾向於用SAD計算
ΔD ;
λ 是拉格朗日乘子,就是一個實係數而已。這個公式就是要求在
R>R′ 的條件下,求最小的
ΔD ,即求條件極值。其中的數學我們可以暫時忽略,總之,我們就是要計算不同模式下的cost的最小值,取之即可。