MPEG4 & H.264學習筆記之二 ------ 視頻編碼基本概念及時域模型

.1 介紹
壓縮(compress) 動詞: 擠壓到更小的空間中;即condense
壓縮(conpress) 名詞: 壓縮的行爲或是壓縮的狀態

壓縮是把數據用更小的空間來存放的技術.視頻壓縮(視頻編碼)是把數字視頻流序列用更少的數據位進行存放的方法."Raw"或叫沒壓縮過的視頻需要大量的碼(大約每秒信息216M),而且壓縮對於數字視頻的存儲和傳輸來說都是需要的.

壓縮包括一對互補的系統,一個編碼器(encoder)和一個解壓器(decoder).編碼器把原數據在傳輸或存放之前轉變爲壓縮格式(佔用更少的數據位),而解壓器把壓縮的格式轉會到原來的視頻數據格式上.編碼器/解碼器對經常被叫做CODEC(enCOder/DECoder)

數據壓縮是通過移除數據冗餘來實現的,比如說,對於數據重構過程中無用的數據。很多種數據都有統計上的冗餘性,它們就可以通過無損壓縮進行有效的壓縮,這樣的標準比如說JPEG-LS,它可以達到3-4倍的壓縮。有損壓縮可以達到更高的壓縮比。在有損壓縮系統中,解壓數據與源碼流數據是不同的,高壓縮率是通過視頻質量的下降來達到的。有損視頻壓縮系統是建立在刪除主觀冗餘的原理之上的,從圖象或視頻中刪掉的部分不會很大程度上影響觀察者對於視頻質量的認識的。

大多數視頻編碼方法尋找空間和時間上的冗餘來達到壓縮的效果。在時間域中,連續幾幀的視頻通常有很強的相關性,特別是當時域採樣率是非常高的時候尤其如止。在空間域中,通常像素採樣點之間是相互關聯的,比如說,相鄰象素之間很相近。

H.264和MPEG4視頻標準共用了一部分特徵。這兩種標準都假設了一種以塊(block)爲基礎的運動補償,變換,量化和熵編碼。我們主要關注到這些主要的方法中,並從時間模型開始,接下來是圖象變換,量化,預測式編碼和熵編碼。並以對於一個圖象採樣塊進行編碼和解碼的過程進行描述。

3.2 視頻編解碼器
一個視頻編碼器器把一個源圖像或視頻序列轉化爲一種壓縮模式,並在解碼器把它構造爲源序列的一個拷貝的或是一個近似.如果解壓了的視頻序列與原序列是相同的,那麼編碼過程是無損的,如果解壓序列與源序列是不同的,那麼這個過程是有損的。

