運動補償
運動補償是一種描述相鄰影格(相鄰在這裏表示在編碼關係上相鄰,在播放順序上兩影格未必相鄰)差別的方法,具體來說是描述前面一影格(相鄰在這裏表示在編碼關係上的前面,在播放順序上未必在當前影格前面)的每個小塊怎樣移動到當前影格中的某個位置去。這種方法經常被視像壓縮/視像編解碼器用來減少視像序列中的時域冗餘。它也可以用來進行去交織(deinterlacing)以及運動插值(motion interpolation)的操作。
一個視像序列包含一定數量的圖片--通常稱為影格(frame)。相鄰的圖片通常很相似,包含了很多冗餘。使用運動補償的目的是通過消除這種冗餘,來提高壓縮比。
最早的運動補償的設計只是簡單的從當前影格中減去參考影格,從而得到通常含有較少能量(或者稱為資訊)的"殘差",從而可以用較低的位元速率進行編碼。解碼器可以通過簡單的加法完全恢復編碼影格。
一個稍微複雜一點的設計是估計一下整影格場景的移動和場景中物體的移動,並將這些運動通過一定的參數編碼到碼流中去。這樣預測影格上的像素值就是由參考影格上具有一定位移的相應像素值而生成的。這樣的方法比簡單的相減可以獲得能量更小的殘差,從而獲得更好的壓縮比--當然,用來描述運動的參數不能在碼流中佔據太大的部分,否則就會抵消複雜的運動估計帶來的好處。
通常,圖像影格是一組一組進行處理的。每組的第一影格(通常是第一影格)在編碼的時候不使用運動估計的辦法,這種影格稱為影格內編碼影格(Intra frame)或者I影格。該組中的其它影格使用影格間編碼影格(Inter frame),通常是P影格。這種編碼方式通常被稱為IPPPP,表示編碼的時候第一影格是I影格,其它影格是P影格。
在進行預測的時候,不僅僅可以從過去的影格來預測當前影格,還可以使用未來的影格來預測當前影格。當然在編碼的時候,未來的影格必須比當前影格更早的編碼,也就是說,編碼的順序和播放的順序是不同的。通常這樣的當前影格是使用過去和未來的I影格或者P影格同時進行預測,被稱為雙向預測影格,即B影格。這種編碼方式的編碼順序的一個例子為IBBPBBPBBPBB。
全域運動補償
在全域運動補償中,運動模型基本上就是反映攝像放像機的各種運動,包括平移,旋轉,變焦等等。這種模型特別適合對沒有運動物體的靜止場景的編碼。 全域運動補償有下面的一些優點:
- 該模型僅僅使用少數的參數對全域的執行進行描述,參數所佔用的位元速率基本上可以忽略不計。
- 該方法不對影格進行分區編碼,這避免了分區造成的塊效應。
- 在時間方向的一條直線的點如果在空間方向具有相等的間隔,就對應了在實際空間中連續移動的點。其它的運動估計演算法通常會在時間方向引入非連續性。
但是,缺點是,如果場景中有運動物體的話,全域運動補償就不足以表示了。這時候應該選用其它的方法。
分塊運動補償
在分塊運動補償(BMC for block motion compensation)中,每影格被分為若干像素塊(在大多數視像編碼標準,如MPEG中,是分為16x16的像素塊)。從參考影格的某個位置的等大小的塊對當前塊進行預測,預測的過程中只有平移,平移的大小被稱為運動向量。
對分塊運動補償來說,運動向量是模型的必要參數,必須一起編碼加入碼流中。由於運動向量之間並不是獨立的(例如屬於同一個運動物體的相鄰兩塊通常運動的相關性很大),通常使用差分編碼來降低位元速率。這意味着在相鄰的運動向量編碼之前對它們作差,只對差分的部分進行編碼。使用熵編碼對運動向量的成分進行編碼可以進一步消除運動向量的統計冗餘(通常運動向量的差分集中於0向量附近)。
運動向量的值可以是非整數的,此時的運動補償被稱為亞像素精度的運動補償。這是通過對參考影格像素值進行亞像素級插值,而後進行運動補償做到的。最簡單的亞像素精度運動補償使用半像素精度,也有使用1/4像素和1/8像素精度的運動補償演算法。更高的亞像素精度可以提高運動補償的精確度,但是大量的插值操作大大增加了計算複雜度。
分塊運動補償的一個大缺點在於在塊之間引入的非連續性,通常稱為塊效應。當塊效應嚴重時,解碼圖像看起來會有像馬賽克一樣的效果,嚴重影響視覺質素。另外一個缺點是,當高頻分量較大時,會引起振鈴效應。關於高頻分量,請參見對運動補償後的殘差進行轉換的方法:轉換編碼。
可變分塊運動補償
可變分塊運動補償(VBSMC,全稱 Variable Block Size Motion Compensation)是BMC的變種,編碼器可以動態選擇分塊大小。進行視像編碼時,使用大的分塊可以減少表徵運動向量所需的位元數,使用小的分塊則可以在編碼時產生更少的預測餘量資訊。較老的設計,象H.261和MPEG-1視像編碼,典型的使用了固定分塊,而較新的設計,像H.263、MPEG-4 Part 2、H.264/MPEG-4 AVC和VC-1則賦予了編碼器動態選擇何種分塊來表徵運動圖像的能力。
重疊分塊運動補償
重疊分塊運動補償(OBMC for Overlapped block motion compensation)是一種更好的解決方案,它不但能增加預測精度,而且能夠避免塊失真。 因此,每個像素第屬於4個分塊。基於此方案,每個像素的4個預測值求和後得到一個加權平均數。
為此目的,分塊被關聯到一個窗口函數,該窗口函數具有任何地方的4個重疊窗口的總和為1的特質。
運動估計
運動估計就是尋找最佳或次優的運動向量的過程。某個塊的預測誤差量常常是指在運動補償區域所有像素中,預測像素和實際像素數值的均方差或者絕對差別總和。
發現最佳向量,一個最基本的方法是不得不為在固定探測範圍內,給每一個運動向量,計算塊的預測誤差計算鄰近禎之中找尋前後frame之中相似的Macro Block,兩者之間的差異值。以及估算表示此Motion Vector所需的位元數目,和在錯誤數和位元數之間挑選一個最折中作為運動向量值。運動估計技術儘量簡單的測試在執行前一個簡單的探測測試技術為:估計所有可能的運動表現,比如這樣的最佳化被稱做全探測。
一個稍快但不是最佳的方法是用第一個近似值作為一個粗略探測柵格,然後在接下來的步驟里在近似值的周圍精確柵格。
一個通用辦法是3步探測,用3次探測柵格;3個運動向量和3個精確步驟來得到15次15個像素範圍內的全面探測。
對於分塊運動估計,一個塊的像素預測誤差和它的附近搭接塊,根據此前自乘的窗函數,都被測重和求和。
分塊運動估計最主要的缺點是增加計算的複雜性,和實際的預測誤差,因而最佳向量依靠於臨近運動塊向量。
因此,沒有一個多項式(計算的複雜性)演算法可以保證最佳運動向量。
然而,在可接受的計算的複雜性上,存在最接近最理想迭代和非迭代方法。