第4章 視頻數據的壓縮編碼
4.1 基于幀的視頻編碼
本節介紹基于幀的視頻編碼和解碼。這類編、解碼方法以視頻幀為基本編碼單元,綜合利用了第3章中介紹的第一代壓縮編碼技術,并為多數現行的國際標準所采用。在4.1.1和4.1.2節中我們介紹基本的編、解碼方法;在4.1.3~4.1.6節中介紹各種提高編碼性能的優化技術;而4.1.7節則給出典型的編碼碼流的層次結構。
4.1.1 典型的編碼器與解碼器
一個典型的視頻編碼器和解碼器方框圖如圖4-1所示,它包括具有運動補償的幀間預測、DCT變換、量化、熵編碼,以及與固定速率的信道相適配的速率控制等幾個部分,用以在保證圖像有滿意的質量的前提下,最大限度地壓縮碼率。由于圖4-1所示的編碼器采用了多種壓縮編碼技術,所以常被稱為混合(Hybrid)編碼器。

圖4-1 典型的視頻編碼器和解碼器
對視頻圖像的壓縮編碼通常是分塊進行的。如圖4-2(a)所示,將一幀圖像首先分成若干條(Slice),或稱片,每條又分成許多塊。對于4∶2∶0格式來說,亮度圖像塊所包含的像素數目一般為16×16,對應的色度塊像素數為8×8。一個亮度塊及其對應的兩個色信號塊構成一個基本處理單元,稱為宏塊(Macroblock),標為MB[見圖4-2(b)]。每一條所包含的宏塊數可以是不相同的,每一幀劃分的條數也視具體應用而定。
現在來討論編碼器的基本工作原理。

圖4-2 條與宏塊
1.圖像信號的預處理
圖像信號的預處理過程如圖4-3所示。

圖4-3 圖像信號的預處理
模擬R、G、B信號首先經過8比特或10比特的A/D變換變成數字信號,然后分別進行γ校正。根據2.2.4節介紹的內容將R、G、B信號轉換成亮度信號和色差信號,并按(2-24)式至(2-26)式得到Y、Cr和Cb。我們在這里和以后都將Yd簡稱為Y。
由于人眼對色差信號高頻分量的敏感程度比對亮度的低,在信號變換到Y、Cb和Cr空間之后可以用數字濾波器將Cb、Cr的帶寬限制到Y信號帶寬的1/2。然后對于4∶2∶0的格式,在垂直和水平方向上進行2∶1的抽取,這樣得到的色信號矩陣的樣點數只是Y矩陣的1/4。
2.運動估值/補償
為了消除幀間冗余信息,編碼器采用了具有運動補償的幀間預測(見圖4-1下部的虛線框)。在運動估值部分,當前幀的亮度圖像bk被分成16×16的塊,然后利用塊匹配方法在參考幀中找到每個塊bk(Z)的最佳匹配塊,從而估計出每個塊的位移矢量值。在匹配過程中,參考幀內的搜索范圍根據不同的應用而定,例如可以取±128(H)×±32(V),這里的H和V分別表示垂直方向和水平方向。當參考幀為前一幀bk-1時,進行的是前向預測;參考幀為后一幀bk+1時,則進行的是后向預測。關于何時進行前向預測、何時進行后向預測,下面將要詳細討論。
利用每個塊的位移矢量D,可以從參考幀得到經過運動補償的當前塊的預測值。在當前塊和預測塊的差值圖像(或稱為位移后的幀間差DFD)中,時間冗余信息已經大大減少,但還可能保留著空間冗余信息。為了降低空間冗余度,將在后續步驟中對DFD進行DCT變換和量化。運動估值中用到的參考幀是在經過反量化和反DCT恢復出
之后,與
(或
)相加得到的。上述帶有
的符號表示該量引入了量化誤差。同時,在3.5.2節中介紹塊匹配方法時已經講過,位移矢量必須伴隨著DFD送到接收端,接收端才能從已接收幀中恢復出當前幀來。圖中標出此支路直接進入熵編碼模塊。
按上述方法編碼的塊通常稱為幀間編碼塊(Inter MB)。但是在有些情況下,如場景切換時,幀間預測誤差很大,此時圖像塊可以不進行預測編碼,而直接進行DCT變換和熵編碼,這樣的塊稱為幀內編碼塊(Intra MB)。在采用幀間預測編碼的一幅圖像中,如果某一塊的預測誤差很大,對該塊也可以采用幀內編碼。對于幀內編碼塊,可以看成其預測值為0。
3.DCT變換
在3.6節中講過,圖像經DCT變換以后,DCT系數之間的相關性已經很小,而且大部分能量集中在少數的系數上。只傳送這部分系數給收端,既可以降低數據率,而又不至于使圖像有明顯的損傷。從原理上講我們可以對整幅圖像進行DCT變換,但由于圖像各空間位置上細節的豐富程度不同,這種整體處理的方式效果不好。為此,采用了將宏塊再分成8×8的子塊、對每個子塊進行DCT的辦法。這種處理方法稱為塊DCT。位于細節豐富區的子塊,可以保留較多的DCT系數;而細節不豐富的子塊,則保留較少的系數。采用塊DCT的辦法不僅便于每個子塊根據各自的圖像特點進行獨立處理,而且降低了運算量和對存儲空間的要求。
對色信號的處理與上面討論的對亮度信號的處理方法類似,只是對色信號Cb、Cr不做運動估值,而是直接使用同一宏塊中的亮度塊的位移矢量作為色信號子塊的位移矢量。根據這些位移矢量對Cr和Cb進行具有運動補償的幀間預測,然后對預測差值圖像進行塊DCT變換。
4.量化
在量化之前,所有的處理都沒有涉及到信息的損失(除了在DCT變換中,系數值受有限字長影響而引入的舍入誤差外),只是改變了對圖像的表示方式而已,即將原來用R、G、B三個基色表示的圖像信號,改用亮度/色度分量與其預測值之間的差值、運動矢量和空間頻率分量等物理量來表示。在這些新的表示方式中,對圖像質量影響大的信息集中到了少數的量上,以便于我們將這少數至關重要的量選擇出來加以傳送,達到降低數據率的目的。
量化是編碼器中唯一產生信息損失的地方。通過量化,保留下重要的DCT系數,將其數值進一步離散化,并將不重要的DCT系數量化到零。這是對數據進行壓縮的很重要的一步。經過DCT變換后,系數之間的相關性已經很小,因此可以用各自獨立的量化器分別進行量化。對于DC分量,由于幀內編碼相鄰塊的直流分量之間有很強的相關性,因而相鄰塊的DC分量在采用DPCM后(見4.1.3節),用8比特均勻(最小熵)量化器量化。其他系數也采用均勻量化器,但對不同的DCT系數根據其重要程度的不同采用不同大小的量化臺階。例如,低頻系數的量化臺階較小,而高頻系數的量化臺階則選得比較大。實現對不同系數使用不同量化臺階的最簡單的方法是,將每個系數除以不同的權值,然后統一地采用同一個量化器進行量化。權值的大小由人的視覺對該頻率分量的敏感程度確定。8×8個權值構成一個矩陣,稱為量化矩陣。
圖4-4(a)和(b)分別給出了幀內編碼子塊和幀間編碼子塊的量化矩陣的例子。對于只進行幀內編碼的子塊,DCT系數值對應于該圖像塊的空間頻率譜,因此,圖(a)所示量化矩陣中低頻系數的權值較小,而高頻系數的權值較大。而對于幀間編碼的子塊,由于幀間預測誤差的DCT系數與原圖像的空間頻率譜關系很小,因而其直流和交流分量均采用相同的量化器量化。

