HEVC 幀間預測技術總結

代碼版本:VTHECDec
代碼函數:motionCompensation
時間:2015/3/9
作者: LB

幀間MV預測的函數調用流程圖如下圖:
這裏寫圖片描述
由上圖可以看出,函數motionCompensation()分別調用流程圖後續的函數,完成幀間MV預測運動補償過程。整個過程主要有三部分,下面分開說明。

第一:函數getpuNum()
作用:根據Cu到Pu的劃分方式,計算Pu的個數。返回當前Cu包含的Pu的個數。
這裏寫圖片描述
幀間預測的Cu到Pu共有八種劃分方式,後四種是不規則劃分。較短的那一條邊長度佔原邊長度的 1/4。如:2NxnU UP的那一個Pu的Width = 2N * 1/4 = 1/2*N。
劃分結束之後,接着是對當前Cu的每個Pu進行運動補償,即根據MV計算參考像素值。

第二:函數get_puPartIndexAndSize()
作用: 返回當前Pu的寬高,以及Pu在當前Cu中的相對位置(最小TU爲單位計算)。

Pu在Cu中的相對位置,可以參照第一頁中的Cu,Pu,TU關係圖
以這八種劃分方式的第二個PU的相對位置爲例,假設當前CU有N個最小TU,則:
1、0 ; 2、1/2*N ; 3、1/4*N ; 4、1/4*N ;
5、1/8*N ; 6、5/8*N ; 7、1/16*N ; 8、5/16*N;

第三:函數pred_interBi()
作用:運用插值算法計算並得到參考像素值

這一部分根據編碼端傳過來的MV,以及參考像素幀,採用亞像素精度插值方法得到當前PU的像素預測值。
具體原因是,在實際場景中,由於物體的運動距離不一定是像素的整數倍,因此在幀間預測時,當前像素值的最優預測值不一定在參考幀的某個整像素點上,而是處於亞像素點上,我們採用亞像素插值運動估計,可以提高運動估計的精度,減少殘差,提高壓縮比。

(1)亮度分量插值
這裏寫圖片描述
這裏寫圖片描述

對於出於整數行或列的像素值較好計算,如下列公式:
這裏寫圖片描述
B是參考像素的比特深度,通常爲8.
對於不處於整像素值行列的像素值,需要用到前面計算出來的整像素行列的亞像素值,具體的計算公式如下:
這裏寫圖片描述
以上右移6位是在計算過程中,亞像素值的被放大爲原來的64倍,目的是在計算改的中間過程需要保持一定的精度,計算結束以後,結果被還原爲1/64。
在參考的該版本代碼中,計算當前PU的預測像素值時,需要根據其MV計算出,MV的行列是否處於整像素點上,或者處於非整像素點上,因爲這兩者的計算方法不同,在代碼實現是分開判斷實現。

(2)色度分量插值
HEVC中亮度分量的預測達到了1/4像素精度,色度分量是亮度分量的兩倍,需要達到1/8精度(相對於420格式)。採用四抽頭濾波器。
色度分量插值的具體計算過程與亮度的計算過程類似。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章