顧燕卿
摘要 JPEG是一種圖片影像領域廣泛使用的壓縮標準,是如今互聯(lián)網(wǎng)和多媒體技術的基礎技術。越來越多的用于網(wǎng)絡軟件、數(shù)碼相機、消費型電子設備、激光掃描儀、醫(yī)院影像設備等多媒體系統(tǒng)中。目前JPEG在嵌入式設備中的編解碼多由專門的ASIC硬件實現(xiàn),但此種硬件電路成本高、可拓展性差。本文提出了一種輕量級的、可移植、優(yōu)化的JPEG軟件解碼庫,不依賴任何操作系統(tǒng)和芯片類型,具有較高的靈活度和更廣的適用性。
【關鍵詞】JPEG解碼 圖像編碼 DCT 變換Huffman
1 壓縮標準JPEG概述
JPEG即Joint Photographic Experts Group聯(lián)合圖像專家組,是由國際標準化組織制定的第一套靜態(tài)圖像壓縮的國際標準,適用于照片、傳真、印刷等各方面。JPEG壓縮是一種有損的壓縮,充分利用了人眼的視覺生理特性,去除了人眼不易覺察的圖像高頻數(shù)據(jù),在保證了圖像顯示效果的同時大大壓縮了圖像的體積。
JPEG壓縮編碼不受長寬比和大小限制,適用于二值、灰度、彩色等各種圖像,具有連續(xù)色調(diào)、多級灰度、靜態(tài)圖像等特點。與其他的圖像壓縮格式相比,如bmp、 gif、 png、tiff等,JPEG在豐富地展現(xiàn)圖像內(nèi)容的同時還能具有極高的壓縮比率。JPEG的優(yōu)良品質(zhì)使得它在互聯(lián)網(wǎng)、多媒體、人機交互等許多領域獲得廣泛的應用。
JPEG標準定義了三種編碼操作模式:基于DCT的基本順序模式、基于DCT的漸進拓展模式、無失真模式。在實際應用中,JPEG圖像使用的是基于DCT的順序模式,軟硬件解碼器都支持此種模式。本文討論和實現(xiàn)的是這種模式。
2 圖片存儲格式解析
JPEG只是一種壓縮標準,并沒有說明圖像文件的存儲格式。JFIF即JPEG FileInterchange Format,是事實上的JPEG文件格式標準,即以*jpg、*.jpeg、*.jfif后綴命名的文件。JFIF標準定義了一種格式,就如一種通用語言,用于JPEG圖片在計算機系統(tǒng)中的存儲和交換。想要對JPEG圖片解碼首要的就是解析JFIF格式存儲的文件。JFIF交換格式將JPEG解碼的必要信息按段的形式組織和存儲,每個段都由一個特殊的標記值打頭。表1是常用的JFIF段標記。
JFIF格式的各個段中,除了SOI、EOI,并沒有嚴格的順序要求,可以由用戶自行組織。除了JPEG標準定義的一些內(nèi)容,如分辨率、量化表、Huffman表,JFIF還允許用戶自定義私有數(shù)據(jù)段,這就帶來了更多的靈活性。不過需要注意的是二進制值0xFF作為保留字,代表一個標記段的開始,如果用戶數(shù)據(jù)中恰巧包含0xFF,則需要在后面加上0x00,表明這是用戶數(shù)據(jù)以同段標記區(qū)分開。
以下是從JFIF文件提取關鍵信息的一個實例,字節(jié)流樣本來自IPHONE6S手機拍攝的一張JPEG原圖。JFIF文件中的原始數(shù)據(jù)為ffc0 0011 0805 0002 d003 0122 0002 1101 0311 01ffc400 lf00 0001 0501 0101 0101 0100 0000 0000 0000 0001 0203 0405 0607 0809 0a0bfaffdb00 4300 0202 0202 0202 0302 0203 0503 03030506 0505 0505 0608 0606 0606 0608 0a08 08080808 080a 0a0a 0a0a 0a0a 0a0e 0c0e 0c0e 0c0e0e0e 0e0e 0f0f 0f0f 0f0f 0f0f 0f0f。分析這段數(shù)據(jù),發(fā)現(xiàn)有一個FFCO標記、FFDB標記和一個FFC4標記,說明包含了SOFO、DQT、DHT三個段,即一個圖像信息段、一張量化表和一張Huffman表,解析后如表2、表3、表4所示。
解析完JFIF文件中的SOFO、DQT、DHT標記后,再找到圖像數(shù)據(jù)段SOS,就獲得了解碼JPEG所需的全部信息和數(shù)據(jù)。從JFIF交換格式提取信息是實現(xiàn)JPEG編解碼的前提。同時,理解JFIF的格式對數(shù)據(jù)恢復、圖像重建、
3 解碼原理與實現(xiàn)細節(jié)
JPEG解碼流程如圖1所示。其中熵解碼模塊是最繁瑣的部分,IDCT變換則計算量最大,而數(shù)據(jù)損失最多的一步是反量化過程。各模塊涉及到的主要原理將詳細分析。
3.1 熵解碼
熵解碼是無損變換,目的是解出每個分量的DCT量化系數(shù),以供IDCT變換使用。主要包括如下幾個方面:
3.1.1 范式Huffman編碼
Huffman編碼是一種前綴不定長的編碼。其思想在于:統(tǒng)計詞頻,出現(xiàn)頻率高的符號用較短的編碼來表示,達到整體的比特數(shù)壓縮。哈夫曼編碼的效果十分顯著,在各種情況下都能獲得極高的壓縮比率。但是其缺點在于,每種符號和對應的哈夫曼編碼必須寫入一張表,而這張編碼表的大小是不定的,帶來的額外開銷也是不定的。范式Huffman編碼是哈夫曼編碼的一個重要變種,采用了一種巧妙的方法調(diào)整了哈夫曼樹以克服上述缺點。首先,范式Huffman樹每一層的葉子節(jié)點都集中在最左邊;再者,對每個節(jié)點的編碼采取左O右1的策略。這就帶來一個好處,無論每一層有多少葉子節(jié)點表示的符號,并不需要記錄每一個符號對應的編碼,僅需要記錄下首節(jié)點的編碼。而首節(jié)點的編碼可以通過每一層的符號數(shù)計算得到,這樣就大大減少了碼表的體積。在JPEG標準中,實際使用的范式Huffman樹層次不超過16層,所以僅用16字節(jié)的空間記錄葉子節(jié)點數(shù),再在尾部按順序填入不超過256字節(jié)的符號集。表4的Huffman編碼表中,編碼位長代表層數(shù),符號數(shù)量代表每一層葉子節(jié)點數(shù),可以容易地還原出圖6的范式Huffman樹。
3.1.2 行程編碼與變長編碼
行程編碼又稱游程編碼,使用一種中間格式記錄一串重復的數(shù)字。比如111111可以記錄成(6,1),代表6個1。而JPEG中使用的行程編碼略有區(qū)別,考慮到待編碼數(shù)據(jù)的特性,其只記錄數(shù)字0的行程。舉個例子說明一下,比如待編碼數(shù)據(jù)為:7,0,0,0,0,31,0,-20,-12,0,0,1,0…0。則可以寫成(0,7)(4,31)(1,.20)(O,.12)(2,1)EOB。即用每組數(shù)字的第一個數(shù)來表示前面0的長度,EOB代表后面全是0。
變長編碼是相對于固定的編碼而言的。在計算機里,數(shù)字的表示多采用固定編碼,比如數(shù)字7將被存儲為00000111,占用8個比特。在變長編碼中,7將被存儲為( 0011,111),括號內(nèi)第一個數(shù)是固定的4比特長,用來表示后面的數(shù)字位數(shù)。那么數(shù)字7采用變長編碼后就能節(jié)省一個比特。另外還需要注意一點的是變長編碼對于負數(shù)是用反碼來表示的,比如.7將被存儲為(0011,000)。
行程編碼的中間格式將采用變長編碼來表示。比如(4,31)將被表示成(4,0100,1111),前兩個數(shù)可以合在一起使用8比特表示,最后即( 01000100,1111);比如(1,-20)將被表示成(00010101,01011)。需要說明一點的是,范式Huffman編碼只對行程編碼的行程長度和變長編碼的前4比特進行編碼,第二個數(shù)將原樣存儲。如圖2所示。
3.1.3 解碼前后數(shù)據(jù)量對比
首先范式Huffman編碼的數(shù)據(jù)源是一個8比特數(shù),編碼后的結(jié)果則是頻率高的數(shù)小于8位,頻率低的數(shù)字大于8位,從而達到數(shù)據(jù)的壓縮。那么到底壓縮了多少,節(jié)約了多少空間?可以來看一下JPEG字節(jié)流解碼前后的數(shù)據(jù)量比較,數(shù)據(jù)源是來自網(wǎng)絡爬蟲隨機抓取的1000張JPEG圖片,結(jié)果如表5。可以看出范式Huffman編碼的壓縮率在42%左右,節(jié)省了58%的存儲空間,展示了十分優(yōu)異的性能。
3.2 反量化
上一步的熵解碼每解出64個數(shù)字,就得到一個8x8圖像塊的64個系數(shù)。這些系數(shù)是被量化過的系數(shù),需要依靠量化表還原。反量化之前還需要反zigzag掃描,將64個連續(xù)的數(shù)字排成8x8的形式,與量化表一一對應以便后面計算。Zigzag掃描順序如表6。
將64個數(shù)字從0-63編號,然后按序號填入圖8的矩陣中排成與量化表相同的8x8的形式。然后每一個數(shù)乘以量化表中相同位置的參數(shù),計算后得到真正的DCT系數(shù),就完成了反量化。
反量化的計算并不復雜,只是整數(shù)之間的乘法,但是反量化卻是解碼過程中數(shù)據(jù)量損失最大的部分。舉個例子說明,假如一個DCT系數(shù)原始值為120,量化步長為50,量化系數(shù)值則為2。那么反量化的時候,利用量化系數(shù)乘以量化步長,計算所得DCT系數(shù)卻為100??梢姺戳炕怯袚p的計算,并且丟失的余數(shù)不可恢復。
3.3 IDCT計算
IDCT即反向離散余弦變換,將頻率域的64個DCT系數(shù)變換成色彩域的64個像素值。8x8矩陣的二維IDCT公式為:個最小單元,才能進行顏色空間轉(zhuǎn)換。根據(jù)各分量采樣率的不同,一個最小單元可以由1:1:1或4:1:1的YUV比例組成。JPEG中最常見的是使用4:1:1的采樣比,即對4個8x8的RGB像素塊編碼時,Y分量每塊采樣一次,即全采樣,U分量和V分量是每4個塊采樣一次,由4塊共享。那么JPEG原始碼流蘊含的編碼順序就是:[YO、Yl、Y2、Y3、U、V],每解出6個分量的8x8塊,就需要合并成一個最小單元,轉(zhuǎn)換到RGB空間,共還原32x32個像素。不斷重復以上過程,最后就能完成對整幅JPEG圖片的解碼。
參考文獻
[1]章毓晉,圖像工程[M].北京:清華大學出版社,2013 (01).
[2]蒙智明.基于S3C44BOX的JPEG圖像解碼及LCD顯示的實現(xiàn)[D].江南大學,2 007.