圖4-4 量化矩陣
5.從二維矩陣到一維序列的轉換
DCT系數矩陣在量化之后已經變得很稀疏,相當多的系數已量化到零,只剩下低頻系數和少數的高頻系數。為了進行熵編碼,我們將按圖4-5(a)所示的之字形順序,將二維的系數矩陣轉化成一個一維的數據序列。圖中所示的掃描順序,首先經過低頻再到高頻。這樣,重要的系數多數都集中在序列的開始。當掃描到高頻區域遇到若干個零之后才有一個非零值時,為了記錄該非零值的位置,該值前面的零的個數用游程編碼表示。當剩下的所有系數均為零時,用符號EOB(End Of Block)來代表序列的截止。以這種方法可以將64個系數有效地排列成一個短序列,而每一個系數則用一個數組(run,level)來表示,其中run表示系數在矩陣中的位置,level表示它的值。例如,(3,-6)代表這個系數前面有3個零,它的值為-6。

圖4-5 DCT系數的掃描順序
對隔行掃描的圖像進行編碼時,由于相鄰掃描行來自不同的場,如果在一場時間內物體的位置有明顯的移動,垂直方向上的相關性會降低,導致該方向空間頻率分量的幅值下降較慢,之字形的順序就不是最佳的了。這時可以采用圖4-5(b)所示的交替掃描方式,這種方式優先掃描了垂直方向的系數。
另一種處理辦法是,為了增加垂直相關性,在做DCT之前,先取奇數場的8行,再取偶數場的8行,分別作8×8的DCT,這時仍可采用圖(a)方式進行掃描。在解碼時,經過IDCT以后再恢復正常的行順序。
6.熵編碼
已經在第3章中講述過,熵編碼是實現無損數據壓縮的一種重要方法。可以采用霍夫曼編碼,也可用采用算術編碼來消除上面所形成的一維序列(包含DCT系數的位置和幅度信息)中的統計冗余信息,給序列中的每個符號指定一個碼字,從而產生編碼器輸出的比特流。
從3.10節可知,無論是霍夫曼碼還是算核編碼,信源實際的概率模型必須與設計碼表時所采用的模型相匹配,否則編碼效率會顯著降低。因此在一些國際標準中采用了自適應熵編碼,即在編碼過程中,根據圖像相鄰區域的已編碼的數據,估計當前符號的概率分布,然后動態地更新碼表;或者切換到符合當前分布的碼表。在后一種情況下,編、解碼器都有一組事先根據數據不同統計特性設計的碼表。
在實際設計碼表時,通常不是將一個DCT系數值看成一個符號,而是將游程編碼后的組合(run,level)看成一個符號,給予一個碼字,這樣的碼表有時稱為二維霍夫曼表。在不同的國際標準中霍夫曼碼表的具體形式有所不同。以H.263/MPEG4的DCT系數碼表為例,該標準對出現頻率較高的符號定義了VLC碼表,而不常見的符號仍采用定長碼表示。表4-1給出了它的VLC碼表的前20個碼字。該表是一個(last,run,level)的三維碼表,last代表是否是序列的最后一個符號(last=1,“是”),run代表非零系數前面的零的個數,level代表該系數的絕對值,系數的正、負則由碼字的最后一個比特s表示,0為正值,1為負值。
表4-1 VLC碼表(部分)
7.去塊效應濾波器
從3.9.5節可知,塊DCT直流及低頻分量的量化誤差會導致重建圖像上的塊效應。除此之外,在分塊進行具有運動補償的幀間預測時,相鄰宏塊的預測塊通常來自于參考幀中的不同(非相鄰)位置,它們在空間上的不連續性,是造成塊效應的另一個原因。為了降低塊效應引起的視覺不快,可以用一個低通濾波器來對解碼后的重建圖像進行平滑,此濾波器稱為去塊效應濾波器(Deblocking filter)。在圖4-1中,虛線所示的去塊效應濾波器放在了解碼器的預測環路之中;為了不失配,編碼器環路中也有一個同樣的濾波器。這樣做的好處是,在提高解碼圖像主觀視覺質量的同時,降低了參考圖像塊效應(不連續性)產生的殘差,有利于壓縮碼率的降低。
8.速率控制
由于編碼的原因,例如熵編碼產生的是變長碼、幀內編碼和幀間編碼產生的數據量不同等,同時由于視頻信號的統計特性不平穩,復雜度高的圖像經壓縮后所產生的數據量大,因此編碼輸出的比特流速率是變化的。為了在恒定比特率的信道上傳送,需要在進入信道之前加一個緩沖器,用以對輸出碼流的速率進行平滑和控制。關于速率控制問題將在4.3節中做進一步的介紹。
在圖4-1中還給出了解碼器的功能方框圖。解碼是編碼的逆過程,這里不再多述。
4.1.2 視頻序列的編碼
對一個視頻圖像序列進行壓縮編碼,需要用到幀間預測編碼,因為它是消除時間冗余信息(即各幀圖像之間的冗余信息)的一種有效方法,但在不同的應用中幀間預測的具體做法有所不同。由于后向或雙向預測在解碼顯示時引入額外的延時,所以在實時性要求高的應用中,如可視電話和視頻會議,一般不采用。在這些應用中,通常第一幀采用幀內編碼,后繼幀均采用前向預測編碼。
在另外一些應用中,例如在數字電視廣播中接收機剛開機或改換頻道時,或在視頻點播中接收機進行錄像機式的快進、快退等操作時,需要從碼流的某個中間點(不是序列的起始點)處開始解碼,這稱為隨機接入(Random Access)。如果序列除第1幀外全部采用前向預測,此時會因為沒有前一幀參考圖像而不能解碼。為了解決隨機接入的問題,有必要隔一段時間傳送一幀只采用幀內編碼的圖像作為參考圖像,使得預測環路能在沒有某一個參考幀時,迅速獲得另一個參考幀,從而恢復到正常工作狀態。圖4-6(a)表示出這樣一個圖像序列,圖中I幀表示幀內編碼圖像,P幀和B幀分別表示采用前向預測和雙向預測的圖像。P幀由與其相鄰的前一個P幀或I幀來預測,B幀則由前、后相鄰的I幀或P幀預測。在這類應用中,實時性要求不那么苛刻,因此可以使用B幀提高壓縮比,但B幀一般不作為P幀和后續B幀的參考圖像。兩個I幀之間的圖像構成一個組,稱為GOP(Group Of Picture)。在一組圖像中,P幀和B幀的數目可以根據實際應用的需要選擇。
需要注意,在GOP中B幀既引起編碼的延時,也引起解碼的延時。如圖4-6(a)所示的情況,只有在P4編碼之后才能對B2進行編碼,與輸入序列相比,編碼器引入了2幀(連續出現的B幀的個數)的延時。為了使解碼器引入的延時最小,已編碼的圖像按如下順序進行存儲或傳輸:I1 P4 B2 B3 P8 B5 B6 B7…不難看出,要正確地解碼和顯示該序列圖像,解碼器需要存儲2幀已解碼的圖像,而引入的延時為1幀。

