運動補償

運動補償

徠運動補償是一種描述相鄰幀(相鄰在這裡表示在編碼關係上相鄰,在播放順序上兩幀未必相鄰)差別的方法,具體來說是描述前面一幀的每個小塊怎樣移動到當前幀中的某個位置去。這種方法經常被視頻壓縮/視頻編解碼器用來減少視頻序列中的空域冗餘。它也可以用來進行去交織(deinterlacing)與以及運動插值(motioninterpolation)的操作。

研究目的


一個視頻序列包含一定數量的圖片,通常稱為幀(frame)。相鄰的幀通常很相似,也就是說,包含了很多冗餘。使用運動補償的目的是通過消除這種冗餘,來提高壓縮比。

起源


最早的運動補償的設計只是簡單的從當前幀中減去參考幀,從而得到通常含有較少能量(或者稱為信息)的"殘差",從而可以用較低的碼率進行編碼。解碼器可以通過簡單的加法完全恢復編碼幀。
一個稍微複雜一點的設計是估計一下整幀場景的移動和場景中物體的移動,並將這些運動通過一定的參數編碼到碼流中去。這樣預測幀上的像素值就是由參考幀上具有一定位移的相應像素值而生成的。這樣的方法比簡單的相減可以獲得能量更小的殘差,從而獲得更好的壓縮比--當然,用來描述運動的參數不能在碼流中佔據太大的部分,否則就會抵消複雜的運動估計帶來的好處。
通常,圖像幀是一組一組進行處理的。每組的第一幀(通常是第一幀)在編碼的時候不使用運動估計的辦法,這種幀稱為幀內編碼幀(Intraframe)或者I幀。該組中的其它幀使用幀間編碼幀(Interframe),通常是P幀。這種編碼方式通常被稱為IPPPP,表示編碼的時候第一幀是I幀,其它幀是P幀。
徠在進行預測的時候,不僅僅可以從過去的幀來預測當前幀,還可以使用未來的幀來預測當前幀。當然在編碼的時候,未來的幀必須比當前幀更早的編碼,也就是說,編碼的順序和播放的順序是不同的。通常這樣的當前幀是使用過去和未來的I幀或者P幀同時進行預測,被稱為雙向預測幀,即B幀。這種編碼方式的編碼順序的一個例子為IBBPBBPBBPBB。

分類


包括全局運動補償和分塊運動補償以及其變種可變分塊運動補償三類。

全局運動補償

在全局運動補償中,運動模型基本上就是反映攝像機的各種運動,包括平移,旋轉,變焦等等。這種模型特別適合對沒有運動物體的靜止場景的編碼。它有下面的一些優點:
1)該模型僅僅使用少數的參數對全局的運行進行描述,參數所佔用的碼率基本上可以忽略不計。
2)該方法不對幀進行分區編碼,這避免了分區造成的塊效應。
3)在時間方向的一條直線的點如果在空間方向具有相等的間隔,就對應了在實際空間中連續移動的點。其它的運動估計演演算法通常會在時間方向引入非連續性。
但是,缺點是,如果場景中有運動物體的話,全局運動補償就不足以表示了。這時候應該選用其它的方法。

分塊運動補償

每幀被分為若干像素塊(在大多數視頻編碼標準,如MPEG中,是分為16x16的像素塊)。從參考幀的某個位置的等大小的塊對當前塊進行預測,預測的過程中只有平移,平移的大小被稱為運動矢量。
對分塊運動補償來說,運動矢量是模型的必要參數,必須一起編碼加入碼流中。由於運動矢量之間並不是獨立的(例如屬於同一個運動物體的相鄰兩塊通常運動的相關性很大),通常使用差分編碼來降低碼率。這意味著在相鄰的運動矢量編碼之前對它們作差,只對差分的部分進行編碼。使用熵編碼對運動矢量的成分進行編碼可以進一步消除運動矢量的統計冗餘(通常運動矢量的差分集中於0矢量附近)。
運動矢量的值可以是非整數的,此時的運動補償被稱為亞像素精度的運動補償。這是通過對參考幀像素值進行亞像素級插值,而後進行運動補償做到的。最簡單的亞像素精度運動補償使用半像素精度,也有使用1/4像素和1/8像素精度的運動補償演演算法。更高的亞像素精度可以提高運動補償的精確度,但是大量的插值操作大大增加了計算複雜度。

可變分塊補償

可變分塊運動補償(VBSMC,全稱VariableBlockSizeMotionCompensation)是BMC的變種,編碼器可以動態選擇分塊大小。進行視頻編碼時,使用大的分塊可以減少表徵運動向量所需的比特數,使用小的分塊則可以在編碼時產生更少的預測余量信息。較老的設計,像H.261和MPEG-1視頻編碼,典型的使用了固定分塊,而較新的設計,像H.263、MPEG-4Part2、H.264/MPEG-4AVC和VC-1則賦予了編碼器動態選擇何種分塊來表徵運動圖像的能力。

缺點


分塊運動補償的一個大缺點在於在塊之間引入的非連續性,通常稱為塊效應。當塊效應嚴重時,解碼圖像看起來會有像馬賽克一樣的效果,嚴重影響視覺質量。另外一個缺點是,當高頻分量較大時,會引起振鈴效應。關於高頻分量,請參見對運動補償后的殘差進行變換的方法:變換編碼。