JPEG編碼解碼流程_第1頁
JPEG編碼解碼流程_第2頁
JPEG編碼解碼流程_第3頁
JPEG編碼解碼流程_第4頁
JPEG編碼解碼流程_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、精選優(yōu)質文檔-傾情為你奉上JPEG圖片壓縮算法流程詳解薛曉利 JPEG是Joint Photographic Exports Group的英文縮寫,中文稱之為聯(lián)合圖像專家小組。該小組隸屬于ISO國際標準化組織,主要負責定制靜態(tài)數字圖像的編碼方法,即所謂的JPEG算法。JPEG專家組開發(fā)了兩種基本的壓縮算法、兩種熵編碼方法、四種編碼模式。如下所示:壓縮算法:(1) 有損的離散余弦變換DCT(Discrete Cosine Transform)(2) 無損的預測壓縮技術;熵編碼方法:(1) Huffman編碼;(2) 算術編碼;編碼模式:(1) 基于DCT的順序模式:編碼、解碼通過一次掃描完成;(

2、2) 基于DCT的漸進模式:編碼、解碼需要多次掃描完成,掃描效果由粗到精,逐級遞增;(3) 無損模式:基于DPCM,保證解碼后完全精確恢復到原圖像采樣值;(4) 層次模式:圖像在多個空間分辨率中進行編碼,可以根據需要只對低分辨率數據做解碼,放棄高分辨率信息; 在實際應用中,JPEG圖像編碼算法使用的大多是離散余弦變換、Huffman編碼、順序編碼模式。這樣的方式,被人們稱為JPEG的基本系統(tǒng)。這里介紹的JPEG編碼算法的流程,也是針對基本系統(tǒng)而言。 基本系統(tǒng)的JPEG壓縮編碼算法一共分為11個步驟:顏色模式轉換、采樣、分塊、離散余弦變換(DCT)、Zigzag 掃描排序、量化、DC系數的差分脈

3、沖調制編碼、DC系數的中間格式計算、AC系數的游程長度編碼、AC系數的中間格式計算、熵編碼。下面,將一一介紹這11個步驟的詳細原理和計算過程。(1) 顏色模式轉換 JPEG采用的是YCrCb顏色空間,而BMP采用的是RGB顏色空間,要想對BMP圖片進行壓縮,首先需要進行顏色空間的轉換。YCrCb顏色空間中,Y代表亮度,Cr,Cb則代表色度和飽和度(也有人將Cb,Cr兩者統(tǒng)稱為色度),三者通常以Y,U,V來表示,即用U代表Cb,用V代表Cr。RGB和YCrCb之間的轉換關系如下所示:Y = 0.299R+0.587G+0.114BCb = -0.1687R-0.3313G+0.5B+128Cr

4、= 0.5R=0.418G-0.0813B+128一般來說,C 值 (包括 Cb Cr) 應該是一個有符號的數字, 但這里通過加上128,使其變?yōu)?位的無符號整數,從而方便數據的存儲和計算。R = Y+1.402(Cr-128)G = Y-0.34414(Cb-128)-0.71414(Cr-128)B = Y+1.772(Cb-128)(2) 采樣研究發(fā)現(xiàn),人眼對亮度變換的敏感度要比對色彩變換的敏感度高出很多。因此,我們可以認為Y分量要比Cb,Cr分量重要的多。在BMP圖片中,RGB三個分量各采用一個字節(jié)進行采樣,也就是我們常聽到的RGB888的模式;而JPEG圖片中,通常采用兩種采樣方式:

5、YUV411和YUV422,它們所代表的意義是Y,Cb,Cr三個分量的數據取樣比例一般是4:1:1或者4:2:2(4:1:1含義就是:在2x2的單元中,本應分別有4個Y,4個U,4個V值,用12個字節(jié)進行存儲。經過4:1:1采樣處理后,每個單元中的值分別有4個Y、1個U、1個V,只要用6個字節(jié)就可以存儲了)。這樣的采樣方式,雖然損失了一定的精度但也在人眼不太察覺到的范圍內減小了數據的存儲量。當然,JPEG格式里面也允許將每個點的U,V值都記錄下來;(3) 分塊由于后面的DCT變換是是對8x8的子塊進行處理的,因此,在進行DCT變換之前必須把源圖象數據進行分塊。源圖象中每點的3個分量是交替出現(xiàn)的