圖4-6 使用I幀、P幀和B幀編碼的圖像序列
當GOP以B幀為結束幀時[見圖4-6(b)],最后的B幀的編、解碼需要以下一個GOP的I幀作為參考幀,這樣的GOP稱為開GOP;當GOP以P幀為結束幀時[見圖4-6(a)],不需要參考下一個GOP的I幀,這樣的GOP稱為閉GOP。
4.1.3 幀內預測編碼
本節介紹基于空間域預測編碼的優化技術。
1.DC系數的幀內預測編碼
每個8×8幀內編碼塊DCT系數中的DC分量代表了該塊的平均灰度,而在空間域內圖像的灰度是連續變化的,因此相鄰塊的DC分量之間存在相關性。利用空間鄰域已編碼塊的DC分量對當前塊的DC分量進行預測,然后對預測誤差進行編碼,可以降低DC系數所占用的比特數。
圖4-7(a)給出了進行DC系數預測的相鄰塊與當前塊的位置圖。當前塊X的DC系數可以直接由A塊的DC系數預測,例如在MPEG-2中就采用了這種方法。更好的方式(如MPEG-4所采用)是按下式選擇DC系數梯度變化較小的方向進行預測。
If|DCA-DCB|<|DCB-DCC|
從C預測X
else
從A預測X
一般取A或C的DC系數乘以一個小于1的權值作為塊X的DC系數的預測值。
同理,空間相鄰的幀內編碼塊的DCT系數的低頻分量之間也存在著一定的相關性,因此,DCT系數矩陣的第一行和第一列也可以利用幀內預測編碼來降低它們占用的比特數。圖4-7(b)給出了低頻AC系數(圖中灰色位置)的預測關系。

圖4-7 (a)DC系數的預測,(b)AC系數的預測
2.運動矢量的幀內預測編碼
當圖像中存在面積覆蓋若干宏塊的大物體時,空間相鄰宏塊的運動矢量之間存在著相關性,因此,對運動矢量采用幀內預測編碼有利于降低傳送運動矢量所需要的比特數。
圖4-8給出當前塊E和與其相鄰塊A、B和C的相對位置,其中(a)為進行運動估值的塊大小相同(如都是16×16)時的情況。在有些國際標準中允許使用不同大小的塊來進行運動估值(見4.1.4節),圖(b)表示出E和鄰域塊大小不同時的一個例子。最簡單的預測方法是用左鄰域塊的運動矢量MVA作為當前塊E的運動矢量MVE的預測值;更好的方法如下式所示:
式中,下標x、y分別代表運動矢量在X和Y方向上的分量,median{·}代表取中值。如果當前塊是16×8或8×16的,則分別按圖(c)和(d)中箭頭所示方向進行預測。最后,對當前運動矢量與預測值之差進行編碼和傳輸。

