天天看點

MPEG-1中I、B、P幀的基本編碼原理1、I幀的基本編碼原理2、P幀的基本編碼原理3、B幀的基本編碼原理總結

在上篇文章中,我們對MPEG-1有了一個輪廓性的介紹,知道視像序列中的圖像類型有三種,分别為I幀、P幀、和B幀。但是我們并沒有更深入的去了解,編碼這三種類型的圖像資料時所采用的不同方式,隻知道它們都是把圖像分為以16x16像素的宏塊、8x8像素的圖塊為基本單元進行處理的。而實際上,編碼I、P、B三種類型的圖像資料的方式并不相同,不過在進一步展開之前,我們先來講講為什麼要在這個時候講這個。

我們都知道MPEG标準的制定,是一步一步來的,有了MPEG-1之後,才有MPEG-2、-4和H.264/AVC。而在這一步又一步的拓展和優化中,後者總是繼承前者,并對前者的不足進行改善和加強。而對于MPEG-2也是這樣,它的編碼原理來自MPEG-1,而又在MPEG-1的基礎上,做了一些加強。是以如果想要了解MPEG-2,就必須要對MPEG-1的編碼原理,有個基本的認識。

我想這就是自底向上的本質,也是我們不謀而合,在這個系列所采取的方法。是以下面我們開始介紹I、B、P幀的基本編碼原理,注意是基本,說明我們并不會深入去探讨某一個方法,如DCT變換、量化、DPCM、RLE、霍夫曼編碼、算術編碼。隻需要掌握以下兩點即可:

  • 1、對編碼流程有一定的了解
  • 2、了解I、B、P幀三者編碼的不同

1、I幀的基本編碼原理

上篇說過,MPEG-1主要在時間備援和空間備援兩個方向上,去除備援資料。時間備援是幀與幀之間産生的備援資料,而空間備援則是單幀圖像中,相鄰像素間産生的備援資料。對于I幀來說,因為它是關鍵幀,既不需要參考過去的幀,也不需要參考将來的幀。是以對I幀的編碼,是為了消除空間備援資料,而且它采用的壓縮算法,和JPEG類似。如下圖:

MPEG-1中I、B、P幀的基本編碼原理1、I幀的基本編碼原理2、P幀的基本編碼原理3、B幀的基本編碼原理總結

I幀的壓縮編碼算法

從圖中可以看到,如果圖像是用RGB顔色空間表示的,則首先把它轉換成用YCbCr空間表示的圖像。然後每個圖像平面分成8x8像素的圖塊,并對每個圖塊進行離散餘弦變換(DCT)。

這裡DCT的作用非常大,看它的名字可能會覺得非常高大上,其實它就是一個矩陣變換。關于它其實都可以專門寫一篇文章出來,不過這裡我們隻需要知道它的作用即可。DCT簡單點來說,它就是将前面8x8像素圖塊的顔色空間資料,分為高頻資料和低頻資料,是以我們也常說,DCT是把資料從空間域轉換到頻率域。

那什麼是高頻和低頻呢?這裡的高頻資料是指,圖像顔色的變化比較強烈的地方,比如人像畫的輪廓與背景的交叉處,在這裡的色值變化很快,是以稱為高頻。相對的低頻就是指,顔色變化比較緩和的地方。是以DCT的作用并不是對資料進行壓縮,而是為了友善後面的操作,比如量化、RLE行程編碼、以及霍夫曼編碼。

下一步就是量化,因為人眼對高頻區域其實并不敏感,是以利用這一點,可以将高頻部分資料進行壓縮。這樣一來,圖塊的資料就會呈現兩部分,一部分是變化平滑的低頻資料,另一部分是剛壓縮過的高頻部分,數值也變得差不多。而後再經過Zig-zig編排,資料就會呈現出連續幾個值相同的的形式,比如23334551550000。這樣一來,再經過RLE行程編碼,就可以去掉連續值相同的備援資料。

因為RLE在編碼時,對相同的數值隻編碼一次,同時計算相同數值重複的次數,是以稱為行程編碼。而與RLE處于同級的DPCM,則主要是對圖塊與圖塊之間的內插補點進行編碼。這樣一來可以再次壓縮資料,之後再通過霍夫曼編碼或者算術編碼,編碼操作也就完成了。同樣霍夫曼編碼和算術編碼,也可以單獨寫一篇文章出來。

2、P幀的基本編碼原理

P幀也就是預測圖像P,與I幀不同的是,它不僅要從空間上去除備援資料,還要從時間備援方面上着手,因為它是以在它之前出現的I幀作為參考對象來編碼的。與I幀不同的是,預測圖像P的編碼是以16x16像素的宏塊為基本編碼單元的。對于P幀,為了表示它與前面I幀的關系,我們會一直用預測圖像和參考圖像這兩個詞。

其實很好想象,因為對預測圖像編碼,就是對它和參考圖像直接的內插補點進行編碼。是以我們隻需要做到以下兩點即可:

  • 1、算出目前要編碼的圖像宏塊,與參考圖像宏塊之間的內插補點
  • 2、計算出宏塊的移動矢量

比如下圖:

MPEG-1中I、B、P幀的基本編碼原理1、I幀的基本編碼原理2、P幀的基本編碼原理3、B幀的基本編碼原理總結

這張圖應該一目了然,時刻1中的人像,在時刻2移動到了圖像右側。這個過程中變化的,不隻是人像的位置,因為人在移動的時候,會有其他的動作,比如低頭、轉頭、仰頭等動作。是以我們并不僅僅要計算出人像變化之後的位置,也就是移動矢量,還要計算出兩個宏塊之間的內插補點。

當然這兩者在編碼過程中,是有個先後關系的。比如我要計算出宏塊的移動矢量,那我得找到參考圖像中的宏塊,在預測圖像中的位置吧。而更進一步,那我怎麼找到預測圖像相對于參考圖像中,圖塊的位置呢?答案是預測圖像中的某個宏塊,與參考圖像中的這個宏塊的內插補點最小,也即最佳比對宏塊。

這就引起了一系列的搜尋算法,去預測圖像中去找這個宏塊,比如二維對數搜尋法、三步搜尋法、對偶搜尋法。而對預測圖像P的編碼所引起的時間,則主要是執行這個搜尋算法所占用的時間。

等找到最佳比對宏塊後,計算出內插補點和移動矢量,剩下的操作就和對I幀的編碼一緻了。

MPEG-1中I、B、P幀的基本編碼原理1、I幀的基本編碼原理2、P幀的基本編碼原理3、B幀的基本編碼原理總結

預測圖像P的壓縮編碼算法

3、B幀的基本編碼原理

B幀也是雙向預測圖像B,對它的編碼,即是對它前後幀的像素值之差進行編碼,具體的方法和對預測圖像P的算法類似。

MPEG-1中I、B、P幀的基本編碼原理1、I幀的基本編碼原理2、P幀的基本編碼原理3、B幀的基本編碼原理總結

雙向預測圖像B的壓縮編碼算法

總結

從以上介紹就可以看出,I幀是對視訊最重要的圖像幀,P幀其次,B幀更次。是以B幀的壓縮比也是最高的,P幀其次,I幀壓縮比最小。在實際應用中,對于快速運動的圖像,I幀的頻率可以高一些,B幀的數目可以少一些。而對于慢速運動的圖像,則相反。

繼續閱讀