天天看點

H.264/AVC 幀間預測1、移動補償塊的大小2、 子像素移動矢量3、移動矢量預測

在早前介紹MPEG-2的時候,就介紹過幀間預測,它是從過去編碼後重構的相鄰幀(參考幀)的樣本,預測目前幀(待編碼幀)樣本的過程。這一過程分為三個步驟:

(1)在參考幀中,找出與待編碼幀圖塊的最佳比對塊,所謂最佳比對塊,即這兩個圖塊的內插補點最小。在數學上,通常用圖塊中樣本值內插補點的絕對值,也即AE(absolute difference)來表示,進一步也可用SAE,也即絕對值誤差之和來表示。在查找最佳比對塊時,會涉及一系列的搜尋算法,這也是幀間預測的一個研究方向。

(2)找到最佳比對塊之後,就可以計算出移動矢量,它是幀間預測最重要的兩個參數之一。

(3)另一個重要的參數,就是參考幀中的最佳比對塊,與待編碼幀中對應的圖塊之間的內插補點,也即移動補償量。

是以隻要我們知道了移動矢量和補償量,就可以根據參考幀,預測出目前幀。這樣對于編碼的好處就是,對于預測幀,我們隻需要對移動矢量和補償量進行編碼,就可以消除時間方向的備援。

這也就是MPEG-2和MPEG-1時,所講的幀間預測的原理。那H.264/AVC又有何不同呢?就像在上一篇幀内預測裡說的,H.264/AVC的大小可變的預測塊,在幀間預測裡同樣可用。

  • (1)也就是移動補償塊的大小可變,
  • (2)而且移動矢量的計算精度,可以小到1/4像素,你沒看錯,是四分之一像素。
  • (3)而且更進一步,移動矢量也可由相鄰塊進行預測得到。

下面我們就圍繞這三點進行展開。

1、移動補償塊的大小

同幀内預測一樣,H.264的移動補償塊的大小,同樣可以從16x16,小到4x4。但是要注意的是,對于每個宏塊、宏塊區、子宏塊或子宏塊區,都需要單獨的移動矢量,而且每個移動矢量和分區方法(宏塊的劃分方法),都必須編碼并加到壓縮位流裡,這樣解碼器才能正确解碼。

是以雖然小的移動補償塊,可以産生比較好的補償效果,但是移動補償塊越小,搜尋最佳比對塊的計算量也越大,需要編碼的移動矢量的數目和分區方法也越多。

是以在幀間預測的時候,并不是移動補償塊越小越好,因為我們需要在編碼效率與編碼品質上尋求一個平衡。是以在實際中,可以根據視訊的内容來進選擇。比如對于移動比較平緩的部分,使用比較大的補償塊,而對于移動比較劇烈、畫面比較複雜、細節較多的部分,用比較小的補償塊。

2、 子像素移動矢量

就像上面說的,移動矢量的計算精度,可以小到1/4像素,這其實就是子像素移動矢量,子的意思是它不是一個整像素得到,而是利用多個像素進行插值得到。

為什麼需要這樣做呢?我們知道,通過采樣得到的樣本數是有限的,也就是說一幅圖像的像素點是有限的,這也就是栅格圖像的特點。這樣就會産生,當圖像分辨率确定之後,也就是采樣的樣本數确定後,樣本與樣本之間的內插補點随機也确定下來,有時候這個內插補點可能過大,達不到我們的計算精度。

這就要求在兩個樣本之間的位置,使用子像素這一概念,而它的樣本值,則利用它附近的樣本值,通過插值計算得到。

H.264/AVC 幀間預測1、移動補償塊的大小2、 子像素移動矢量3、移動矢量預測

像素位置

如上圖所示,圖中空心圓(○)表示實際樣本的位置,也就是原本采樣的樣本位置。圖中的方塊(口),表示兩個樣本中間的位置,也即1/2像素位置。三角形(△)則處于兩個樣本之間1/4的位置,稱為1/4像素位置。

有時候,通過搜尋插值樣本,可以為目前圖塊,找到比較準确的移動矢量和移動補償量,這就是子像素移動補償。

通過子像素搜尋最佳比對圖塊的步驟如下:

H.264/AVC 幀間預測1、移動補償塊的大小2、 子像素移動矢量3、移動矢量預測

移動估算

  • (1)第一步,肯定是去搜尋整像素,也即原采樣的樣本,得到圖中最佳整像素(實心圓圈○)。
  • (2)然後用半像素搜尋得到最佳比對結果(實心方塊口),與整像素比對結果比較,看看有沒有改善。
  • (3)需要的話再使用1/4像素搜尋,得到最佳比對結果(實心三角形△),與前面比對結果比較,看看有沒有改善

下圖為一個目前幀中,要預測的4x4的亮度塊,在參考幀中尋找最佳比對塊的過程:

H.264/AVC 幀間預測1、移動補償塊的大小2、 子像素移動矢量3、移動矢量預測

圖中b和c,就是分别使用整像素搜尋和半像素搜尋,得到的移動矢量。

3、移動矢量預測

前面我們說,每個宏塊、子宏塊的移動矢量,都需要編碼和傳送,解碼器才能正确解碼。但是在這種情況下,圖像的壓縮比将會損失慘重,尤其當使用了較小的移動補償塊時,是以這就催生了移動矢量預測的産生。

也就是說我們可以選擇性的,不編碼和傳送某些移動矢量,這些未編碼的移動矢量,可以通過已編碼的相鄰塊的移動矢量進行預測産生。

同樣的,我們會對實際的移動矢量,與預測的移動矢量之差,進行編碼和傳送。

如下圖以待預測圖塊E為例:

H.264/AVC 幀間預測1、移動補償塊的大小2、 子像素移動矢量3、移動矢量預測

塊大小相同的目前塊(E)和相鄰塊

如圖所示,目前塊的預測矢量,可以用塊大小相同的相鄰塊A、B、C來進行預測。

H.264/AVC 幀間預測1、移動補償塊的大小2、 子像素移動矢量3、移動矢量預測

塊大小不同的目前塊(E)和相鄰塊

如圖所示,目前塊的預測矢量,可以用塊大小不同的相鄰塊A、B、C來進行預測。

在處理的時候,我們可以把目前塊E的預測矢量,取成A、B、C塊移動矢量的中值。

繼續閱讀