圖4-8 運動矢量預測中當前塊與鄰塊的位置關系
3.圖像的幀內預測編碼
在4.1.1節中講過,對于幀內編碼的幀(或塊)不做幀間預測,直接進行塊DCT和熵編碼。但實際上,圖像在空域內的相關性是很強的,如果對于幀內編碼模式,首先進行空間域預測編碼,再作DCT和熵編碼可以明顯的提高編碼效率。因此在某些國際標準(如H.264)中,增加了幀內預測編碼的模式。
根據3.5.1節可知,預測器系數的設計與圖像信號的內容(統計特性)有關。為了適應不同的圖像內容,通常給出一組不同的預測器。圖4-9列出了幾個例子。圖中淺灰色塊表示當前待預測像素,大寫字母表示鄰接的像素。圖(a)定義了各像素的相對位置;圖(b)用頂部像素分別預測當前塊對應列的各像素;圖(c)用A、D、I、L的均值預測當前塊各像素;圖(d)中像素由周邊像素的加權和來預測,例如
顯然,圖(b)和圖(d)分別適用于垂直方向和對角線方向相關性強的圖像,而圖(c)適用于灰度變化平坦的圖像。類似地,相關的國際標準(如H.264)中還規定了其他一些預測器。
4.1.4 幀間預測編碼的優化
在圖4-1所示的混合編碼器中,幀間預測編碼對數據壓縮起著至關重要的作用,因此對其進行改進,一直是近年來視頻壓縮編碼研究的一個重要組成部分。下面簡單介紹這些研究所獲得的部分成果,它們已分別在不同的國際標準中被采用。

圖4-9 亮度圖像幀內預測的幾個模式
1.隔行掃描圖像的預測
當編碼器的輸入是隔行掃描的圖像時,由于相鄰掃描行來自不同的場,如果在一場時間內物體的位置有明顯的移動,垂直方向上的相關性會降低。在這樣的情況下,為了提高預測的準確性,可以采用以下的模式:

圖4-10 場圖像的場間預測
(1)用于場圖像的場間預測
這種方式與幀間預測類似,只是被預測的宏塊是從某一場圖像(而不是幀圖像)中取出的。如圖4-10所示,P幀某一場的參考圖像可以選擇為該場圖像的前一場,或者與之極性(即奇數場或偶數場)相同的前一場圖像;而B幀某一場的參考圖像則可以由其前一幀的任何一場與后一幀的任何一場構成。
(2)用于幀圖像的場間預測
將幀圖像中的宏塊分成兩個場宏塊,兩個場宏塊分別由奇數場和偶數場的像素構成。對這兩個場宏塊分別進行場間運動估值。這樣,對前向預測而言,每個幀宏塊有兩個運動矢量;對雙向預測而言,每個幀宏塊則有4個運動矢量。這種預測方式主要用于圖像運動劇烈的情況。
2.幀間預測編碼中幾種特殊情況的處理
(1)不受限的運動矢量
對靠近圖像邊緣處的宏塊進行運動估值時,其匹配塊可能部分地落在參考圖像之外(見圖4-11)。為了降低預測誤差,從而降低此時編碼所需的比特數,可以將圖像邊界上的像素值簡單線性外插到邊界外(如圖中陰影所示),編碼效率會因此而略有提高。

圖4-11 匹配塊部分地落在參考圖像之外的例子
(2)跳過模式
若當前編碼塊以參考圖像中的同位塊作為預測塊時,其預測誤差足夠小(可以量化到零),則不傳送當前塊的任何編碼信息,并稱其為跳過(skip)塊。在解碼時,直接取參考圖像中同位塊作為跳過塊的解碼值。
(3)雙向直接模式
在這種模式中,只傳送預測誤差,而不傳送當前編碼塊的運動矢量,當前塊的兩個雙向預測運動矢量通過已編碼塊的運動矢量推導出來。以圖4-12所示的情況為例。設當前編碼塊位于B5幀,其后向參考幀P6中的同位塊的運動矢量指向I1,且數值為MV=(+2.5,+5)。那么當前塊的前向參考幀也為I1,其運動矢量按下式計算:
當前塊的解碼值則等于由MVF和MVB決定的雙向預測值與預測誤差之和。

圖4-12 雙向預測中的直接模式
3.運動估值的圖像塊大小
如3.5.2節所述,在塊匹配方法中,將圖像分塊并將每一個塊視為一個“運動物體”,對于圖像結構和運動來說,這是一個相當粗糙的模型。如果一個塊中包含若干個向不同方向運動的物體,則很難在參考幀中找到合適的匹配塊。
根據圖像內容的復雜程度選擇不同大小和形狀的塊來進行運動估值,可以在一定程度上改善上述狀況,減小預測誤差,從而降低碼率。因而在一些國際標準中除了16×16的塊以外,還允許在運動估值中采用其他的分塊方式。圖4-13給出了H.264支持的各種分塊模式,其中包括16×16、16×8、8×16和8×8的塊;當選擇8×8的塊時,可以進一步細分為8×4,4×8和4×4,這常稱為樹結構的層次化塊劃分。值得注意的是,更細地劃分塊在可能降低預測誤差的同時,增加了需要傳輸的運動矢量的個數(例如對4×4的前向預測,每個宏塊有16個運動矢量)和匹配搜索的復雜程度;同時,所選擇的是多大的塊(塊模式)也必須作為附加信息傳送給解碼器。