CODEC用一種模型來表示原始視頻流(一個被有效編碼的表示方式,並可以用它來重建視頻數據的近似結果或儘量取得高的碼率。這兩個目標(壓縮效率和高質量)通常是相矛盾的,因爲一個低的壓縮碼率通常在解壓部分會降低圖象的質量。碼率和質量的平衡我們會在之後進行介紹

視頻編碼器是由三個主要的功能部件實現的:時域模型,空域模型和熵編碼。時域模型的輸入爲一個未壓縮的視頻流序列。時域模型試圖用鄰近幀的相似性來消除了時域冗餘,通常是構造通當前幀的預測。在MPEG4視頻部分和H.264中,預測通常從一個或多個之前或之後的幀來進行的,並通過對於幀之間的差別進行補償。時域模型的輸出是一個剩餘幀(通過從實際當前幀中減去預測值得到),而一系列的模型參數,通常是一系列用來描述運動是如何補償的運動向量。

剩餘幀構成了時域模型的輸入,它會利用鄰近採樣點的相似性來降低空域的冗餘。在MPEG4視頻部分和H.264中,這通常通過一些變換來對樣點進行處理來實現。變換把採樣點轉到其他的域中,在這些域中用變換系數來表示。這些係數被量化來刪除不明顯的值,只留下很少的大系數來對剩餘幀進行表示。空域模型的輸出是一系列的量化變換的係數。

時域模型的參數(通常是運動向量)和空域模型的參數(係數)通常用熵編碼來進行壓縮。這就刪除掉了統計上的冗餘度(比如,用短二進制碼錶示當前的向量和係數)並製造出一個壓縮流或文件來進行傳輸或存儲。一個壓縮的序列由編碼的運動向量參數,編碼的剩餘係數和頭信息表示。

視頻解嗎器從一個壓縮流中構造一個視頻幀。係數和運動向量由熵解碼器進行解碼,然後空域模型構建出一個版本的剩餘幀。解碼器利用運動向量參數與一個或多個解壓幀來構成一個對當前幀的預測,然後幀就可以通過加入這個剩餘幀來得到。

3.3 時域模型
時域模型的目標是要減少減少傳輸幀的冗餘性。這個過程的輸出是一個剩餘幀,而且預測過程越準確,剩餘幀中包含的能量就越小。剩餘幀被編碼並送到解壓器用來構造預測幀,加上解碼的剩餘幀來構成當前幀。預測幀是通過一個或多個過去或未來的幀(都叫做參考幀)來創建的。預測的準確性通常可以由參考幀和當前幀之間的運動補償來改進。

3.3.1 從前一視頻幀進行預測
時間域的預測的最簡單的方法是從當前幀的前一幀進行預測。用兩幀之間的差來做爲剩餘幀。這個方法的明顯的問題在於剩餘幀中的能量太多了,這也就是說在時域壓縮之後還有大量的數據可以被壓縮。大部分的剩餘能量是由於在二幀中的物體運動可能造成兩幀的運動補償形成的。

3.3.2 由於運動造成的改變
在視頻幀之間的改變可能是由物體的運動造成的(剛性的物體運動,比如說一輛運動着的汽車,或可變形物體運動,比如說移動的手臂),攝象頭的移動,被去覆蓋的區域(比如說一個運動場景中由於物體的運動致成背景的去覆蓋性)和光線的變化。除去去覆蓋和光線變化,差別都是由於幀間的像素點的運動造成的。這樣構造的像素點的鄰接被稱爲光流(optical flow)。完整的域包括對於每個像素位置的光流向量,但是這些域都是被子採樣過的,這樣的話,只有每隔兩個像素點的向量才被顯示出來。

如果光流域是準確描述的,那麼它應該可以構成一個對大多數像素點準確的預測,方法即爲沿着光流向量移動參考幀中的每個像素點。然而,種種原因之下,這並不是一個實用的運動補償的方法.對於光流的準確的計算對於計算來說是非常敏感的而且把每個像素點的光流傳給解碼器也是必要的,以使它能重構造預測幀(這樣就得到了大量的傳輸數據,與我們小剩餘值的目標是相矛盾的)。

3.3.3 基於塊的運動估計和補償
一個實用並被廣泛使用的運動補償方法是爲了襝一個矩形區域的運動或叫當前幀的“塊”。下列的步驟對當前幀的一個M × N採樣的塊的處理過程:

1. 在參考幀中查找一幀(過去的或以後的,已被編碼的或傳輸的),來找到一個相匹配的M * N的區域。這是由在查找區域中比較M * N的塊,並找到一個最接近這一塊的區域。一個流行的匹配方式是用把兩個塊的能量作差,這樣能量相差最小的兩個區域被認爲是最佳的匹配結果。這個查找匹配的過程被叫做運動估計。

2. 選定的區域成爲對於當前M * N塊的預測塊,它被減掉當前的塊來構成一個M*N的剩餘塊(運動補償).

3. 剩餘塊被編碼並傳輸,當前塊和選定塊的差值(運動向量)也被傳輸.

解碼器使用接收到的運動向量來重建預測區域並解壓剩餘塊,加上之前的預測塊來重建一個原始塊。

基於塊的運動補償這麼流行是有很多原因的。它很直接,計算性上也很易處理,它與矩形視頻幀很相適應,並且使用基於塊的圖形變換(比如DCT等),而且它對於視頻序列提供了一個有很效的時域模型。然而它也有一些缺點,比如說,實際物體中幾乎沒有平滑的邊緣來進行矩形邊界的匹配,物體通常在幀之間用很小的像素點位置移動(比如說可變形的物體,旋轉和扭曲),而且很多種運動是難以用基於塊的方法進行補償的。儘管它有這些缺點,基於塊的運動補償是當前所有的視頻標準使用的時域模型的基礎.

3.3.4 對於一個宏塊的運動補償
宏塊,對應於一個16*16的幀區域,是大多數編碼標準(包括MPEG1,MPEG2,MPEG4,H.261,H.263和H.264)運動補償預測方法的基本組成部分。對於源4:2:0的視頻信號來說,一個對於源幀的16*16像素區域的是由256個亮度採樣(用4個8*8的採樣塊排列),64個Cb色度採樣(用一個8*8的採樣塊排列),64個Cr色度採樣(用一個8*8採樣塊排列),這樣就一共六個8*8的塊。MPEG4或H.264的CODEC通過宏塊來處理每一個視頻幀.

運動估計
對於一個宏塊的運動估計包括在參考幀中找一個與當前宏塊相近的16*16的採樣區域。參考幀是一個在之前被編碼過的幀。參考幀的區域以當前宏塊的位置爲中心,宏塊區域的查找16*16的相匹配區域做爲最佳匹配結果。

運動補償
在參考幀中選定的最佳匹配區域是從當前宏塊中減掉的部分,它用來構成一個剩餘幀,接着通過運動向量被編碼和傳輸,它也描述了最佳對應區域。在編碼器之內,剩餘幀被編碼和解碼並被加到相應區域之中,來重構一個宏塊,這個宏塊被存爲以後的運動補償預測的參考幀。用一個解碼的剩餘幀來重構宏塊來保證編碼器和解碼器在運動補償的時候使用相同的參考幀。

在運動估計和補償的過程中有很多不同方法。參考幀可以是之前的或之後的一幀,也可以是結合或是更多幀的搭配。。如果一個之後的幀用來進行參考的話,那麼就要先對這一幀進行編碼。在參考幀和當前幀之間有一個很大的改變的地方(比如說,一個場景的變化),也許不使用運動補償進行編碼宏塊會更有效。這樣編碼器就選擇幀內編碼(在沒有運動補償的情況下進行編碼.在移動場景中移動的物體很少符合16*16像素邊緣而且這樣也許使用可變的塊大小進行運動估計和補償會更高效。物體可能有很少的像素部分運動,這樣使用在參考幀中插值法會是一種更加好的預測方法。

3.3.5 運動補償塊大小
視頻序列中的連續兩幀中圖1是從圖2中不通過運動補償而進行減操作得到的一個剩餘幀.剩餘幀中的能量由於通過16*16的宏塊做運動補償而降低.每8*8塊(而不是16*16)的塊會更近一步降低剩餘幀中的能量,4*4會更少.這個例子說明了小的運動補償塊可以得到更佳的運動補償效果.然而,一個更小的運動補償塊會導致複雜度的升高(更多的搜索操作被執行了),這樣更多的運動向量就要被傳輸。發送每個運動向量需要一些位來做到,這個多餘的負擔會抵銷剩餘幀中能量的減少的優勢。一個更有效的妥協的方法是採用調節圖的塊大小,比如說在相似的區域上選擇一個大的塊,而在高度細節化運動的部分選用更小的塊。H.264使用了一種自適應的運動補償塊大小,在以後我們會提到。

3.3.6 子像素運動補償
一些情況下,通過在參考幀中從插值採樣位置來預測會得到更好的運動補償預測。“子像素”運動估計和補償包括尋找子採樣的插值位置與整值採樣位置,來尋找最佳匹配(比如說,最小化剩餘幀的能量)並在這個位置使用整或子採樣值來直行運動補償預測。對於四分之一像素運動襝來說,第一步,運動估計會尋找對於整採樣格的最佳匹配,接下來編碼器在最佳匹配附近尋找半採樣位置來看匹配是否可以被改進,如果需要的話,對半採樣最佳匹配像素附近的四分之一採樣位置進行尋找。最終的匹配(整,子或四分之一採樣位置)由當前塊或宏塊相差得到。

用4*4的塊大小得到的剩餘幀可以使用半採樣插值並有更低的剩餘能量。這種方法可以由從四分之一採樣格來得到更小的剩餘幀能量得到擴展。總體上說,“更好的”插值可以達到更好的運動補償性能(更小的剩餘幀能量),代價則是複雜度會更高一些。這樣得到的性能提升會因爲插值的步驟的增多而抵銷。半採樣插值相比整採樣有更好的性能,四分之一採樣插值會給出更好的效果,八分之一更勝之,以此類推。

一個運動補償過的參考幀被從當前幀中減去,剩餘幀的能量如下(用總絕對誤差來近似SAE):
Sequence No motion compensation  Integer-pel  Half-pel  Quarter-pel
'Violin',QCIF 171945   153475   128320   113744
'Grasses',QCIF 248316   245784   228952   215585
'Carphone',QCIF 102418   73952  56492  47780

一個低的SAE表示更好的運動補償性能。在每種情況下,子像素運動補償相對整像素補償都有更好的性能表現,而四分之一補償會更好。"Grasses"序列有更復雜的運動,這樣就更難以實施運動補償,悲痛"Violen"和"Carphone"就更容易進行補償了。

在四分之一採樣插值中尋找一個匹配的4*4的塊是比在沒有插值的16*16的塊中更加複雜的。除了更大的複雜度之外,因爲每個塊的運動向量都要被編碼並傳輸到接收端以更好的重建圖象,這樣就有了編碼上的性能損失了。因爲塊大小減小了,傳輸的向量數增加了。需要更多的位來表示半採樣或四分之一採樣向量,因爲向量的更細節部分也必須被像整採樣那樣進行編碼。這樣有另複雜運動的補償模式下就有編碼效率上的平衡度了,因爲運動補償越準確,就有更多的數據來表示運動域,但是在不那麼準確的情況下,就不需要那麼多位了。
3.3.7 基於區域的運動補償
在一個自然的視頻場景中移動的物體很少被對很整齊地對齊到塊的邊緣,它們很可能是不規則形狀的,放置在任意位置上,而且在幀間改變他們的形狀。這樣就很難在參考幀中找到一個理想的匹配,因爲它覆蓋了一部分運動着的物體,一部分靜態的物體。

在圖像的任意區域應用運動補償是可以達到更好的性能的。比如說,如果我們試圖在橢圓形的物體中進行運動補償的話,我們可以在參考幀中找到一個理想的匹配。然而使用基於區域的運動補償會遇到很多的實際困難,包括識別區域邊界,指出邊界的輪廓,在運動補償之後編碼剩餘幀,MPEG-4視頻包括了一系列的工具來支持基於區域的補償和編碼。

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