3.4 圖像模型
一個自然的視頻圖像包括一格采樣值.自然圖像在它們原始的狀態(tài)下通常很難于壓縮,這是因為相鄰圖像采樣值之間的很強的聯系造成的.我們可以從一幅圖像的自相關函數圖中得到不同圖像之間的相似程度.在中點處的最頂點表示圖像未經移動時的圖像.當空域移動拷貝被從原始圖像的任一個方向移除的時候,這個函數值就會急驟下降,就這說明了一個圖像采樣值的鄰域內是高度相關的.
一個運動補償的剩余圖象的自相關函數在當空域移動增加的時候快速衰減,表明了相鄰的采樣點是弱相關的.有效的運動補償在剩余幀中減少了本地相關性,這樣就讓圖象比原始狀態(tài)下的圖象更易于壓縮.圖像模型的作用就是把圖像或剩余圖像的相關性去除掉,并把它轉變?yōu)橐环N可以被熵編碼器有效編碼的數據形式.實際圖像模型一般有三個主要的組成部分:變換(去相關和簡化數據),量化(減小轉換數據的相關性)和重組(組合數據來把大值分組到一起)。
3.4.1 預測圖像編碼
運動補償是預測編碼的一個實例,在這種補償下,編碼器基于上一幀創(chuàng)造了對于當前幀的一個區(qū)域的預測并從當前域中減去這個預測來形成一個剩余幀。如果預測是成功的,那和在剩余幀中的能量是比原始幀中的能量少得多的,而且剩余幀可以用更少的位來表示。
與之相似的是,同一個圖像采樣或區(qū)域的預測可以由前面?zhèn)鬏數耐瑯訄D象或幀中組成.預測性編碼被用作是早期的壓縮算法的基礎,也是H.264的一個很重要的組成部分.幀內編碼(應用在變換域中,見后).空域預測有時被描述為"差分脈沖編碼調制"(DPCM)--從通信系統中引入的一個差分的PCM編碼方法.
B C
A X
圖中假設一個像素X是被編碼的像素點,如果在光柵順序下處理這幀的話,那么點A,B和C(在當前和之前行的鄰近像素)在編碼和解碼器中都是可得的(因為他們已經在X之前被解碼).編碼器在根據一些在之前編碼的像素的組合來得到對于X的預測,從X中減掉這個預測,然后編碼剩余幀頻(做差之后的結果).解壓器形成相同的預測,然后把解碼的剩余幀加進去來重建像素值.如果編碼過程是有損的(比如說剩余幀被量化了)那么解碼的像素值A,B,C也許與原始的A,B,C是不同的(因為編碼過程的損失),這樣的話上述的過程可能在編碼器和解碼器上引起累積的不匹配.這種情況下,編碼器應該解碼剩余幀中的R(X),并重建像素.
比如說:
編碼器預測: P(X) = (2A + B + C) / 4
剩余幀 R(X) = X - P(X) 被編碼并傳輸
解碼器解碼R(X)并組成同樣的預測: P(X) = (2A + B + C) / 4
重建像素 X = R(X) + P(X)
編碼器使用解碼的像素值A,B,C來構成重建,比如說,P(X)=(2A+B+C)/4.這樣的話,編碼器和解碼器使用同樣的P(X),這樣就可以避免錯位的發(fā)生.
這種方法的壓縮的效率依賴于對于P(X)預測的準確性.如果預測是準確的(P(X)與X的值是相近的),那么剩余幀的能量就非常小了.然而,并不是經常都能選擇一個對復雜圖像來說那么理想的預測器的.編碼器就有必要指出對解碼端選擇預測器,這樣就有一個預測和需要的多余位來表示信號和預測器的一個折衷考慮了.
3.4.2 變換編碼
3.4.2.1 總述
圖像中或視頻CODEC中的變換階段是把圖像或運動補償剩余值轉到另一個域中(變換域中)。變換的選擇依賴于以下幾個分類
1. 在轉換域中的數據是去相關性的(轉換域中的數據的大多數能量都會聚集到很小的值中)
2. 轉換應該是可逆的.
3. 轉換的計算過程應該是易于處理的,
對圖像和視頻壓縮以及很多的變換都建議使用以下兩類方式:基于塊的變換和基于圖像的變換?;趬K的變換的例子比如Karhunen-Loeve變換(KLT),單值分解(SVD)和余弦變換(DCT)。每一種變換都是對于N*N的圖像塊或剩余樣本來說的,這樣圖像就被用塊的單元來處理。塊變換有很低的內存需求而且很適于基于塊的運動補償剩余幀的壓縮,但是受邊界區(qū)域的影響比較嚴重?;趫D像的變換對于整個圖像或幀來進行操作(或一個圖像的一大段進行操作)。最常用的圖像變換是離散小波變換(DWT或直接說小波變換)。像DWT這樣的變換對于表態(tài)圖像的壓縮來說已經被證明是很有效的了,但是它們對內存的消耗都比較大(因為整個圖像或段都以單個單元來進行處理)而且不適用于基于塊的運動補償方法。DCT和DWT在MPEG4視頻部分中都得到了應用(而且一個DCT的變種在H.264中被使用)。它們將在下面幾節(jié)被討論。
3.4.2.2
余弦變換在X中進行運算(X是一個N*N的采樣塊,通常是指在預測之后的圖像采樣或剩余幀值)來構造Y,一個N*M的系數塊。DCT的操作(及它的反變換IDCT),可以用變換矩陣A來描述。一個N*N采樣塊的DCT變換由如下式子得到:Y=AXA(T),反DCT變換:Y=AXA(T),A(T)表示A的對稱矩陣
X是一個采樣的矩陣,Y是一個系統的矩陣,A是一個N*N的變換矩陣。A的元素是:
A(i,j) = C(i) * cos [(2j+1)*i*PI]/2N
C(i)= N^(-1/2) i=0
(2/N)^(-1/2) i>0
一個二維DCT的輸出是一組N*N的系數,它表示了圖像在DCT域中的塊數據,這些系數可以被想成是一組標準基的”權“值。任何圖像塊都可以由編合所有的N*N標準基來重組,通過這些基乘以相應的權因素值(系數)。
例2 圖像塊的DCT系數
一個選定的4*4的塊,以及DCT系數。這種用DCT域表示塊的方法的優(yōu)點不是很明顯的,因為并沒有減少存儲的空間,原來我們存16個像素值,我們現在成了需要存16個DCT系數。DCT的實用性當塊被從系數的一個子集中構建出來的時候表現了出來:
把除去一些很大的值之外的所有的系數設為0,執(zhí)行IDCT之后的結果如下圖:在IDCT之前加入更多的系數可以形成漸近的更加準確的對原圖的重建。這樣,就可能從從一個子集的系數集中近似于原始的圖像。刪除系數中的小系數值(比如說通過量化)可以讓圖像數據在更少的系數表示位中表示出來,盡管這樣做會影響圖像的質量。
3.4.2.3 小波
流行的"小波變換"要(基于一系列系數與離散小波函數相等的濾波器來進行圖像壓縮的一種廣泛使用的方法).一個應用于有N個采樣結果的離散信號的離散小波變換的基本運行過程如下.一對濾波器被用來把信號分解為一個低頻部分(L)和一個高頻部分(H).每個波段由因子2被子采樣化,這樣這兩個頻率波都含有N/2個采樣點。如果正確選擇了濾波器的話,這個操作過程是可逆的。
這種方法可以被擴展應用到一個二維的信號上,比如說灰度圖中。一個2D圖的每一行都被經過低通和高通的濾波(Lx和Hx),每個濾波器的輸出被下采樣用來制造中間圖像L和H。L是原始圖象的低通濾波,并通過在x方向進行下采樣的結果.H是原圖像的高通濾波并在x方向的下采樣結果。接下來,這些新圖的每一列都使用低和高通的濾波器(Ly和Hy),并經過下采樣來制造出四個子圖象(LL,LH,HL,HH)。這四個子圖象可以被組合為與原圖的采樣數相同的圖象。LL是原圖通過在水平和垂直方向經過低通,并用因素2進行子采樣的結果。HL是通過在垂直方向經過高通濾波并包含了剩余垂直頻率的結果。LH是通過在水平方向高通濾波并包含了剩余的水平頻的結果,而HH是通過在水平和垂直兩個方向進行高通濾波的結果。它們之間,四個圖像包含了所有的原始圖像的信息,但是LH,HL,HH的稀疏性使它們更加容易壓縮。
在圖像壓縮程序中,二維的小波分解被繼續(xù)應用到LL圖中,來組成四個新的子圖。得到的新的低通圖象繼續(xù)被得到子圖象。很多高頻的采樣結果都是接近0的,它就可以通過把小值來移除來達到更優(yōu)化的傳輸。在解碼端,原圖像通過上采樣,濾波和加值被重建。
3.4.3 量化
量化器把一個在值域X的信號量化減為到值域Y中。使用更小的位來表示量化后的信號是可行的,因為轉換后的值域比原來更小了。一個標量的量化器把輸入的信號映射到一個量化的輸出值域中,而一個向量的量化器把一組輸入采樣值映射到一組量化值中。
3.4.3.1 標量量化
標量量化的一個簡單的例子就是把小數近似到最近的整數上,比如,從R到Z的映射。這個過程是有損的(不可逆的)因為它是無法從被近似后的結果來恢復出原來的小數的。
一個量化的更加通用的例子就是:
FQ = round (X/QP)
Y=FQ * QP
這里QP是量化的步長。量化輸出級間隔單一的QP間斷值。
在圖像或視頻的CODEC中,量化操作通常由兩部分構成:編碼端的前向量化FQ,和解碼端的反量化(IQ).(事實上量化是不可逆的,這樣用一個更準確的叫法的話:標量器和重標量器。在兩個標量值之間的QP步長是一個重要的參數。如果步長很長的話,那么量化值的范圍就很小,這樣的話就可以在傳輸過程中被更有效地被表示(高壓縮比地壓縮).但是重量化值是原信號值的近似。如果步長很小的話,重量化值與原始信號更加匹配,但是量化值就落到一個更大的范圍之內,就降低了壓縮的效率。
量化可以被用來在像DCT或小波變換之后,除去了小系數之后降低圖像數據的精確度。一個圖像或視頻的前向量化器設計為映射小系數值到0而保留一部分大系數值。前向量化器的輸出通常是一個稀疏的量化系數的數組,大都為0。
3.4.3.2 向量量化
一個向量量化器把一系列的輸入數據(比如一塊圖像采樣)映射到一個單值(codeword),而在解碼端,每個單值(codeword)都映射到一個對于原始輸入數據的近似。這組向量保存在編碼和解碼端,被用來當作一個編碼表。在圖像壓縮中一個典型的向量量化程序如下:
1. 把原始圖像分區(qū)(比如M × N像素塊)
2. 從編碼表中選擇一個與當前區(qū)域最相近的向量
3. 把選定的向量的序號傳給解碼器
4. 在解碼端,用選定的向量來重建一個原始圖像的拷貝。
量化是被用在空間域中(比如說用向量量化過的圖像采樣組),但是它也可以被用在運動補償或變換數據中.向量量化設計中的關鍵問題包含編碼表的設計和在編碼表中有效都查找最優(yōu)化的向量的問題。
3.4.4 重排列和零編碼
量化過的變換系數需要被仔細編碼來進行存儲和傳輸。在基于變換的圖像或視頻編碼器上,量化器的輸出是一個稀疏的數組,它包含了一些非0的系數和很多的0值系數。重排(把非0系數進行重組)和有效地表示0系數要在熵編碼前進行操作。這些過程在DCT和小波變換中被提到了。
3.4.4.1 DCT
系數分布
一塊圖像或剩余采樣的大的DCT系數通常都是在DC(0,0)系數“低頻”部分。DCT系數的非0系數都聚在上頂部系數,而分布在水平和垂直方向是大約對稱的。對于剩余區(qū)域來說,聚集在DC位置的系數是歪斜的,比如說,更多的非0系數在左手邊出現。這是因為區(qū)域圖片在垂直方向有很強的高頻成分(因為在垂直方向的子采樣),這樣因為垂直頻率的原因得到了更大的DCT系數。
掃描
在量化之后,塊的DCT系數被重排以把非0系數進行組合,以使對于剩余0值的表示方法更加有效。優(yōu)化的重組方法(掃描方法)依賴于非0DCT系數的分布情況。對于經典的一幀來說,合適的掃描方式應該是gzag法,它是從左上角的DC系數開始的.從DC系數開始,每一個量化的系數被拷貝到一維數組里面。非0系數在重排數列的最前端被重組,而在之后是很長序列的0值。
gzag掃描掃描方式對于一個域塊可能并不是理想的,因為系數是歪斜分布的,那么一個修改后的掃描順序可會是有效的,比如說左邊的系數在右邊系數掃描之前被掃描。
運行級編碼
重排過程的輸出是一個通常在開始端包含一個或多個簇的非0系數,后面的是一串0值系數。這些0值被編碼而實現更優(yōu)化的表示方法,比如說,通過表示一串0里面的數量來縮減表示位數等等。
例如:
輸入數組:16,0,0,-3,5,6,0,0,0,0,-7, . . .
輸出值: (0,16),(2,-3),(0,5),(0,6),(4,-7). . .
DCT系數高頻部分常被量化為0,這樣一個重排的塊通常以一串0結尾。一個特殊情況是需要指出一個塊中的最后一個非0系數。在所謂的二維運行級編碼被使用。每一個運行級對被用上面的方式進行編碼,而一個單獨的編碼符號"last",用來指出最后一個0值的位置。如果三維的運行級編碼被使用的話,每個符號編碼要編三個量化值:運行度,級數以及最后非0值。如上例就可以寫為:
(0, 16, 0), (2,-3, 0), (0, 5, 0), (0, 6, 0), (4,-7, 1)
最后一個碼中的1表示這是這個塊中最后一個非0值。
3.4.4.2 小波
系數分布
很多在高子波中的系數(右下方的系數值)都是接近于0值的,可以被量化到0而不損失圖像的質量。非0系數對應于圖像的結構,比如說,在violin圖中,弓就有很清晰的垂直結構。當低頻中的系數是非0時,有很大的可能性在高頻相應的系數也是0。這們設想一個非0的量化系數樹,以在低頻中根部開始。在第一層的一個單個LL的系數在其他的第一層有相應的系數值。第一層系數位置映射到四個相應的子段的同一位置的系數位置.
零樹編碼
在熵編碼之前越好地編碼非0小波系數就越好.達到這一點的一個有效的方法就是從最低層開始編碼每個非0系數樹.最低層的系數需要被編碼,接著是它在高層的子系數,如此反復.編碼過程在樹達到0值系數的時候一直運行.之后的的全0值的層的子層值都為0.在解碼端,重建過程從樹根開始,非0系數被解碼并重建,當遇到零樹的時候,所有的剩余的子結點都被設為0.這嵌入零樹(EZW)的小波系數編碼方法.編碼過程包含一種其他的可能性,0值系數可能跟著(a)一個零樹(就像原來那樣),或(b)一個非零的子系數陣.(b)不常發(fā)生,但是如果考慮到這些不常發(fā)生的情況的時候,重建圖像的質量會被輕微地提高.
【作者: BUUVT】【訪問統計: 412】【2005年04月27日 星期三 21:04】