圖4-13 分層劃分的塊模式
對一個圖像宏塊進行運動估值時,究竟劃分為多大的塊好呢?原則上說,需要對所有可劃分的模式進行試探,看哪一種模式下所需的編碼(預測誤差、運動矢量和塊模式等的編碼)總比特數最少。由于圖4-13所示的7種模式都在一個宏塊之中,相互之間有很強的相關性,如何利用這些相關性就成為研究可變塊大小的運動估值快速算法的基本出發點。一種思路是自下而上,先對最小塊(4×4)進行運動估值,然后對小塊的運動矢量進行分析,例如如果4個4×4塊的運動矢量相似,則可合并為8×8的塊;同時,4×4塊的SAD值可以在進行大塊的搜索時再利用。第二種思路是自上而下,先對最大塊(16×16)進行運動估值,然后用大塊的運動矢量對小塊的位移進行預測,以減少搜索點的數目。考慮到太小的塊容易產生誤匹配,所得到的運動矢量不夠可靠;而太大的塊又容易包含多個向不同方向運動的物體,致使利用大塊的運動矢量對小塊的運動矢量進行預測不夠準確,因此一些算法以8×8塊為初始搜索塊,然后采取向上合并和向下分裂的策略,以得到最佳的分塊模式。4.1.5節將對進行模式選擇的方法做更深入的討論。
4.亞像素精度運動矢量估計
在3.5.2節所介紹的運動估值中,當前幀和參考幀具有相同的空間分辨率,這樣得到的當前塊和它在參考幀中的匹配塊之間的位移值是像素取樣間隔的整數倍,或者說,所得到的運動矢量是整數像素精度的。很顯然,物體的實際幀間位移與像素點的取樣間隔之間并沒有必然的聯系。對實際位移進行更精細(亞像素精度)的估值,有可能進一步減小幀間預測誤差從而降低碼率。由于在進行亞像素(例如1/2像素、1/4像素等)精度的運動估值時,首先需要通過內插得到參考圖像在亞像素位置上的數值,以便實現對當前塊位移的更精細的匹配,因此對亞像素精度運動估值的研究,包括運動矢量的精度和參考圖像的內插方法分別對降低預測誤差的影響這樣兩個問題。
(1)運動矢量的精度對降低預測誤差的影響
研究表明,運動矢量從整像素精度提高到亞像素時,幀間預測誤差有顯著降低,但到了一定的“臨界精度”之后,預測誤差降低的可能性則減小。對一系列典型測試序列的實驗表明
,當運動矢量的精度從整像素提高至1/8像素時,編碼比特率的降低比較明顯;當提高至1/16像素后,則無明顯的進一步的改善。同時,具有小物體、或低信噪比的序列相對于大物體、或高信噪比的序列而言,提高運動估值精度的效果相對要差,這是因為如果一個塊中包含向不同方向運動的物體,或者量化誤差較大,都會對運動估值形成干擾,進一步提高精度則沒有多大意義。
(2)內插濾波器對降低預測誤差的影響
從概念上講,只要如3.4.2節所述采用理想低通作為內插濾波器,就可以精確地恢復出參考圖像在亞像素位置上的數值。但是實驗表明,按照上述方法進行具有運動補償的幀間預測,效果并不理想。這是因為輸入信號中包含著攝像機噪聲和其他信號成分,這些噪聲不能被很好地預測從而保留在預測誤差之中。研究者通過假設噪聲的主要成分來源于輸入信號中的混疊失真,從理論和實驗上比較好地解釋了上述問題。
為了分析的簡單,我們只考慮一維的情況。假設t-1和t時刻的輸入模擬圖像信號分別為lt-1(x)和lt(x),二者分別取樣后得到bt-1(xn)和bt(xn)。若lt-1(x)的頻譜為Lt-1(ω),則bt-1(xn)的頻譜為
式中,ωs為取樣角頻率;T為取樣周期。不失一般性,令T=1,以忽略上式中的常數1/T。
假設在數據采集過程中,由于取樣之前的限帶濾波器不是一個理想的低通,沒有在1/2的取樣頻率(但在1倍的取樣頻率)上將信號衰減到零,即
則取樣后的離散信號bt-1(xn)的頻譜Bt-1(ω)中存在混疊干擾。讓我們只考慮該頻譜的基帶部分(見圖4-14),
Bt-1(ω)=Lt-1(ω)+Lt-1(ω+ωs)+Lt-1(ω-ωs) (4-8)
假設lt(x)只是lt-1(x)平移了dx后的結果,即lt(x)=lt-1(x-dx),那么取樣后的當前幀信號bt(xn)的頻譜為
上式后兩項代表Bt(ω)中的混疊成分。根據(4-7)式可知,這兩個混疊項是互不重疊的(見圖4-14),因此(4-9)式可化為
由(4-10)式可以看出,在基帶內混疊項的位移dxa為
(4-11)式表示混疊項位移dxa的大小與頻率ω有關,同時dxa與圖像本身的位移是相反方向的。由于運動補償只能按照一個位移矢量進行,在對圖像本身的運動進行補償時,混疊項將遺留在預測誤差之中,造成補償效果的不理想。

圖4-14 輸入信號bt-1(xn)的頻譜
下面我們來具體分析混疊失真對預測誤差的影響。圖4-15給出了具有運動補償的預測器的一般框圖。圖中和
分別代表重建的前一幀參考圖像和對當前幀的預測值,l′t-1(x)代表經內插濾波器h(x)得到的模擬參考圖像,
為運動矢量的估計值。在這里我們假設其估計值等于實際值,即
=dx。最后一個模塊對模擬信號
以周期T=1進行再取樣。

