MPEG採用了Ahmed(一個巨牛的數學家) 等人於70年代提出的離散餘弦變換(DCT-Discrete Cosine Transform)壓縮演算法,降低視頻訊號的空間冗餘度。
DCT將運動補償誤差或原畫面資訊塊轉換成代表不同頻率分量的係數集,這有兩個優點:其一,訊號常將其能量的大部分集中於頻率域的1個小範圍內,這樣一來,描述不重要的分量只需要很少的位元數;其二,頻率域分解映射了人類視覺系統的處理過程,並允許後繼的 量化過程滿足其靈敏度的要求。
關於這一點在我手頭的教程中有詳盡的描述,讓我直接引用:
視頻訊號的頻譜線在0-6MHz範圍內,而且1幅視頻映像內包含的大多數為低頻頻譜線,只在占映像地區比例很低的映像邊緣的視頻訊號中才含有高頻的譜線。因此,在視頻訊號數文書處理時,可根據頻譜因素分配位元數:對包含資訊量大的低頻譜地區分配較多的位元數,對包含資訊量低的高頻 譜地區分配較少的位元數,而映像品質並沒有可察覺的損傷,達到碼率壓縮的目的。然而,這一切要在低熵(Entropy)值的情況下,才能達到有效編碼。能否對一串資料進行有效編碼,取決於每個資料出現的機率。每個資料出現的機率差別大,就表明熵值低, 可以對該串資料進行高效編碼。反之,出現的機率差別小,熵值高,則不能進行高效編碼。視頻訊號的數字化是在規定的取樣頻率下由A/D轉換器對視頻電平轉換而來的,每個像素的視頻訊號幅度隨著每層的時間而周期性地變化。每個像素的平均資訊量的總和為總平均資訊量,即熵值。由於每個視頻電平發生幾乎具有相等的機率,所以視頻訊號的熵值很高。 熵值是一個定義碼率壓縮率的參數,視頻映像的壓縮率依賴於視頻訊號的熵值,在多數情況下視頻訊號為高熵值,要進行高效編碼,就要將高熵值變為低熵值。怎樣變成低熵值呢?這就需要分析視頻頻譜的特點。大多數情況下,視頻頻譜的幅度隨著頻率的升高而降低。其中 低頻頻譜在幾乎相等的機率下獲得0到最高的電平。與此相對照,高頻頻譜通常得到的是低電平及稀少的高電平。顯然,低頻頻譜具有較高的熵值,高頻頻譜具有較低的熵值。據此,可對視頻的低頻分量和高頻分量分別處理,獲得高頻的壓縮值。
由上面的引用可見,碼率壓縮基於變換編碼和熵值編碼兩種演算法。前者用於降低熵值,後者將資料變為可降低位元數的有效編碼方式。在MPEG標準中,變換編碼採用的是DCT,變換過程本身雖然並不產生碼率壓縮作用,但是變換後的頻率係數卻非常有利於碼率壓縮。 實際上壓縮數位視訊訊號的整個過程分為塊取樣、DCT、量化、編碼4個主要過程進行-----首先在時間域將原始映像分成N(水平)×N(垂直)取樣塊,根據需要可選擇4×4、4×8、8×8、8×16、16×16等塊,這些取樣的像素塊代表了原映像幀各像素的灰階值,其範圍在139-163之間,並依序送入DCT編碼器,以便將取樣塊由時間域轉換為頻率域的DCT係數塊。DCT系統的轉換分別在每個取樣塊中進行,這些塊中每個取樣是數字化後的值,表示一場中對應像素的視頻訊號幅度值。
DCT和它解壓時的反運算的具體演算法如下。
當u,v = 0 時,離散餘弦正變換(DCT)後的係數若為F(0,0)=1,則離散餘弦反變換(IDCT)後的重現函數f(x,y)=1/8,是個常數值,所以將F(0,0)稱為直流(DC)係數;當 u,v≠0時,正變換後的係數為F(u,v)=0,則反變換後的重現函數f(x,y)不是常數,此時正變換後的係數F(u,v)為交流(AC)係數。
本文僅討論靜止映像的壓縮基本演算法,映像壓縮的目的在於以較少的資料來
表示映像以節約儲存費用,或者傳輸時間和費用。
JPEG壓縮演算法可以用失真的壓縮方式來處理映像,但失真的程度卻是肉眼所
無法辯認的。這也就是為什麼JPEG會有如此滿意的壓縮比例的原因。
下面主要討論,JPEG基本壓縮法。
一.JPEG壓縮過程
JPEG壓縮分四個步驟實現:
1.顏色模式轉換及採樣;
2.DCT變換;
3.量化;
4.編碼。
二.1.顏色模式轉換及採樣
RGB色彩系統是我們最常用的表示顏色的方式。JPEG採用的是YCbCr色彩系統。
想要用JPEG基本壓縮法處理全彩色映像,得先把RGB顏色模式映像資料,轉換為
YCbCr顏色模式的資料。Y代表亮度,Cb和Cr則代表色度、飽和度。通過下列計算
公式可完成資料轉換。
Y=0.2990R+0.5870G+0.1140B
Cb=-0.1687R-0.3313G+0.5000B+128
Cr=0.5000R-0.4187G-0.0813B+128
人類的眼晴對低頻的資料比對高頻的資料具有更高的敏感度,事實上,人類
的眼睛對亮度的改變也比對色彩的改變要敏感得多,也就是說Y成份的資料是比較
重要的。既然Cb成份和Cr成份的資料比較相對不重要,就可以只取部分資料來處
理。以增加壓縮的比例。JPEG通常有兩種採樣方式:YUV411和YUV422,它們所代
表的意義是Y、Cb和Cr三個成份的資料取樣比例。
2.DCT變換
DCT變換的全稱是離散餘弦變換(Discrete Cosine Transform),是指將一組
光強資料轉換成頻率資料,以便得知強度變化的情形。若對高頻的資料做些修飾,
再轉回原來形式的資料時,顯然與未經處理資料有些差異,但是人類的眼睛卻是不容
易辨認出來。
壓縮時,將原始映像資料分成8*8資料單元矩陣,例如亮度值的第一個矩陣內
容如下:
JPEG將整個亮度矩陣與色度Cb矩陣,飽和度Cr矩陣,視為一個基本單元稱作
MCU。每個MCU所包含的矩陣數量不得超過10個。例如,行和列採樣的比例皆為4:
2:2,則每個MCU將包含四個亮度矩陣,一個色度矩陣及一個飽和度矩陣。
當映像資料分成一個8*8矩陣後,還必須將每個數值減去128,然後一一代入
DCT變換公式中,即可達到DCT變換的目的。映像資料值必須減去128,是因為DCT
轉換公式所接受的數字範圍是在-128到+127之間。
DCT變換公式:
x,y代表映像資料矩陣內某個數值的座標位置
f(x,y)代表映像資料矩陣內的數個數值
u,v代表DCT變換後矩陣內某個數值的座標位置
F(u,v)代表DCT變換後矩陣內的某個數值
u=0 且 v=0 c(u)c(v)=1/1.414
u>0 或 v>0 c(u)c(v)=1
經過DCT變換後的矩陣資料自然數為頻率係數,這些係數以F(0,0)的值最
大,稱為DC,其餘的63個頻率係數則多半是一些接近於0的正負浮點數,一概稱
之為AC。
3、量化
映像資料轉換為頻率係數後,還得接受一項量化程式,才能進入編碼階段。
量化階段需要兩個8*8矩陣資料,一個是專門處理亮度的頻率係數,另一個則是
針對色度的頻率係數,將頻率係數除以量化矩陣的值,取得與商數最近的整數,
即完成量化。
當頻率係數經過量化後,將頻率係數由浮點數轉變為整數,這才便於執行最
後的編碼。不過,經過量化階段後,所有資料只保留整數近似值,也就再度損失
了一些資料內容,JPEG提供的量化表如下:
4、編碼
Huffman編碼無專利權問題,成為JPEG最常用的編碼方式,Huffman編碼通常
是以完整的MCU來進行的。
編碼時,每個矩陣資料的DC值與63個AC值,將分別使用不同的Huffman編碼
表,而亮度與色度也需要不同的Huffman編碼錶,所以一共需要四個編碼錶,才
能順利地完成JPEG編碼工作。
DC編碼
DC是彩採用差值脈衝編碼調製的差值編碼法,也就是在同一個映像分量中取
得每個DC值與前一個DC值的差值來編碼。DC採用差值脈衝編碼的主要原因是由於
在連續色調的映像中,其差值多半比原值小,對差值進行編碼所需的位元,會比
對原值進行編碼所需的位元少許多。例如差值為5,它的二進位表示值為101,如
果差值為-5,則先改為正整數5,再將其二進位轉換成1的補數即可。所謂1的補
數,就是將每個Bit若值為0,便改成1;Bit為1,則變成0。差值5應保留的位元
為3,下表即列出差值所應保留的Bit數與差值內容的對照。
在差值前端另外加入一些差值的霍夫曼碼值,例如亮度差值為5(101)的位
數為3,則霍夫曼碼值應該是100,兩者串連在一起即為100101。下列兩份表格分
別是亮度和色度DC差值的編碼錶。根據這兩份表格內容,即可為DC差值加上霍夫
曼碼值,完成DC的編碼工作。
AC編碼
AC編碼方式與DC略有不同,在AC編碼之前,首先得將63個AC值按Zig-zag排
序,即按照箭頭所指示的順序串聯起來。
63個AC值排列好的,將AC係數轉換成中間符號,中間符號表示為RRRR/SSSS,
RRRR是指第非零的AC之前,其值為0的AC個數,SSSS是指AC值所需的位元,AC系
數的範圍與SSSS的對應關係與DC差值Bits數與差值內容對照表相似。
如果連續為0的AC個數大於15,則用15/0來表示連續的16個0,15/0稱為ZRL
(Zero Rum Length),而(0/0)稱為EOB(Enel of Block)用來表示其後所
剩餘的AC係數皆等於0,以中間符號值作為索引值,從相應的AC編碼錶中找出適
當的霍夫曼碼值,再與AC值相連即可。
例如某一組亮度的中間符為5/3,AC值為4,首先以5/3為索引值,從亮度AC
的Huffman編碼錶中找到1111111110011110霍夫曼碼值,於是加上原來100(4)
即是用來取[5,4]的Huffman編碼1111111110011110100,[5,4]表示AC值為4的
前面有5個零。
由於亮度AC,色度AC霍夫曼編碼錶比較長,在此省略去,有興趣者可參閱相
關書籍。
實現上述四個步驟,即完成一幅映像的JPEG壓縮。
參考資料
[1] 林福宗 《影像檔格式(上)——Windows 編程》,清華大學出版社,
1996年
[2] 李振輝、李仁各編著,《探索影像檔的奧秘》,清華大學出版社,1996年
[3] 黎洪松、成實譯《JPEG靜止資料壓縮標準》,學苑出版社,1996年
JPEG映像壓縮演算法:
輸入映像被分成8*8或16*16的小塊,然後對每一小塊進行二維DCT(離散餘弦變換)變換,變換後的係數量化、編碼並傳輸;
JPEG檔案解碼量化了的DCT係數,對每一塊計算二維逆DCT變換,最後把結果塊拼接成一個完整的映像。在DCT變換後捨棄那些不嚴重影響映像重構的接近0的係數。
DCT變換的特點是變換後映像大部分能量集中在左上方,因為左上放映原映像低頻部分資料,右下反映原映像高頻部分資料。而映像的能量通常集中在低頻部分。