HEVC的幀間預測

1.MV搜索

MV搜索的目的是要在參考幀中找到最佳匹配塊,即Cost最小。其中Cost與圖像失真和碼率有關,例如,圖像失真越小,碼流也越小(即編碼的比特大小),Cost就最小。然而這是不可能的。可以理解爲,圖像越逼真,需要編碼的量就越大,我們只能在圖像質量和編碼大小二者中做一個trade off。Cost的定義可以如下所示:

cost=ΔD+λR

其中ΔD 的D是Difference,是圖像的失真的衡量,可以是SAD,SSE等等,λ 是拉格朗日乘數,就是一個實數係數而已,R 是碼流的大小。

具體的搜索方法是:
1.確定起始搜索點,(可以)利用Cost最小的AMVP(Advanced Motion Vector Prediction)作爲起始搜索點(非強制)。

AMVP是一種運動向量預測,利用空域和時域上的運動向量的相關性,爲當前PU建立候選預測MV(MVP)列表,如下圖1所示。
候選列表
圖1 當前PU候選MV列表

2.在參考幀中按照一定規則搜索其它塊(具體方法標準沒有強制要求,此處省略)
3.計算每個塊的cost,取最小的cost的塊作爲最佳匹配塊

整個過程是,我們在一個當前幀(非參考幀)裏有一個塊,我們想要找這個塊在參考幀中的最佳匹配塊(另一個塊),計算兩個塊之間位置的位移,這樣,通過參考幀加上這個位移就得到了我們的當前幀,這種編碼方式可以獲得更小的碼率。

2.MV預測

所謂預測,是利用空域上或時域上相鄰塊的MV拿來給自己使用,或者說預先人爲這些塊可以給自己使用。其中的原理是利用了空間鄰域的局部性和時間鄰域的局部性,即空間上相鄰塊的MV很有可能比自己搜索出來的MV更好,時域同理。

2.1.Merge模式

Merge模式的第一步是構建一個空域或時域的MV候選列表,所謂候選列表是說選擇的一些相鄰的塊,到時將會用到這些候選列表中的塊的MV和搜索出來的MV做對比,看看它們誰的率失真Cost比較小,就選擇那個作爲最佳的MV。這裏有兩個問題,第一是,搜索加上和候選列表比較,不是會增加算法的複雜度嗎?答案是,是的,確實是會增加算法的複雜度,但也是爲了更好的效果;第二個問題是,既然已經搜索出來了最佳MV爲什麼還要再用候選列表再比較一次?這個問題和第一個問題也是相關的,首先是爲了更好的效果,其次是merge模式下,候選列表是有限的,標準規定最多就5個,因此,編碼這些列表內塊的index需要的比特位是很少的,這樣,如果可以用候選列表內的塊代替最佳MV,那麼只需要編碼這些index,可以節省比特。總的來說就是,用算法的複雜度換取更高的PSNR(即更低的圖像失真和更低的碼率)。

那我們如何構建候選列表呢?

2.1.1.空域候選列表的構建

在空間上,我們如圖1所示,選取5個可選的候選塊,根據A1B1B0A1(B2) 的順序構建,其中,只有前面四個出現缺失時纔會取B2。取這樣的順序的原因是,編碼是按之字形掃描的,因此A1是最有可能已經編好的,雖然B1也很可能是編號的,但是如果在第一行的話,整個第一行都是沒有B1的,當然如果在第一列的話A1也是沒有的,若出現某個沒有的情況,纔會取B2。這也同時解釋了候選列表爲什麼不用右下角的塊加入候選列表,也是因爲編碼順序的問題。

2.1.2.時域候選列表的構建

時域候選列表
圖2 時域候選列表

在參考幀中,候選的塊有H和C兩個,這裏C的左上角是PU的中心,H的左上角是PU的右下角,我們首先找H位置的塊,如果H不存在或者H在下一行的CTU中,就找C。至於爲什麼H在下一行的CTU就不找,我也不知道,可能是出於硬件實現的角度,因爲參考幀的信息都是要存儲的,在預取的時候,可能是先考慮取相鄰的一些CTU。

確定了同位PU後,不能直接使用,還需要進行比例伸縮,原因是同位PU和當前PU的參考幀可能不一樣。具體的公式是:

curMV=tdtbcolMV

比例伸縮
圖3 比例伸縮

其中td和tb是幀之間的時間差。如圖3,col代表collocated,意思是對應,即時域上同位塊對應的幀;cur意思是current幀。這裏還分成了當前幀和參考幀,對應幀和對應幀的參考幀,以說明,“同位塊對應的幀可能與當前幀的參考幀不相同”。既然不相同,就有可能出現從對應幀相對於它自己的參考幀求得的MV與當前幀與當前幀的參考幀的MV不同的情況。爲了解決這種情況,我們就用了上述公式所示的比例伸縮方法。原理大致可以想象成,有一個物體正在進行勻速運動,從Col_ref到Col_pic間的運動的尺度/規模/距離/大小和Cur_ref到Cur_pic之間尺度/規模/距離/大小比例就是tdtb 。如圖4所示,小球從A點運動到D點,已知距離AC和BD,求A到C的運動矢量(距離加方向)和B到D的運動距離之比。乍一看好像是廢話,可是這裏的前提是A到D做的是勻速直線運動。當然,實際上視頻裏的運動是不可能那麼理想的,所以這裏就存在精度的問題–這種粗暴的方法在應用上精度會不高。HEVC中有精度更高的算法,但總的原理是比較相似的。

2.2.AMVP模式

在之前說的Merge模式下建立了一個候選列表,我們希望的是在候選列表中的塊的MV可以直接代替當前塊的MV,這樣我們只需要編碼這些候選列表塊的編號(一般很小)就可以,也就是這樣可以節省碼率。但是萬一要是候選列表裏的塊的MV經過比較以後發現不是最好的怎麼辦?這時我們就需要進入AMVP模式。

AMVP模式下也需要候選列表,只不過它的候選列表的長度是2,也包括時域和空域,而且它也不編碼這個列表的索引,而是編碼MVD(Motion Vector Difference),MVD指的是當前搜索到的最佳MV和AMVP候選列表中MV的差值。在AMVP模式下,候選塊的位置其實是和Merge模式一樣的,只不過只在圖1中的A0和A1中選擇一個B0和B1中選擇一個MV,如果這兩個MV的大小相同,則合併爲一個MV。但是這裏還有一個問題,就是即使這些塊都在同一個幀內,它們的參考幀也有可能不同,當它們參考的幀不同的時候,就要像之前說的時域的情況一樣,參考使用比例伸縮的方法。AMVP模式下的時域候選列表的選取和Merge模式下一樣。如果在選取了空域和時域的候選列表之後,所得到的候選列表不足2個(即候選列表裏的塊爲未編碼塊或不存在)則用(0,0)作爲MV補充。

2.3.Skip 模式

Skip模式只存在於幀間預測時,即P幀或B幀,Skip模式下,一個CU的大部分語法元素都不需要編,一個CU是否爲Skip模式,取決於三點,一是該CU的劃分方式爲2N×2N ,二是該CU下PU的預測方式時Merge模式,第三是該CU的殘差變換系數全爲0。這個意義上可以將Skip視爲Merge模式的一種特殊情況。

2.4.PCM模式

PCM下不經過預測變換,就是上面的過程都不需要了,搜索預測等等都不需要了,取而代之的是直接對像素值進行編碼,代碼如如圖4:
圖4
上述代碼循環中cbSize只的是8*8或4*4,例如8*8的CB,log2CbSize就等於3,那麼括號裏它左移一位就爲6,1左移六位就爲64了,也就是8*8。至於爲什麼不直接用22log2CbSize ,可能是因爲位運算速度更快,處於優化考慮吧。

2.5.加權預測

MV的作用是去模擬一個塊的運動的方向,但就我們的觀影體驗來說,有時候物體的變化並不帶表它移動了,也有可能僅僅是顏色變化了。當所有像素做了一個整體變化的時候,可以用加權預測來帶來更好的效果。加權預測是以slice爲基本單位的。加權預測的值時被定義在在slicesegmentheader() 裏的,也就是說一個slice存儲的是一樣的。同樣,加權預測旨在P_Slice和B_Slice中有。

加權預測有兩種,一種是默認的加權預測,一種是

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