圖4-15 具有運動補償的幀間預測器一般框圖
根據圖4-15很容易得到頻域內各信號間的關系式:
式中,H(ω)為內插濾波器的頻率響應。如果內插濾波器是理想低通型,即
假設忽略量化誤差,即參考圖像等于原圖像,那么根據(4-12)式和(4-15)式,L′t-1(ω)=Bt-1(ω),且在|ω|>ωs/2時,L′t-1(ω)=0。因此根據(4-8)式和(4-13)式,在基帶中有:
根據(4-10)式和(4-16)式得到預測誤差的頻譜E(ω)為
上式表示在對圖像進行理想的預測時,對混疊項的預測是不完善的。從(4-17)式看出,殘留在預測誤差中的混疊失真大小(絕對值)與位移量dx有關,在整像素位移(dx=0,±T,±2T,…)時,殘留誤差消失,而在半像素位移時最大。
為了減小預測誤差中殘存的混疊失真,我們必須修正預測信號((4-16)式),使其更接近于當前幀信號Bt(ω)[(4-10)式]。由于亞像素位移產生混疊殘留誤差,故而進行內插的濾波器h(x)(見圖4-15)可以兼用來對預測信號中的混疊失真進行衰減。我們知道在最小均方誤差準則下,對帶有加性噪聲的隨機信號進行預測的最佳預測器是維納(Wiener)濾波器,因此在國際標準中建議的內插濾波器是根據信號和噪聲統計特性設計的維納濾波器,它具有與一般低通類似的頻譜形狀,不同的是它考慮了混疊失真(噪聲)的影響。實際上,(3-33)式就是H.264給出的一個6抽頭的維納濾波器;而雙線性內插濾波器等效于長度為2的維納濾波器。
5.多參考幀預測
在對當前幀進行幀間編碼時,通常采用前(或后)一幀作為它的參考圖像,但在某些情況下,采用前面(或后面)若干幀中的某一幀作為參考可能會獲得更好的預測效果(更低的預測誤差)。這些情況包括:
(1)被遮擋和新暴露出的背景——背景被運動物體或陰影遮擋,當它重新暴露出來時,可能在它的前一(被遮擋)幀中找不到匹配部分,而在數幀之前它未被遮擋的幀中,可以得到良好的匹配;
(2)物體重復性的運動,或攝像機抖動、角度交替交換等,在這些情況下當前幀可能與數幀之前(或之后)的圖像更具相似性;
(3)由于運動相對于取樣柵格的變化、照明變化、噪聲或其他原因,盡管在視覺上并不一定感覺數幀前(或后)的圖像與當前幀更相像,但對某些宏塊而言,卻往往可以在數幀前(或后)的圖像中找到比前一幀為參考的更好的匹配。

圖4-16 多參考幀幀間預測
由此可見,采用多參考幀預測能夠在一定程度上提高編碼效率。圖4-16給出了一個采用多參考幀預測的情況,當前幀中左邊黑色塊的參考塊在前2幀中,而中間條紋塊的參考塊則在前面第4幀中(對于反向和雙向預測亦類似)。此時,對于每個宏塊而言,不僅要傳送預測誤差和運動矢量,還要傳送其參考塊所在的圖像的位置。多參考幀幀間預測編碼效率的提高是以加大運算量(需要在多幀中搜索匹配塊)和存儲容量(需要存儲多個參考幀)為代價的,同時,編、解碼器需要同步地管理參考幀緩存區也增加了復雜程度,但是并不加大播放延時。
4.1.5 基于率-失真優化的編碼模式選擇
在視頻編碼標準中,通常允許進行多種模式的編碼,例如H.264支持前面介紹的各種模式的編碼,即一個宏塊在編碼的時候,可以采用幀內編碼或幀間編碼,而幀內編碼有圖4-9舉例的多種預測模式,幀間編碼也可以采用圖4-13所示的多種預測模式,那么究竟采用哪種模式好呢?最簡單和原始的判斷準則是最小化預測誤差,如在3.5.3節中根據所給出的DFD值最小來選擇前向、后向或雙向預測模式。根據經驗,預測誤差小所需的編碼比特數就少,但是上述準則并沒有全面考慮一個宏塊編碼所需的總比特數。除了預測誤差之外,運動矢量和編碼模式(如幀內/幀間、塊大小和多幀參考中的參考幀標號等)也需要占用一定的比特,在低碼率的應用中,這部分開銷尤為不可忽視。
根據3.3節介紹的率-失真理論,一個更為合理的編碼模式選擇準則是率-失真優化(Rate Distortion Optimization),簡稱RDO。假設信源樣值(或宏塊)集合(序列)為S=(S1,…,SK),Ik為編碼Sk所用的模式,且Ik∈O,O為所有可選擇的編碼模式(包括量化器)的集合,那么在不考慮噪聲的情況下,用于該信源序列的編碼模式應該滿足
其中I=(I1,…,IK),D(S,I)和R(S,I)分別為選擇編碼組合I時的總失真和總速率,RC為給定的速率限制值。引入拉格朗日參數λ≥0,(4-18)式的條件優化問題變為
其中J(S,I)稱為代價函數。
理論上講,D(S,I)應該等于原始圖像與解碼重建圖像的差值,R(S,I)包括量化后的預測誤差(對幀內模式則是圖像本身)的DCT系數、運動矢量和所選模式的標識符等編碼所用的比特數之和。顯然,(4-19)式是一個復雜的優化問題,再考慮到混合編碼中,許多編碼參數是經過空域或時域預測以其差值傳送的,一個宏塊參數的編碼涉及到鄰域或鄰幀的其他宏塊,這就使得問題更加復雜化。為此,研究者提出了多種簡化方案來減少優化的搜索空間,以適應實際編碼器設計的需要。
一個簡單和被廣泛接受的方案是假設失真和速率度量均為加性的,且僅依賴于每個宏塊本身的編碼參數的選擇,則(4-19)式化為
式(4-20)中K為一幀宏塊的個數,求和與求最小符號可以互換是因為對所有k,J(Sk,I)>0。從上式右端可知,優化問題可以針對每個宏塊獨立進行。因此對于每個宏塊我們有:
其中Q代表給定的量化步長,O在不同標準中代表不同的集合,例如對于逐行掃描的P幀而言,在MPEG2中,O={Intra,Skip,Inter_16×16};在H.263/MPEG4中,O={Intra,Skip,Inter_16×16,Inter_8×8};在H.264中,O={Intra_4×4,Intra_16×16,Skip,Inter_16×16,Inter_16×8,Inter_8×16,Inter_8×8,Inter_8×4,Inter_4×8,Inter_4×4}。上式中的失真項
式中,Ak為當前宏塊。由經變換和量化的系式,是前一幀同位塊的變換和量化的預測誤中的速率項RREC,對I使用的比特數;對Skip模式,為1個比特/宏塊;而對In-ter模式,則為模式標識、參考幀標識、運動矢量和預測誤差所使用的總比特數。圖4-17表示出計算(4-21)式的率-失真代價(RD-cost)的流程。