6、,先要把這3個分量分開,存放到3張表中去。然后由左及右,由上到下依次讀取8x8的子塊,存放在長度為64的表中,即可以進行DCT變換。注意,編碼時,程序從源數據中讀取一個8x8的數據塊后,進行DCT變換,量化,編碼,然后再讀取、處理下一個8*8的數據塊。 JPEG 編碼是以每8x8個點為一個單位進行處理的. 所以如果原始圖片的長寬不是 8 的倍數, 都需要先補成8的倍數, 使其可以進行一塊塊的處理。將原始圖像數據分為8*8的數據單元矩陣之后,還必須將每個數值減去128,然后一一帶入DCT變換公式,即可達到DCT變換的目的。圖像的數據值必須減去128,是因為DCT公式所接受的數字范圍是-128到1

7、27之間。(4) 離散余弦變換DCT(Discrete Cosine Transform,離散余弦變換),是碼率壓縮中常用的一種變換編碼方法。任何連續(xù)的實對稱函數的傅里葉變換中只含有余弦項,因此,余弦變換同傅里葉變換一樣具有明確的物理意義。DCT是先將整體圖像分成N*N的像素塊,然后針對N*N的像素塊逐一進行DCT操作。需要提醒的是,JPEG的編碼過程需要進行正向離散余弦變換,而解碼過程則需要反向離散余弦變換。正向離散余弦變換計算公式:反向離散余弦變換計算公式:這里的N是水平、垂直方向的像素數目,一般取值為8。8*8的二維像素塊經過DCT操作之后,就得到了8*8的變換系數矩陣。這些系數,都有具

8、體的物理含義,例如,U=0,V=0時的F(0,0)是原來的64個數據的均值,相當于直流分量,也有人稱之為DC系數或者直流系數。隨著U,V的增加,相另外的63個系數則代表了水平空間頻率和垂直空間頻率分量(高頻分量)的大小,多半是一些接近于0的正負浮點數,我們稱之為交流系數AC。DCT變換后的8*8的系數矩陣中,低頻分量集中在矩陣的左上角。高頻成分則集中在右下角。這里,我們暫時先只考慮水平方向上一行數據(8個像素)的情況時的DCT變換,從而來說明其物理意義。如下圖所示:原始的圖像信號(最左邊的波形)經過DCT變換之后變成了8個波,其中第一個波為直流成分,其余7個為交流成分。可見圖像信號被分解為直流

9、成分和一些從低頻到高頻的各種余弦成分。而DCT系數只表示了該種成分所占原圖像信號的份額大小。顯然,恢復圖像信息可以表示為下面的式子:F(n) = C(n)*E(n),這里,E(n)是一個基底,C(n)是DCT系數,F(xiàn)(n)則是圖像信號;如果考慮垂直方向的變化,那就需要一個二維的基底。大學里面的信號處理,傅里葉變換等課程上也講過,任何信號都可以被分解為基波和不同幅度的諧波的組合,而DCT變換的物理意義也正是如此。由于大多數圖像的高頻分量比較小,相應的圖像高頻分量的DCT系數經常接近于0,再加上高頻分量中只包含了圖像的細微的細節(jié)變化信息,而人眼對這種高頻成分的失真不太敏感,所以,可以考慮將這一些高

10、頻成分予以拋棄,從而降低需要傳輸的數據量。這樣一來,傳送DCT變換系數的所需要的編碼長度要遠遠小于傳送圖像像素的編碼長度。到達接收端之后通過反離散余弦變換就可以得到原來的數據,雖然這么做存在一定的失真,但人眼是可接受的,而且對這種微小的變換是不敏感的。(5) Zigzag掃描排序 DCT 將一個 8x8 的數組變換成另一個 8x8 的數組. 但是內存里所有數據都是線形存放的, 如果我們一行行的存放這 64 個數字, 每行的結尾的點和下行開始的點就沒有什么關系, 所以 JPEG 規(guī)定按如下圖中的數字順序依次保存和讀取64 個DCT的系數值。 這樣數列里的相鄰點在圖片上也是相鄰的了。不難發(fā)現(xiàn),這種

