運動補償
運動補償是一種描述相鄰幀(相鄰在這裡表示在編碼關係上相鄰,在播放順序上兩幀未必相鄰)差別的方法,具體來說是描述前面一幀(相鄰在這裡表示在編碼關係上的前面,在播放順序上未必在當前幀前面)的每個小塊怎樣移動到當前幀中的某個位置去。這種方法經常被視頻壓縮/視頻編解碼器用來減少視頻序列中的時域冗餘。它也可以用來進行去交織(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個像素範圍內的全面探測。
對於分塊運動估計,一個塊的像素預測誤差和它的附近搭接塊,根據此前自乘的窗函數,都被測重和求和。
分塊運動估計最主要的缺點是增加計算的複雜性,和實際的預測誤差,因而最優向量依靠於臨近運動塊向量。
因此,沒有一個多項式(計算的複雜性)算法可以保證最優運動向量。
然而,在可接受的計算的複雜性上,存在最接近最理想迭代和非迭代方法。