圖4-17 率-失真代價計算
由于幀間預測模式涉及運動補償,因此我們將這一部分分成兩個串行的優化問題來解決。對每一種幀間預測模式,首先忽略對預測誤差進行編碼(變換、量化和熵編碼)的過程,只對幀間編碼的各種模式進行速率約束下的運動估值,即找到最佳的運動矢量vopt使下列代價函數最小:
其中V代表所有可能的運動矢量的集合,RMOTION(Sk,v)代表采用v時,運動矢量編碼所用的比特數;在多幀預測中,v=(vx,vy,vt),其中vt代表參考幀的標識。上式中的失真項為
其中S(x,y,t)和S′(x,y,t)分別為原始和預測的像素值。當p=1時,(4-24)式為SAD;p=2時,為平方誤差和(SSD)。(4-23)式首先在整像素精度上求解,找到最佳的整像素精度運動矢量后,再在該像素周圍的亞像素精度上進行搜索,直至找到滿足(4-23)式的最佳運動矢量vopt。然后,按照圖4-17所示的過程計算率-失真代價,與其他幀間預測模式和幀內模式一起進行模式選擇。
在具體實現上述優化時,我們仍有如下問題需要解決:
(1)拉格朗日參數的選擇
假設率-失真函數DREC(RREC)是凸的,那么(4-21)式的代價函數JMODE(RREC)=DREC(RREC)+λMODERREC也是凸的。令JMODE的一階導數為零,則可得到J取最小值時
上式說明拉格朗日參數λMODE對應于率-失真函數的負斜率,因此可以從率-失真函數來確定λ。在假設足夠高碼率的條件下,可以得到熵約束量化器的率-失真函數的近似表達式和失真與Q之間的關系式,并通過實驗確定其中的常數,從而得到如下的拉格朗日參數。
其中QP為編碼量化參數,在不同的標準中,QP與Q之間有不同的關系(例如表4-2)。在(4-24)式中,若DFD取SAD值,則λMOTION=;若取SSD值,則λMOTION=λMODE。考慮到DREC和RREC都與量化步長Q有關,λMODE與QP有(4-26)式的依賴關系就是可以理解的了。
(2)快速模式選擇算法
在進行(4-23)式和(4-21)式的優化時,運動矢量編碼所需的比特數RMOTION可以通過VLC表迅速查出,但是要得到幀間或幀內預測誤差經變換、量化(對所有可能的量化步長)和變長編碼及運動矢量等所占用的比特數RREC,以及重建后產生的失真DREC,則需要針對每一種模式完成多次(多個QP)編碼/解碼的全過程,計算量是十分龐大的。因此,從基于率-失真優化的編碼模式選擇方法提出以來,對其快速算法的研究就一直是一個活躍的領域。這些快速算法的基本思想通常是:①根據圖像在空間域與時間域上的特征或相關性和鄰域已編碼模塊的信息,限定搜索模式的種類,或確定優先搜索的模式(或模式類別);②設定適當的閾值,當代價函數小于閾值時即認為達到最優,使搜索及早中止;或當代價函數大于某個閾值時,及早跳轉到對其他模式的搜索。對快速算法有興趣的讀者可以參閱。
(3)根據預測誤差對失真和速率進行估計
這也是簡化模式選擇計算復雜度的一種方法。例如利用一個大的訓練數據集,得到以量化參數QP為參變量的DREC~DFD和RREC~DFD近似關系。這些關系可以表格的方式存儲,在進行(4-21)式的優化時,通過查表而不必完成編解碼的全過程就可以獲得對應的失真和速率數值。
4.1.6 低計算復雜度的變換編碼與量化
8×8DCT是大多數視頻編碼國際標準中采用的變換編碼方式,但是DCT通過浮點計算完成,由于有限字長效應,且編碼器和解碼器的計算單元的精度可能不同,因此逆變換不一定能精確地重建變換前的數值,這稱為編、解碼變換的失配。失配造成解碼圖像質量一定程度上的降低。為了解決變換失配問題并降低變換的計算復雜度,在H.264中引入了一種4×4的正交變換。
1.4×4正交變換
我們首先從4×4DCT開始來推導這種低計算復雜度的4×4變換。根據(3-67)式得到以矩陣形式表示的4×4DCT如下式所示:
其中X、Y分別為像素矩陣和變換系數矩陣,A為變換矩陣。
將(4-27)式轉化為
其中代表(CXCT)矩陣中的每個元素與E矩陣中的對應位置上的元素相乘,d=c/b。為了簡化計算,令
我們可以驗證(4-29)式中的變換C是正交的,但要保證它的基向量是歸一化的,則需要將乘數矩陣E中的b改為
再將(4-29)式中C的第2和第4行和CT的第2和4列分別乘以2,以避免變換中的除2運算產生非整數,與此同時將E中對應的因子除2,則得到
由(4-32)式看到4×4變換CfXCfT只由整數加法、減法和移位(×2)操作完成。如果輸入矩陣X的元素值在[-255,255](即8b)之內,變換系數值的范圍最大可擴展62倍,因此整個變換操作可由16b的整數運算完成(除了極偶然的非正常輸入之外)。最后與Ef相乘時需要對每個系數進行一次乘法,考慮到量化也涉及乘(除)法運算,我們可以將此合并到后面的量化過程中去,利用一次乘法完成。值得注意,雖然4×4變換CfXCfT可以由整數運算完成,但這是將它所需要的乘數部分移到量化中去而實現的,因此它不能稱為嚴格意義上的整數變換。
(4-32)式的變換是一個正交變換,但由于b和d的變化(見(4-30)式和(4-31)式),它并不等于(4-27)式表示的DCT。它與DCT的性能相近。研究表明,對于相關系數等于0.9的平穩高斯—馬爾柯夫輸入過程,(4-32)式的變換編碼增益為5.38dB,而DCT的編碼增益為5.39dB,0.01dB的增益差別不會造成可察覺的性能損失;對于預測誤差而言,相關系數往往低于0.9,則編碼增益的差別更小,可以忽略不計。
4×4的逆變換由下式給出:
由(4-33)式看出,變換系數首先乘以乘數矩陣Ei(與反量化一起進行),然后再進行反變換。為了減小動態范圍的擴展,矩陣Ci和CTi的元素取為1和1/2,其中的除2運算可以由向右移位來完成。
2.整數運算的量化
基本的量化操作如下式所示:
式中,Yij和Zij分別為量化前、后的變換系數,Q為量化步長,f反映量化器死區寬度,floor(·)為取整。順便指出,在實際應用中用“取整”代替“四舍五入”,往往能獲得更好的主觀圖像質量。
在視頻壓縮的國際標準中,通常給出一定數量的可選的量化步長。例如表4-2為H.264規定的52種量化步長,表中QP為索引值,也稱為量化參數,Q為量化步長的實際大小。
表4-2 H.264編碼器的量化步長
將(4-32)式中的Ef結合進量化,(4-34)式變為
式中,Wij為經(CfXCTf)變換后的系數,PF為該系數對應位置上的乘數(a2,ab/2或者b2/4)。為了回避除法運算產生浮點數,可以將PF/Q乘以一個很大的數,然后再進行右移位操作,即令
其中:
q=15+floor(QP/6) (比特) (4-37)
根據(4-35)式和(4-36)式,量化過程可以由下式所示的整數運算完成:
其中代表二進制的右移位操作。如果將不同QP下對應于不同系數位置的MF值預先制成表,那么在對每一個變換系數進行量化時,查到該系數對應的MF值,只需一次乘法就可以同時完成量化和(4-32)式所要求的相乘兩個運算,明顯降低了計算的復雜度。式中f為常數,在H.264的參考模型軟件中,對幀內和幀間編碼模塊f分別取1/3和1/6。
值得注意,表4-2表示出QP每增加6,量化步長增大1倍,這意味著MF減小1倍,因此在(4-37)式中QP每增加6,q增加1b。從(4-36)式看出,這使得我們只需要針對QP的前6個值制作MF表。對于QP>5的情況,可以周期性地重復使用該表。
基本的反量化過程由下式所示:
Y′ij=Zij·Q (4-39)
將(4-33)式所要求的相乘運算合并到反量化過程中,則得到
W′ij=Zij·Q·PF·64 (4-40)
其中PF為(4-33)式中Ei對應位置上的元素(即a2、ab或b2),乘以64是為了避免舍入誤差。對W′ij進行(4-33)式的逆變換CTiWCi,再除以64(通過移位完成),則可獲得重建的X值。為了簡化運算,令V=(Q·PF·64),并像MF一樣將前6個QP(0≤QP≤5)對應于不同系數位置的V值預先制成表,則(4-40)式變為
W′ij=Zij·Vij·2floor(QP/6) (4-41)
每個變換系數的反量化和(4-33)式要求的相乘也只需一次乘法完成。當QP>5時,V值表可以周期性地重復使用,因為由QP增大引起的Q所增大的倍數已由2floor(QP/6)表示。
順便指出,對于16×16幀內編碼的宏塊,由于宏塊中16個4×4變換后產生的DC系數之間存在較強的相關性,因此可以對由4×4個DC系數組成的矩陣再進行哈達瑪(Hadamard)變換,以進一步提高壓縮編碼的效率。
4.1.7 碼流結構
如4.1.1節所述,視頻序列是以幀為單位進行編碼的;每一幀又被劃分為條、宏塊和塊分別進行具有運動補償的幀間預測和DCT編碼,然后轉換成一維的符號序列,經熵編碼形成一串由0和1組成的碼流。要使解碼器能夠從碼流恢復出原來的視頻序列,必須給出碼流的各段與幀、條、宏塊與塊的對應關系,這通常是將碼流按層次結構來組織,并在每個層次插入相應的頭信息來完成的。圖4-18給出了一個典型的碼流層次結構圖。