11、數據的掃描、保存、讀取方式,是從8*8矩陣的左上角開始,按照英文字母Z的形狀進行掃描的,一般將其稱之為Zigzag掃描排序。如下圖所示: (6) 量化 圖像數據轉換為DCT頻率系數之后,還要進行量化階段,才能進入編碼過程。量化階段需要兩個8*8量化矩陣數據,一個是專門處理亮度的頻率系數,另一個則是針對色度的頻率系數,將頻率系數除以量化矩陣的值之后取整,即完成了量化過程。當頻率系數經過量化之后,將頻率系數由浮點數轉變?yōu)檎麛?,這才便于執(zhí)行最后的編碼。不難發(fā)現(xiàn),經過量化階段之后,所有的數據只保留了整數近似值,也就再度損失了一些數據內容。在JPEG算法中,由于對亮度和色度的精度要求不同,分別對亮度和色

12、度采用不同的量化表。前者細量化,后者粗量化。 下圖給出JPEG的亮度量化表和色度量化表,該量化表是從廣泛的實驗中得出的。當然,你也可以自定義量化表。 這兩張表依據心理視覺閥制作, 對 8bit 的亮度和色度的圖象的處理效果不錯。量化表是控制 JPEG 壓縮比的關鍵,這個步驟除掉了一些高頻量, 損失了很多細節(jié)信息。但事實上人眼對高頻信號的敏感度遠沒有低頻信號那么敏感。所以處理后的視覺損失很小,從上面的量化表也可以看出,低頻部分采用了相對較短的量化步長,而高頻部分則采用了相對較長的量化步長,這樣做,也是為了在一定程度上得到相對清晰的圖像和更高的壓縮率。另一個重要原因是所有的圖片的點與點之間會有一個

13、色彩過渡的過程,而大量的圖象信息被包含在低頻率空間中,經過DCT處理后, 在高頻率部分, 將出現(xiàn)大量連續(xù)的零。(7) DC系數的差分脈沖調制編碼8*8的圖像塊經過DCT變換之后得到的DC系數有兩個特點:(1) 系數的數值比較大;(2) 相鄰的8*8圖像塊的DC系數值變化不大;根據這兩個特點,DC系數一般采用差分脈沖調制編碼DPCM(Difference Pulse Code Modulation),即:取同一個圖像分量中每個DC值與前一個DC值的差值來進行編碼。對差值進行編碼所需要的位數會比對原值進行編碼所需要的位數少了很多。假設某一個8*8圖像塊的DC系數值為15,而上一個8*8圖像塊的DC

14、系數為12,則兩者之間的差值為3。(8) DC系數的中間格式計算 JPEG中為了更進一步節(jié)約空間,并不直接保存數據的具體數值,而是將數據按照位數分為16組,保存在表里面。這也就是所謂的變長整數編碼VLI。即,第0組中保存的編碼位數為0,其編碼所代表的數字為0;第1組中保存的編碼位數為1,編碼所代表的數字為-1或者1.,如下面的表格所示,這里,暫且稱其為VLI編碼表:前面提到的那個DC差值為3的數據,通過查找VLI可以發(fā)現(xiàn),整數3位于VLI表格的第2組,因此,可以寫成(2)(3)的形式,該形式,稱之為DC系數的中間格式。(9) AC系數的行程長度編碼(RLC)量化之后的AC系數的特點是,63個系

15、數中含有很多值為0的系數。因此,可以采用行程編碼RLC(Run Length Coding)來更進一步降低數據的傳輸量。利用該編碼方式,可以將一個字符串中重復出現(xiàn)的連續(xù)字符用兩個字節(jié)來代替,其中,第一個字節(jié)代表重復的次數,第二個字節(jié)代表被重復的字符串。例如,(4,6)就代表字符串“6666”。但是,在JPEG編碼中,RLC的含義就同其原有的意義略有不同。在JPEG編碼中,假設RLC編碼之后得到了一個(M,N)的數據對,其中M是兩個非零AC系數之間連續(xù)的0的個數(即,行程長度),N是下一個非零的AC系數的值。采用這樣的方式進行表示,是因為AC系數當中有大量的0,而采用Zigzag掃描也會使得AC

