Rate Distortion Optimization
搜索時,一個不可避免的問題就是如何對mv進行比較,從而得到最優
對於同一壓縮算法來說,碼率越高表示圖像質量越好、失真越小,但是碼率越高要求更大的存儲空間,也會增加網絡傳輸的壓力。因此在碼率與失真中找出平衡點,使壓縮效果最優,這種方法叫做R-D Optimization(碼率失真優化)
典型的高碼率下,碼率與失真關系(R-D關系式)為
$R(D) = {\alpha}{ln(\frac{\delta^2}{D})}$
$R$為碼率,$\alpha$為系數,$\delta^2$為方差,$D$為失真。
方差越大,意味着圖像細節越多,因此碼率也會越大;失真越大,意味着圖像由於壓縮所損失的細節越多,那么碼率越小。

R-D曲線
R與D好比魚與熊掌,取一方,必然會舍去另一方,兩者不可能都取得最佳,因此如何取舍,就需要權衡利弊。最好的方法,就是看哪個權重大,哪個的比例就大,權重小的比例小,這就是拉格朗日方法。
拉格朗日代價函數為:
$J = D + \lambda_{MODE} \cdot R$
要使得代價最小,那么在其導數為0處有最小值:
$\frac{dJ}{dR} = \frac{dD}{dR} + \lambda_{MODE} = 0$
現假設D與R的權重比為$\lambda_{MODE}$,並假設上方點A為根據上方結論得到的最佳位置,那么點A處有斜率:
$k = -\lambda_{MODE} = \frac{dD}{dR}$
又因為可以通過對R-D關系式求導,然后整理得:
$\frac{dD}{dR} = -\frac{D}{\alpha}$
因此,在R-D最優點處有:
$\lambda_{MODE} = \frac{D}{\alpha}$
另外,在典型的高碼率下,失真近似滿足公式:
$D = \frac{ ( 2 \cdot QUANT )^2}{12}$
把D代入上述公式,得到:
$\lambda_{MODE} = \frac{1}{3\alpha}\cdot QUANT^2$
即:
$\lambda_{MODE} = \zeta\cdot QUANT^2$
最終可以通過函數擬合得到$\zeta = 0.85$,在h.264中,當存在B幀編碼時$\zeta = 0.68$,則有:
$\begin{align*}
\lambda_{MODE}
&= 0.68\cdot QUANT^2 \\
&= 0.68 \cdot (2^\frac{QP - 12}{6})^2 \\
&= 0.68\cdot 2^\frac{QP - 12}{3}
\end{align*}$
注:QP在這里減去12是因為在h.264早期只有40個QP,而現在有52個QP
由於上面計算的時候用的是$\delta^2$(方差),即SSD,但是實際上h.264計算用的是
$\begin{align*}
SAD &= \sum_{(x,y)\in A}\left | s[x,y] - s'[x,y]\right | \\
SSD &= \sum_{(x,y)\in A}\left | s[x,y] - s'[x,y]\right |^2
\end{align*}$
那么
$\lambda_{MOTION} = \sqrt{\lambda_{MODE}}$
為了方便計算,在一般h.264的編碼器中采用的都是
$D = SAD$
而R則需要知道當前所選擇的mv與ref所占用的bit,而這些都是可以事先計算出來的,在JM中不同的mv與ref所占的bit都在編碼前被初始化了,用數組存儲起來。mv與ref采用的都是哥倫布編碼。
$R = Bit_{mv} + Bit_{ref}$
