原帖地址:http://blog.sina.com.cn/s/blog_4de7908201000aqf.html
http://blog.csdn.net/smells2/article/details/7699987
http://blog.sina.com.cn/s/blog_4de5e1e201000arb.html
Rate Distortion Optimation (率失真優化)
在H.264編碼過程中有許多的模式可以選擇,有些模式的圖像失真較小,但是碼率卻很大;有些模式的圖像失真較大,但是碼率卻很小。人們就想了,有沒有一種方法使得在不超過某最大碼率的情況下,失真達到最小。即 min{D} s.t. R<=Rmax ,s.t.表示“在以下條件”。
實現過程可以描述爲:
1.以特定的編碼參數將視頻編碼,計算編碼後的碼率和失真。得到一個碼率R和失真D組成的R-D點
2.重複上述第一步,得到其他R-D點
從圖像上可以看出,對於給定的特定的Rmax,D最小的點出現在曲線上。
現在的目標是找到一個編碼參數,使得在這樣的情況下R-D點能夠儘可能的逼近這條曲線。
J是一個包含D和R的函數,lamda是Lagrange係數,對應到R-D圖上那麼lamda就是斜率
對於每個可能的係數lamda,上述式子應該有對應的解。這個解就是凸曲線的切線。
我們找到最小的J就是對應一定的碼率情況下失真最小的模式,一次模式編碼會達到我們一開始所要設想的結果。
缺點是:模式如果過多的話這個過程的計算式相當的耗時的,所以在H.264研究中在改善算法效率和提出一些替代方法就成了非常可行的方案。
/*****************************************************************************************/
//Lambda 確定
lambda_mode=0.85 *2^((qp-12)/3.00) 幀內模式預測
lambda_motion=lambda_mode^0.5 幀間運動估計
/*****************************************************************************************/
/*****************************************************************************************/
//幾種描述失真的函數和使用場合
SAD(Sum of Absolute Difference)=SAE(Sum of Absolute Error)即絕對誤差和
SATD(Sum of Absolute Transformed Difference)即hadamard變換後再絕對值求和
SSD(Sum of Squared Difference)=SSE(Sum of Squared Error)即差值的平方和
MAD(Mean Absolute Difference)=MAE(Mean Absolute Error)即平均絕對差值
MSD(Mean Squared Difference)=MSE(Mean Squared Error)即平均平方誤差
SAD 在整數像素ME的時候使用
SATD 在1/2和1/4像素ME的時候使用
SSD 在幀內模式選擇的時候使用
/*****************************************************************************************/
Rate-Distortion Optimization 是視頻編碼中最優選擇mode的一種方法。比如h.264裏好多mode 8x8 16x16 I4x4 I16 在給定的條件下,哪個是最好的?Distortion 是指選用candidate mode產生的失真,rate是用這個mode需要的rate.他們換算成RDCost = Distortion + lamda * rate. 兩個mode誰的rdcost 低就選誰其中的數學原理是條件極值轉非條件極值。
JM 裏用的RDO是比較經典的方法。最早是Gary J.Sullivan做的 參見 IEEE Signal Processing Magazine 1998 Nov. "Rate-Distortion Optimization for video compression" rdo的經典。 h264裏的rdo還可參考CSVT H.264 special issue
/*****************************************************************************************/