16、系數中有很多連續(xù)的0的存在,如此一來,便非常適合于用RLC進行編碼。例如,現(xiàn)有一個字符串,如下所示:57,45,0,0,0,0,23,0,-30,-8,0,0,1,000.經過RLC之后,將呈現(xiàn)出以下的形式:(0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ; (0,0)注意,如果AC系數之間連續(xù)0的個數超過16,則用一個擴展字節(jié)(15,0)來表示16連續(xù)的0。(10) AC系數的中間格式根據前面提到的VLI表格,對于前面的字符串: (0,57) ; (0,45) ; (4,23) ; (1,-30) ; (0,-8) ; (2,1) ;

17、(0,0)只處理每對數右邊的那個數據,對其進行VLI編碼: 查找上面的VLI編碼表格,可以發(fā)現(xiàn),57在第6組當中,因此,可以將其寫成(0,6),57的形式,該形式,稱之為AC系數的中間格式。同樣的(0,45)的中間格式為:(0,6),45; (1,-30)的中間格式為:(1,5),-30;(11) 熵編碼 在得到DC系數的中間格式和AC系數的中間格式之后,為進一步壓縮圖象數據,有必要對兩者進行熵編碼。JPEG標準具體規(guī)定了兩種熵編碼方式:Huffman編碼和算術編碼。JPEG基本系統(tǒng)規(guī)定采用Huffman編碼(因為不存在專利問題),但JPEG標準并沒有限制JPEG算法必須用Huffman編碼方

18、式或者算術編碼方式。 Huffman編碼:對出現(xiàn)概率大的字符分配字符長度較短的二進制編碼,對出現(xiàn)概率小的字符分配字符長度較長的二進制編碼,從而使得字符的平均編碼長度最短。Huffman編碼的原理請參考數據結構中的Huffman樹或者最優(yōu)二叉樹。Huffman編碼時DC系數與AC系數分別采用不同的Huffman編碼表,對于亮度和色度也采用不同的Huffman編碼表。因此,需要4張Huffman編碼表才能完成熵編碼的工作。具體的Huffman編碼采用查表的方式來高效地完成。然而,在JPEG標準中沒有定義缺省的Huffman表,用戶可以根據實際應用自由選擇,也可以使用JPEG標準推薦的Huffman

19、表?;蛘哳A先定義一個通用的Huffman表,也可以針對一副特定的圖像,在壓縮編碼前通過搜集其統(tǒng)計特征來計算Huffman表的值。下面我們舉例來說明8*8圖像子塊經過DCT及量化之后的處理過程:假設一個圖像塊經過量化以后得到以下的系數矩陣:15 0 -1 0 0 0 0 0-2 -1 0 0 0 0 0 0-1 -1 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0顯然,DC系數為15,假設前一個8*8的圖像塊的DC系數量化值為12,則當前DC系統(tǒng)同上一個DC系數之間的差值

20、為3,通過查找VLI編碼表,可以得到DC系數的中間格式為(2)(3),這里的2代表后面的數字(3)的編碼長度為2位;之后,通過Zigzag掃描之后,遇到第一個非0的AC系數為-2,遇到0的個數為1,AC系數經過RLC編碼后可表示為(1,-2),通過查找VLI表發(fā)現(xiàn),-2在第2組,因此,該AC系數的中間格式為(1,2)-2; 其余的點類似,可以求得這個8*8子塊熵編碼的中間格式為(DC)(2)(3);AC(1,2)(-2),(0,1)(-1),(0,1)(-1),(0,1)(-1),(2,1)(-1),(EOB)(0,0) 對于DC系數的中間格式(2)(3)而言,數字2查DC亮度Huffman表

21、得到011,數字3通過查找VLI編碼表得到其被編碼為11; 對于AC系數的中間格式(1,2)(-2)而言,(1,2)查AC亮度Huffman表得到11011,-2通過查找VLI編碼表得到其被編碼為01;對于AC系數的中間格式(0,1)(-1)而言,(0,1)查AC亮度Huffman表得到00,數字-1通過查找VLI編碼表得到其被編碼為0;對于AC系數的中間格式(2,1)(1)而言,(2,1)查AC亮度Huffman表得到11100,數字-1通過查找VLI編碼表得到其被編碼為0;對于AC系數的中間格式(0,0)而言,查AC亮度Huffman表得到1010; 因此,最后這個8*8子塊亮度信息壓縮后

22、的數據流為01111,000,000,000,1010。總共31比特,其壓縮比是64*8/31=16.5,大約每個像素用半個比特。JPEG 推薦的DC和AC系數的huffman(哈夫曼)碼表 Table K.3 Table for luminance DC coefficient differencesCategory Code length Code word0 2 0001 3 0102 3 011 3 3 1004 3 101 5 3 1106 4 11107 5 111108 6 9 7 10 8 11 9 Table K.4 Table for chrominance DC coef

23、ficient differencesCategory Code length Code word0 12 0001 12 012 12 103 13 1104 14 11105 15 111106 16 7 17 8 18 9 19 10 10 11 11 Table K.5 Table for luminance AC coefficients (sheet 1 of 4) Run/Size Code length Code word 0/0 (EOB) 14 1010 0/1 12 00 0/2 12 01 0/3 13 100 0/4 14 1011 0/5 15 11010 0/6

24、17 0/7 18 0/8 10 0/9 16 00010 0/A 16 00011 1/1 14 1100 1/2 15 11011 1/3 17 1/4 19 1/5 11 1/6 16 00100 1/7 16 00101 1/8 16 00110 1/9 16 00111 1/A 16 01000 2/1 15 11100 2/2 18 2/3 10 2/4 12 0 2/5 16 01001 2/6 16 01010 2/7 16 01011 2/8 16 01100 2/9 16 01101 2/A 16 01110 3/1 16 3/2 19 3/3 12 1 3/4 16 01

25、111 3/5 16 10000 3/6 16 10001 3/7 16 10010 3/8 16 10011 3/9 16 10100 3/A 16 10101Table K.5 (sheet 2 of 4) Run/Size Code length Code word 4/1 16 4/2 10 4/3 16 10110 4/4 16 10111 4/5 16 11000 4/6 16 11001 4/7 16 11010 4/8 16 11011 4/9 16 11100 4/A 16 11101 5/1 17 5/2 11 5/3 16 11110 5/4 16 11111 5/5 1

26、6 00000 5/6 16 00001 5/7 16 00010 5/8 16 00011 5/9 16 00100 5/A 16 00101 6/1 17 6/2 12 0 6/3 16 00110 6/4 16 00111 6/5 16 01000 6/6 16 01001 6/7 16 01010 6/8 16 01011 6/9 16 01100 6/A 16 01101 7/1 18 7/2 12 1 7/3 16 01110 7/4 16 01111 7/5 16 10000 7/6 16 10001 7/7 16 10010 7/8 16 10011 7/9 16 10100

27、7/A 16 10101 8/1 19 8/2 15 0000Run/Size Code length Code word 8/3 16 10110 8/4 16 10111 8/5 16 11000 8/6 16 11001 8/7 16 11010 8/8 16 11011 8/9 16 11100 8/A 16 11101 9/1 19 9/2 16 11110 9/3 16 11111 9/4 16 00000 9/5 16 00001 9/6 16 00010 9/7 16 00011 9/8 16 00100 9/9 16 00101 9/A 16 00110 A/1 19 A/2

28、 16 00111 A/3 16 01000 A/4 16 01001 A/5 16 01010 A/6 16 01011 A/7 16 01100 A/8 16 01101 A/9 16 01110 A/A 16 01111 B/1 10 B/2 16 10000 B/3 16 10001 B/4 16 10010 B/5 16 10011 B/6 16 10100 B/7 16 10101 B/8 16 10110 B/9 16 10111 B/A 16 11000 C/1 10 C/2 16 11001 C/3 16 11010 C/4 16 11011Table K.5 (sheet

29、4 of 4) Run/Size Code length Code wordC/5 16 11100 C/6 16 11101 C/7 16 11110 C/8 16 11111 C/9 16 00000 C/A 16 00001 D/1 11 D/2 16 00010 D/3 16 00011 D/4 16 00100 D/5 16 00101 D/6 16 00110 D/7 16 00111 D/8 16 01000 D/9 16 01001 D/A 16 01010 E/1 16 01011 E/2 16 01100 E/3 16 01101 E/4 16 01110 E/5 16 0

30、1111 E/6 16 10000 E/7 16 10001 E/8 16 10010 E/9 16 10011 E/A 16 10100 F/0 (ZRL) 11 F/1 16 10101 F/2 16 10110 F/3 16 10111 F/4 16 11000 F/5 16 11001 F/6 16 11010 F/7 16 11011 F/8 16 11100 F/9 16 11101 F/A 16 11110JPEG文件格式介紹:JPEG文件的存儲格式有很多種,但最常用的是JFIF格式,即JPEG File Interchange Format。JPEG文件大體可以分為兩個部分:(

31、1) 標記碼;由兩個字節(jié)構成,其中,前一個字節(jié)是固定值0XFF代表了一個標記碼的開始,后一個字節(jié)不同的值代表著不同的含義。需要提醒的是,連續(xù)的多個0XFF可以理解為一個0XFF,并表示一個標記碼的開始。另外,標記碼在文件中一般是以標記代碼的形式出現(xiàn)的。例如,SOI的標記代碼是0XFFD8,即,如果JPEG文件中出現(xiàn)了0XFFD8,則代表此處是一個SOI標記。(2) 壓縮數據;一個完整的兩字節(jié)標記碼的后面,就是該標記碼對應的壓縮數據了,它記錄了關于文件的若干信息。一些典型的標記碼,及其所代表的含義如下所示:SOI,Start Of Image, 圖像開始,標記代碼為固定值0XFFD8,用2字節(jié)表

32、示;APP0,Application 0, 應用程序保留標記0,標記代碼為固定值0XFFE0,用2字節(jié)表示;該標記碼之后包含了9個具體的字段:(1) 數據長度:2個字節(jié),用來表示(1)-(9)的9個字段的總長度,即不包含標記代碼但包含本字段;(2) 標示符:5個字節(jié),固定值0X4A,表示了字符串“JFIF0”;(3) 版本號:2個字節(jié),一般為0X0102,表示JFIF的版本號為1.2;但也可能為其它數值,從而代表了其它版本號;(4) X,Y方向的密度單位:1個字節(jié),只有三個值可選,0:無單位;1:點數每英寸;2:點數每厘米;(5) X方向像素密度:2個字節(jié),取值范圍未知;(6) Y方向像素密度

33、:2個字節(jié),取值范圍未知;(7) 縮略圖水平像素數目:1個字節(jié),取值范圍未知;(8) 縮略圖垂直像素數目:1個字節(jié),取值范圍未知;(9) 縮略圖RGB位圖:長度可能是3的倍數,保存了一個24位的RGB位圖;如果沒有縮略位圖(這種情況更常見),則字段(7)(8)的取值均為0;APPn, Application n, 應用程序保留標記n(n=1-15),標記代碼為2個字節(jié),取值為0XFFE1-0XFFFF;包含了兩個字段:(1) 數據長度,2個字節(jié),表示(1)(2)兩個字段的總長度;即,不包含標記代碼,但包含本字段;(2) 詳細信息:數據長度-2個字節(jié),內容不定;DQT,Define Quanti

34、zation Table, 定義量化表;標記代碼為固定值0XFFDB;包含9個具體字段:(1) 數據長度:2個字節(jié),表示(1)和多個(2)字段的總長度;即,不包含標記代碼,但包含本字段;(2) 量化表:數據長度-2個字節(jié),其中包括以下內容:(a)精度及量化表ID,1個字節(jié),高4位表示精度,只有兩個可選值,0:8位;1:16位;低4位表示量化表ID,取值范圍為0-3;(b)表項,64*(精度取值+1)個字節(jié),例如,8位精度的量化表,其表項長度為64*(0+1)=64字節(jié);本標記段中,(2)可以重復出現(xiàn),表示多個量化表,但最多只能出現(xiàn)4次;SOFO,Start Of Frame, 幀圖像開始,標記

35、代碼為固定值0XFFC0;包含9個具體字段:(1) 數據長度:2個字節(jié),(1)-(6)共6個字段的總長度;即,不包含標記代碼,但包含本字段;(2) 精度:1個字節(jié),代表每個數據樣本的位數;通常是8位;(3) 圖像高度:2個字節(jié),表示以像素為單位的圖像高度,如果不支持DNL就必須大于0;(4) 圖像寬度:2個字節(jié),表示以像素為單位的圖像寬度,如果不支持DNL就必須大于0;(5) 顏色分量個數:1個字節(jié),由于JPEG采用YCrCb顏色空間,這里恒定為3;(6) 顏色分量信息:顏色分量個數*3個字節(jié),這里通常為9個字節(jié);并依此表示如下一些信息:(a)顏色分量ID: 1個字節(jié);(b)水平/垂直采樣因子

36、:1個字節(jié),高4位代表水平采樣因子,低4位代表垂直采樣因子;(c)量化表:1個字節(jié),當前分量使用的量化表ID;本標記段中,字段(6)應該重復出現(xiàn)3次,因為這里有3個顏色分量;DHT,Define Huffman Table定義Huffman表,標記碼為0XFFC4;包含2個字段:(1) 數據長度,2個字節(jié),表示(1)-(2)的總長度,即,不包含標記代碼,但包含本字段;(2) Huffman表,數據長度-2個字節(jié),包含以下字段:(a) 表ID和表類型,1個字節(jié),高4位表示表的類型,取值只有兩個;0:DC直流;1:AC交流;低4位,Huffman表ID;需要提醒的是,DC表和AC表分開進行編碼;(

37、b) 不同位數的碼字數量,16個字節(jié);(c) 編碼內容,16個不同位數的碼字數量之和(字節(jié));本標記段中,字段(2)可以重復出現(xiàn),一般需要重復4次。DRI,Define Restart Interval,定義差分編碼累計復位的間隔,標記碼為固定值0XFFDD;包含2個具體字段:(1) 數據長度:2個字節(jié),取值為固定值0X0004,表示(1)(2)兩個字段的總長度;即,不包含標記代碼,但包含本字段;(2) MCU塊的單元中重新開始間隔:2個字節(jié),如果取值為n,就代表每n個MCU塊就有一個RSTn標記;第一個標記是RST0,第二個是RST1,RST7之后再從RST0開始重復;如果沒有本標記段,或者

38、間隔值為0,就表示不存在重開始間隔和標記RST;SOS,Start Of Scan,掃描開始;標記碼為0XFFDA,包含2個具體字段:(1) 數據長度:2個字節(jié),表示(1)-(4)字段的總長度;(2) 顏色分量數目:1個字節(jié),只有3個可選值,1:灰度圖;3:YCrCb或YIQ;4:CMYK;(3) 顏色分量信息:包括以下字段,(a)顏色分量ID:1個字節(jié);(b)直流/交流系數表ID,1個字節(jié),高4位表示直流分量的Huffman表的ID;低4位表示交流分量的Huffman表的ID;(4) 壓縮圖像數據(a)譜選擇開始:1個字節(jié),固定值0X00;(b)譜選擇結束:1個字節(jié),固定值0X3F;(c)譜

39、選擇:1個字節(jié),固定值0X00;本標記段中,(3)應該重復出現(xiàn),有多少個顏色分量,就重復出現(xiàn)幾次;本段結束之后,就是真正的圖像信息了;圖像信息直到遇到EOI標記就結束了;EOI,End Of Image,圖像結束;標記代碼為0XFFD9;另外,需要說明的是,在JPEG中0XFF具有標記的意思,所以在壓縮數據流(真正的圖像信息)中,如果出現(xiàn)了0XFF,就需要做特別處理了。方法是,如果在圖像數據流中遇到0XFF,應該檢測其緊接著的字符,如果是:(1)0X00,表示0XFF是圖像流的組成部分;需要進行譯碼;(2)0XD9,表示與0XFF組成標記EOI,即,代表圖像流的結束,同時,圖像文件結束;(3)

40、0XD0-0XD7,組成RSTn標記,需要忽視整個RSTn標記,即不對當前0XFF和緊接著的0XDn兩個字節(jié)進行譯碼,并按RST標記的規(guī)則調整譯碼變量;(4)0XFF,忽略當前0XFF,對后一個0XFF進行判斷;(5) 其它數值,忽然當前0XFF,并保留緊接著此數值用于譯碼;需要說明的是,JPEG文件格式中,一個字(16位)的存儲使用的是Motorola格式,而不是Intel格式。也就是說,一個字的高字節(jié)(高8位)在數據流的前面,低字節(jié)(低8位)在數據流的后面,與平時習慣的Intel格式有所不同。這種字節(jié)順序問題的起因在于早期的硬件發(fā)展上。在8位CPU的時代,許多8位CPU都可以處理16位的數據,但它們顯然是分兩次進行處理的。這個時候就出現(xiàn)了先處理高位字節(jié)還是先處理低位字節(jié)的問題。以Intel為代表的廠家生產的CPU采用先低字節(jié)后高字節(jié)的方式;而以Motorola,IBM為代表的廠家生產的CP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論