圖4-18 典型的碼流層次結構
在圖4-18中,碼流共分為6個層次:
(1)圖像序列。序列頭給出圖像分辨率、寬高比、幀率和比特率等信息;
(2)圖像組(GOP)。它是進行隨機存取的單元,其頭信息是可選的,包括GOP的開、閉等;
(3)圖像。它是基本的編碼單元,其頭信息中記錄著該幀的類型(I、P或B)、按幀或場編碼及量化表等;
(4)條(Slice)。一幅圖像可以分成一個或多個條,在每條的開始,進行DPCM的參量(如MV和DC系數)的預測值都重新置到零(稱為再同步),這可以防止解碼時誤差的傳播。它是一幀中最大的可獨立解碼的單元,也稱為再同步的單元。條的頭信息包括條的起始位置,是否全部宏塊為幀內編碼等;
(5)宏塊。它是進行運動補償的基本單元,其頭信息包括宏塊的編碼類型、MV個數等;
(6)塊。它是進行DCT的基本單元。
通常,國際標準并不對編碼器的設計作限制,這給編碼器的開發者留下了設計的余地。國際標準只規定已編碼的碼流必須遵循的句法(Syntax)、語義(Semantics)和一個標準解碼器。所謂句法是指表述碼流各層次信息的標識符的集合;語義則是句法中各符號所對應的定義。因此,只要一個廠家開發的編碼器產生的碼流符合國際標準,就能被其他廠家開發的標準解碼器正確解碼。