【正文】
過(guò)兩種數(shù)據(jù)變換,以適應(yīng)于用熵編碼進(jìn)一步壓縮數(shù)據(jù)的目的,如表 所示。從 DCT 變換的公式可以看出,直流(DC)系數(shù)反映了 88 子塊內(nèi)64 個(gè)像素均值的度量,它包含了整個(gè)圖像總能量的重要部分,因此將 DC 系數(shù)和其余 63XX 大學(xué)學(xué)士學(xué)位論文20個(gè)交流(AC) 系數(shù)分別編碼。由于相鄰的 88 子塊的 DC 系數(shù)通常具有很強(qiáng)的相關(guān)性,對(duì)DC 系數(shù)使用一維前值預(yù)測(cè),即用前一個(gè)子塊的 DC 系數(shù)預(yù)測(cè)當(dāng)前子塊的 DC 系數(shù),而后將預(yù)測(cè)誤差進(jìn)行熵編碼,如圖 (a)所示。其余 63 個(gè)交流系數(shù)則用 Zig_Zag 之字形掃描轉(zhuǎn)換成一維序列,如圖 (b)所示,編碼順序?yàn)榧^所示的方向。Zig_Zag 掃描可以使低頻系數(shù)出現(xiàn)在高頻系數(shù)前面,有利于熵編碼的進(jìn)行。AC 和 DC 均為二進(jìn)制補(bǔ)碼表示的整數(shù)。 1?iBlockilck1?iDCi1??iiDCIF)(a76754732710 666 57654532510 444 37635432310 222 176154`13210 000DDDD( b ) Z i g _ Z a g 掃描順序圖 Zig_Zag 掃描AC 編碼方式與 DC 略有不同,在 AC 編碼之前,首先得將 AC 值按 Zig_Zag 排序,即按照?qǐng)D (b) Zig_Zag 掃描順序箭頭所指示的順序串聯(lián)起來(lái)。AC 值排列之后,將 AC系數(shù)轉(zhuǎn)換成中間符號(hào),中間符號(hào)表示為 RRRR/SSSS,RRRR 表示非零的 AC 之前其值為0 的 AC 個(gè)數(shù),SSSS 表示 AC 值所需的位數(shù),AC 系數(shù)的范圍與 SSSS 的對(duì)應(yīng)關(guān)系與 DC差值 Bits 數(shù)與差值內(nèi)容對(duì)照表相似。如果連續(xù)為 0 的 AC 個(gè)數(shù)大于 15,則用 15/0 來(lái)表示連續(xù)的 16 個(gè) 0,15/0 稱(chēng)為 ZRL(Zero Rum Length),而(0/0)稱(chēng)為 EOB(Engel of Block)用來(lái)表示其后所剩余的 AC 系數(shù)皆等于 0,以中間符號(hào)值作為索引值,從相應(yīng)的 AC 編碼表中找出適當(dāng)?shù)?Huffman 碼值,再與 AC 值相連即可。例如某一組亮度的中間符為 5/3,AC 值為 4,首先以 5/3 為索引值,從亮度 AC 的 Huffman 編碼表中找到1111111110011110Huffman 碼值,于是加上原來(lái) 100(4)即是用來(lái)取[5,4]的 Huffman 編碼基于 MATLAB 的 JPEG 基本系統(tǒng)編碼211111111110011110100,[5,4]表示 AC 值為 4 的前面有 5 個(gè)零。由于亮度 AC,色調(diào) AC Huffman 編碼表比較長(zhǎng),在此不作闡述。 實(shí)現(xiàn)上述四個(gè)步驟,即完成一幅圖像的 JPEG 壓縮。JPEG 壓縮是采用以 DCT 為基礎(chǔ)的有損壓縮算法,即使壓縮比為 25:1 的情況下,壓縮后還原得到的圖像與原始圖像相比較,非圖像專(zhuān)家難以找到它們之間的區(qū)別,這正是 JPEG 壓縮算法得到了廣泛應(yīng)用的原因[9]。 JPEG 圖像數(shù)據(jù)壓縮發(fā)展JPEG 是一個(gè)適用范圍很廣的靜態(tài)圖像數(shù)據(jù)壓縮標(biāo)準(zhǔn),既可用于灰度圖像又可用于彩色圖像。JPEG 壓縮算法可以用失真的壓縮方式來(lái)處理圖像,但失真的程度卻是肉眼所無(wú)法辨認(rèn)的,可以實(shí)現(xiàn)很高的壓縮比。最近發(fā)布的 JPEG2022 標(biāo)準(zhǔn)提供了一些新的壓縮算法,支持 Inter 應(yīng)用等特點(diǎn)。XX 大學(xué)學(xué)士學(xué)位論文22基于 MATLAB 的 JPEG 基本系統(tǒng)編碼23第5章 MATLAB仿真 系統(tǒng)模塊圖系統(tǒng)的模塊圖如圖 所示,原始數(shù)據(jù)經(jīng)過(guò)緩沖再進(jìn)行 DCT 編碼,編碼結(jié)果進(jìn)行 ZZ掃描,然后進(jìn)行量化,經(jīng)碼流脈沖后進(jìn)行霍夫曼編碼,最后輸出壓縮編碼。輸入緩沖D C TZ Z 掃描量化碼流脈沖量化表霍夫曼編碼輸出脈沖編碼表圖 JPEG 系統(tǒng)模塊圖它對(duì)彩色圖像采用分量編碼。RGB——YUV 變換并不包括在編碼器內(nèi)。首先將整個(gè)圖像分為小的重疊的 88 像素子塊(共有 Y,U,V 三幅數(shù)字圖像),接著對(duì)各個(gè)子塊進(jìn)行 DCT 變換,然后對(duì)所有的系數(shù)進(jìn)行線(xiàn)性量化。量化的過(guò)程是對(duì)系數(shù)值的量化間距劃分后的歸整運(yùn)算,量化步長(zhǎng)取決于一個(gè)“ 視覺(jué)閾值矩陣” 并隨系數(shù)的位置而變化,并且對(duì) Y 和 UV 分量也不同。量化步長(zhǎng)矩陣,它們是根據(jù)視覺(jué)心理實(shí)驗(yàn)得到的。每個(gè)系數(shù)的量化步長(zhǎng)設(shè)置是在通常的視覺(jué)距離下的“正好可注意到的幅值” 。利用這些閾值,在編碼率小于 1bit/像素的條件下依然獲得非常好的圖像質(zhì)量。當(dāng)把量化步長(zhǎng)乘以一個(gè)公共因數(shù)后,一般可以調(diào)整比特率,由此可以實(shí)現(xiàn)自適應(yīng)編碼。其次,對(duì) DCT 量化系數(shù)進(jìn)行熵編碼,進(jìn)一步壓縮碼率。這里可以采用 Huffman 編碼VLC(Variable Length Code,可變長(zhǎng)編碼) 。對(duì)于當(dāng)前子塊 DC 系數(shù)與上一塊的 DC 系數(shù)之差值進(jìn)行 VLC 編碼壓縮數(shù)據(jù);這是由于 DC 分量是子塊的平均值,相鄰子塊間的相關(guān)性很強(qiáng),同時(shí),視覺(jué)上要求各子塊的平均灰度無(wú)明顯的跳躍,因此對(duì) DC 的差值作無(wú)失真的熵編碼是合適的。對(duì)于 AC 系數(shù),由于量化后的系數(shù)為稀疏的,僅少數(shù) AC 系數(shù)不為零,因此采用“之 ”字形方式進(jìn)行一維掃描,然后將非零系數(shù)前面的“0” 的游程長(zhǎng)度(個(gè)數(shù))與該系數(shù)值一起作為統(tǒng)計(jì)事件進(jìn)行 VLC 編碼。在基本系統(tǒng)中共推薦了兩組 Huffman 碼表,一組用于亮度信號(hào) Y,另一組用于色度信號(hào) U,V。每一組表又包括兩張表,一個(gè)用于 DC 分量,一個(gè)用于 AC 分量。 JPEG壓縮編碼的設(shè)計(jì)流程DCT 部分程序流程圖利用 DCT 變換進(jìn)行圖像壓縮,首先要將輸入圖像分解為 88 的塊,然后對(duì)每個(gè)塊進(jìn)行二維 DCT 變換,最后將變換得到的 DCT 系數(shù)進(jìn)行編碼和傳送,解碼時(shí)對(duì)每個(gè) 88 的圖像塊進(jìn)二維 DCT 反變換,最后將反變換后的塊組合成一幅圖像。XX 大學(xué)學(xué)士學(xué)位論文24對(duì)于通常的圖像來(lái)說(shuō),大多數(shù)的 DCT 系數(shù)的值非常接近于 0。如果舍棄這些接近于 0 的DCT 系數(shù)值,在重構(gòu)圖像時(shí)并不會(huì)帶來(lái)畫(huà)面質(zhì)量的顯著下降,所以利用 DCT 進(jìn)行圖像壓縮編碼可以節(jié)約大量的存儲(chǔ)空間。壓縮應(yīng)該在最合理的近似原圖像情況下使用最少的系數(shù),使用系數(shù)的多少?zèng)Q定了壓縮比的大小。具體程序流程圖如圖 所示。 掃描順序變換基于 DCT 需要按設(shè)定的有損壓縮以 88 的數(shù)據(jù)矩陣為基本處理單元稱(chēng)為數(shù)據(jù)單元(DU),因此 JPEG 工作模式,重新排序,即掃描變換。圖像預(yù)處理所得到的數(shù)據(jù)是按逐列逐行掃描得到的。數(shù)據(jù)掃描順序有下面幾個(gè)層次:分量間,采用 YCbCr 的順序,按 Y:Cb:Cr=4:2:2 格式組成 MCU(最小編碼單元)交織掃描;MCU 間采用先逐列從左到右再逐行從上到下的自然掃描順序(如圖 所示)。一個(gè) MCU 的某組成分量的 DU 間采用自然掃描順序;DU 內(nèi)的各矩陣元素間也采用自然掃描順序。Zig_Zag 掃描的過(guò)程主要有兩塊,一塊是產(chǎn)生順序遞增的地址,一塊是由掃描地址表輸出符合 Zig_Zag 順序的地址數(shù)據(jù),最后按照 Zig_Zag 順序?qū)?shù)據(jù)進(jìn)行輸出,完成 zz 掃描部分,如圖 所示。 量化部分程序流程圖對(duì)圖像進(jìn)行量化時(shí),要選擇碼字的尺寸和碼字的大小。這些都會(huì)影響圖像壓縮的效果。任意一幅圖像同樣分割成 88 的子塊圖像,可以按照碼字的索引編號(hào)進(jìn)行編碼。即每個(gè)圖像經(jīng)過(guò)編碼之后僅用一個(gè)索引號(hào)表示,從而實(shí)現(xiàn)了數(shù)據(jù)的壓縮。解碼就是按照索引代表的碼字將圖像重建出來(lái)。重建圖像和原圖像之間會(huì)存在一定程度的失真,但只要失真限制在一定范圍內(nèi),我們認(rèn)為該圖像壓縮是有效的,如圖 所示。 霍夫曼編碼部分程序流程圖霍夫曼編碼的過(guò)程較一般編碼方法更為繁瑣,主要包括霍夫曼編碼部分和先序遍歷霍夫曼樹(shù)函數(shù)兩部分?;舴蚵幋a部分步驟主要有初始化碼字、排列列表,對(duì) n 個(gè)消息進(jìn)行排序,將最后兩個(gè)出現(xiàn)概率最小的消息合成一個(gè)消息,重復(fù)上述步驟主要完成對(duì)霍夫曼完成的代碼以二叉樹(shù)的方式生成霍夫曼壓縮編碼,如圖 所示 [10]?;?MATLAB 的 JPEG 基本系統(tǒng)編碼25開(kāi)始結(jié)束輸入一幅原始圖像分成 8 8 像素塊 , 分別做 D C T 變換根據(jù)量化表 , 對(duì)變換系數(shù)進(jìn)行量化對(duì)量化后的變換系數(shù)進(jìn)行 Z i g Z a g 掃描對(duì)經(jīng)掃描得到的 D C 系數(shù)和 A C 系數(shù)分別進(jìn)行 H u f f m a n 熵編碼得到整個(gè)圖像編碼后的比特序列 , 并計(jì)算壓縮比特率對(duì) D C 系數(shù)和 A C 系數(shù)分別進(jìn)行 H u f f m a n 熵編碼反掃描 、 反量化反 D C T 變換計(jì)算重建圖像的峰值信噪比圖 JPEG 編解碼 Matlab 程序流程圖Y 0 Y 1 Y 2 Y 3YC h 0 C h 1C bC r8 8 系數(shù)塊M C U 0 : Y 0 Y 1 C b 0 C r 0M C U 0M C U 1 M C U 2M C U 1 : Y 2 Y 3 C b 1 C r 1C r 0 C r 1圖 YCbCr 分量數(shù)據(jù)掃描順序XX 大學(xué)學(xué)士學(xué)位論文26開(kāi)始是否寫(xiě)滿(mǎn)一個(gè)數(shù)據(jù)塊 ?產(chǎn)生順序遞增地址掃描地址表輸出符合Z i g _ Z a g 順序的地址數(shù)據(jù)按掃描順序輸出數(shù)據(jù)數(shù)據(jù)寫(xiě)入數(shù)據(jù)存儲(chǔ)器計(jì)算矢量距離的子函數(shù)結(jié)束開(kāi)始N結(jié)束設(shè)置碼字的大小裝入和顯示原始圖像求出圖像像素的行數(shù)和列數(shù)進(jìn)行分塊處理設(shè)置碼數(shù)的大小圖 Zig_Zag 程序流程圖 圖 量化過(guò)程的流程圖結(jié)束裝入霍夫曼數(shù)據(jù)將最后兩個(gè)出現(xiàn)概率最小的消息合成一個(gè)消息將消息添加到隊(duì)列的最后 , 為 n 1 消息重新進(jìn)行排序做準(zhǔn)備碼字初始化為 0遍歷至原始消息 , 即葉子結(jié)點(diǎn) , 輸出該碼字使左分支編碼為 1 ,右分支編碼為 0初始化原始消息數(shù)目排序列表初始化分別遍歷左右分支結(jié)點(diǎn)將 n 個(gè)消息進(jìn)行排序獲得霍夫曼碼字開(kāi)始圖 霍夫曼編碼程序流程圖基于 MATLAB 的 JPEG 基本系統(tǒng)編碼27 圖形用戶(hù)界面設(shè)計(jì)具體程序運(yùn)行的結(jié)果如圖 所示。(1) 運(yùn)行附錄主程序 GUI1 后,其運(yùn)行結(jié)果如圖 (a)所示:圖 (a) JPEG 圖像壓縮編碼的界面(2) 在(1)的基礎(chǔ)上點(diǎn)擊圖 (a)上的按鈕“DCT” ,所得結(jié)果如圖 (b)所示:圖 (b) 點(diǎn)擊 DCT 后出現(xiàn)一個(gè)“ 請(qǐng)選擇一個(gè)圖像”的對(duì)話(huà)框XX 大學(xué)學(xué)士學(xué)位論文28 (3) 選擇名為 “couple”的圖像后,可以得到圖 (c)所示的結(jié)果。圖 (c) 在(b)的基礎(chǔ)上選擇 couple 圖像后所得出的結(jié)果(4) 選擇名為“l(fā)enna”的圖像后,可以得到圖 (d)所示的結(jié)果。從運(yùn)行結(jié)果我們可以看到原始圖像和 DCT 算法重構(gòu)圖像基本上沒(méi)有差別。圖 (d) 在(b)的基礎(chǔ)上選擇 lenna 圖像后所得出的結(jié)果基于 MATLAB 的 JPEG 基本系統(tǒng)編碼29(5) 選擇名為 “baboon”的圖像后,可以得到圖 (e)所示的結(jié)果。圖 (e) 在(b) 的基礎(chǔ)上選擇圖像“baboon”后所得出的結(jié)果圖 JPEG 壓縮前后的 MATLAB 仿真圖像在本文中采用了三幅標(biāo)準(zhǔn)圖像“l(fā)enna”、 “couple”和“baboon”進(jìn)行 MATLAB 實(shí)驗(yàn)仿真。它們都是連續(xù)色調(diào)圖像,盡管“l(fā)enna”有一些離散色調(diào)圖像的特征。 “baboon”是一幅自然圖像,它的細(xì)節(jié)( 顯示部分右眼及其四周)表明許多像素與其最近相鄰差別甚大,因?yàn)榇颂幱袆?dòng)物的臉部毛發(fā)。然而鼻子區(qū)域卻是連續(xù)色調(diào)的。 “l(fā)enna”圖像多為純連續(xù)色調(diào),特別是墻和皮膚區(qū)域。帽子是好的連續(xù)色調(diào),然而頭發(fā)和帽子上的羽毛卻是差的連續(xù)色調(diào)。墻上的直線(xiàn)和鏡子的曲線(xiàn)部分則是離散色調(diào)圖像的特征。壓縮結(jié)果主要與兩個(gè)因素有關(guān),也就是說(shuō),分析一個(gè)壓縮算法的性能好壞,不僅要研究不同比特率下的壓縮結(jié)果如何,還應(yīng)對(duì)圖像本身確定信號(hào)對(duì)壓縮結(jié)果的影響進(jìn)行分析與探討。如 MATLAB 將圖像分成兩大類(lèi),將大部分圖像歸為 “有界變差圖像”,而含紋理較多的圖像稱(chēng)為“ 更不正規(guī)圖像 ”,而且“有界變差圖像”的壓縮誤差要比“ 更不正規(guī)圖像”的壓縮誤差小。由于圖像經(jīng)過(guò) DCT 變換后,根據(jù)人眼視覺(jué)特性,通過(guò)設(shè)置不同視覺(jué)閾值或量化電平,將許多能量較小的高頻分量量化為零,而能量較大的系數(shù)保留了下來(lái),從而實(shí)現(xiàn)了較高效率的壓縮。但是高頻成分是圖像中的邊緣、輪廓和紋理等細(xì)節(jié)信息的體現(xiàn),而且在各個(gè)頻帶所表示的邊緣、輪廓等信息的方向是不同的,其中包括水平方向、豎直方向、對(duì)角線(xiàn)方向的信息,DCT 變換處理的圖像不具備這樣的方向選擇性,DCT 變換編碼沒(méi)有保留原圖像塊的精細(xì)結(jié)構(gòu),不能反映原始圖像塊的邊緣、輪廓等信息(這是由于 DCT 缺乏時(shí)、XX 大學(xué)學(xué)士學(xué)位論文30頻局域性造成的),因此它不能很好地反映編碼圖像的細(xì)節(jié)?!發(fā)enna”圖像是一種平滑圖像。從圖 (c)“l(fā)enna”圖像的仿真中,我們可以看到,壓縮比為 ,峰值信噪比為,重構(gòu)圖像與原始圖像基本沒(méi)有差別。雖然“l(fā)enna”圖像 含有許多的細(xì)節(jié)信息,但從重構(gòu)圖像我們可以看出,DCT 算法偏重于圖像的視覺(jué)效果,用該算法得出圖像的視覺(jué)效果相當(dāng)好,它與原圖像的視覺(jué)效果幾乎一樣。 “couple”圖像是一種紋理圖像,從圖(d) “couple”像的仿真中我們可以看到仿真結(jié)果為:壓縮比為 ,峰值信噪比為 dB。 “baboon”圖像是一種邊緣圖像,從圖 (e) “bab