【資料壓縮】JPEG標準與原理解析
為了滿足不同應用的需求,JPEG標準包括兩種基本的壓縮方法:1.基於DCT的有損壓縮演算法;2.基於預測方法的無損壓縮演算法。基於DCT的基準系統有損壓縮技術是到目前為止應用最為廣泛的一種壓縮方法,本文將詳細解析此演算法。
1.基於DCT有損壓縮原理
下面是編碼器和解碼器的流程圖,壓縮過程:原圖分成8×8的子塊,分別進行正向離散餘弦變換(FDCT),對每個8×8子塊的係數採用量化表進行量化,最後使用熵編碼,輸出位元流。解碼器是完整的逆過程,本文章不再贅述!
1.1離散餘弦變換(DCT)
首先把原始映像分割成8×8的子塊(如果寬或高不是8的整數倍,可以用黑色邊框填充),每個子塊進行獨立編碼處理。在進行FDCT變換之前,把64個無符號整型灰階值[0,255]平移到[-128,+127]範圍中。通過DCT變換,8×8個灰階值被轉換為8×8個頻率譜值,分別對應不同頻率。DCT變換係數值均為實數。低頻譜值位於左上部分,高頻譜值位於右下部分。通過下述公式可知,左上方F(0,0)對應頻率為0,被稱為DC係數,其他63個係數稱為AC係數。
至於為什麼子塊大小選擇8×8,由於當時制定JPEG標準時,8×8是整合電路所能支援的最大尺寸,同時8×8的大小效果很好!
下述定義的b[x,y]為DCT的基函數,下面畫出了6個基函數在8×8的子塊上的幅值b[x,y]。其中,x,y為空白間域的座標,u,v對應頻率域的座標。
1.2 量化
注意:映像資訊損失是在量化階段而不是DCT階段。經過上述FDCT,產生了64個頻率係數,通過抑制高頻成分,來達到壓縮的目的。一個主要原因是由於人眼對高頻成分不敏感,故可以移除部分高頻成分,而對映像感官品質影響很小;另一個原因是大多數映像中的灰階值是個漸層的過程,而頻率高的部分攜帶的資訊很少。通過使用量化矩陣Q(u,v)對F(u,v)進行量化,大部分高頻係數會被量化成0。JPEG標準沒有指定量化矩陣的數值,可以根據需要自己定義,下面是JPEG標準提供的兩種量化矩陣作為參考,一種為低壓縮,另一個為高壓縮。
1.3 熵編碼
☆ Zig-Zag掃描
通過上述量化矩陣,大部分高頻係數被量化為0,為了方便進行熵編碼,把8×8的係數矩陣轉化為1×64的一維資料,而且採用的方式為Zig-Zag掃描法,採用Z字型的好處是可以把低頻係數和高頻係數集中在一起,而隨著頻率的增加,高頻係數基本上都是0,方便採用0行程編碼從而壓縮資料。
☆Huffman編碼----->Huffman詳細原理
1.DC係數-DPCM
由於DC係數是整個8×8塊的均值,所以相鄰塊的DC係數有很大的相關性,同時DC係數通常比AC係數要大得多,JPEG標準對DC係數採用相鄰DC差分(DPCM),通常Diff具有很小的數值,然後進行Huffman編碼。如所示(第一個塊的DC定義為0)。
2.AC係數-行程編碼
採用Zig-Zag掃描後,高頻成分被量化為0,而且基本集中在一起,可以對AC係數採用0行程編碼,即記錄此數值前的連續非零數值個數。下面是個對AC係數壓縮的例子。
2. An example--JPEG壓縮&解壓縮
下面是一個壓縮演算法過程,對彩色映像,採用分層處理,即對不同通道分別壓縮,解壓縮是一個逆向的過程:
---------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------
參考:
The JPEG Still Picture Compression Standard,IEEE Transactions on Consumer Electronics,1991.
Basic Image Compression Algorithm and Introduction to JPEG Standard,Pao-Yen Lin.