原帖地址: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
/*****************************************************************************************/