宦暉
關(guān)鍵詞:圖像壓縮;哈夫曼編碼;范氏哈夫曼編碼
1引言
近年來,圖像壓縮技術(shù)快速發(fā)展,各種新技術(shù)得以應(yīng)用。但哈夫曼編碼作為一種傳統(tǒng)的基礎(chǔ)算法[1-2],一直在圖像壓縮技術(shù)中占有重要地位。
哈夫曼編碼基于數(shù)據(jù)的統(tǒng)計(jì)特性,可以實(shí)現(xiàn)無損的圖像壓縮與解壓縮。范氏哈夫曼編碼是對(duì)傳統(tǒng)哈夫曼編碼的優(yōu)化改進(jìn),通過對(duì)編碼規(guī)則約定限制,能更加高效地對(duì)哈夫曼樹進(jìn)行編碼,減少編解碼過程所消耗的計(jì)算資源與存儲(chǔ)空間。
對(duì)范氏哈夫曼編碼在圖像壓縮中的實(shí)際效果進(jìn)行驗(yàn)證分析,是本文研究的出發(fā)點(diǎn)。通過對(duì)多組24位BMP圖像文件以及不同格式的BMP圖像文件進(jìn)行壓縮與解壓縮,并對(duì)最終的壓縮效率進(jìn)行對(duì)比,以得出相關(guān)結(jié)論。
2哈夫曼編碼
哈夫曼編碼是基于數(shù)據(jù)源的統(tǒng)計(jì)特性建立哈夫曼樹,再進(jìn)行編碼的算法。建立哈夫曼樹是一個(gè)循環(huán)迭代的過程,每一步驟中的工作過程相同,具體過程為:編碼器獲取所有符號(hào)( Symbol)的統(tǒng)計(jì)頻率,并將所有符號(hào)放置在一個(gè)集合中:從集合中選取統(tǒng)計(jì)頻率最低的兩個(gè)符號(hào)作為節(jié)點(diǎn),并創(chuàng)建一個(gè)新的內(nèi)部節(jié)點(diǎn)且放回集合中,原來的兩個(gè)節(jié)點(diǎn)被新創(chuàng)建的節(jié)點(diǎn)代替,新創(chuàng)建節(jié)點(diǎn)的統(tǒng)計(jì)頻率為所選兩個(gè)節(jié)點(diǎn)的統(tǒng)計(jì)頻率之和:將所選的兩個(gè)節(jié)點(diǎn)與新創(chuàng)建節(jié)點(diǎn)構(gòu)成一個(gè)最小二叉樹。如此不斷地循環(huán)迭代,直到集合中只剩下一個(gè)節(jié)點(diǎn)(根節(jié)點(diǎn)),此時(shí)哈夫曼樹構(gòu)建完成。
哈夫曼編碼壓縮后的數(shù)據(jù)量等于哈夫曼樹帶權(quán)路徑長度(Weighted Path Length,WPL)。哈夫曼樹的帶權(quán)路徑長度指的是所有節(jié)點(diǎn)的帶權(quán)路徑長度之和。n個(gè)編碼長度為Li(i=1,2,…,n)的葉節(jié)點(diǎn)的哈夫曼樹的帶權(quán)路徑長度為:
哈夫曼樹是帶權(quán)路徑長度最小的二叉樹,是最優(yōu)二叉樹。在哈夫曼編碼表的結(jié)構(gòu)中,每一棵最小二叉樹的左右子節(jié)點(diǎn)位置是隨機(jī)的,如果將哈夫曼樹中的任意一個(gè)最小二叉樹的左右節(jié)點(diǎn)位置互換,只會(huì)導(dǎo)致某些字符的具體編碼改變,但整個(gè)哈夫曼樹的帶權(quán)路徑總長度并不會(huì)發(fā)生變化,也不會(huì)影響哈夫曼編碼的壓縮率。如果能約定規(guī)則,限制哈夫曼樹中的最小二叉樹左右節(jié)點(diǎn)位置的不確定性,則表明哈夫曼樹所需的數(shù)據(jù)量可以有效降低。另外,傳統(tǒng)的哈夫曼編碼是通過將出現(xiàn)頻率較高的符號(hào)以較短編碼,從而提高壓縮率。但該方法有兩大缺點(diǎn):首先,每一個(gè)樹節(jié)點(diǎn)都要儲(chǔ)存其父節(jié)點(diǎn)與子節(jié)點(diǎn)等相關(guān)信息,符號(hào)集合包含很多不同概率的符號(hào),其數(shù)量越多,對(duì)應(yīng)存儲(chǔ)空間將會(huì)增加越多;其次,哈夫曼樹的跟蹤和維護(hù)需要消耗非常大的計(jì)算資源。由于這兩個(gè)原因,傳統(tǒng)哈夫曼編碼在儲(chǔ)存空間以及計(jì)算效率上都需要提升、優(yōu)化。
3范氏哈夫曼編碼
范氏哈夫曼編碼(Canonical Huffman Code)是施瓦茲(SCHWARTZ E S)提出的[4],對(duì)傳統(tǒng)哈夫曼編碼進(jìn)行優(yōu)化的算法,通過對(duì)符號(hào)和編碼的下列三個(gè)數(shù)字序列屬性進(jìn)行編碼規(guī)則約定限制,從而可以更加高效地對(duì)哈夫曼樹進(jìn)行編碼。
范氏哈夫曼編碼約束規(guī)則如下。
(1)具有相同哈夫曼編碼長度的符號(hào)編碼是連續(xù)二進(jìn)制整數(shù),對(duì)應(yīng)原碼的值越小,則對(duì)應(yīng)哈夫曼編碼也越小。
(2)編碼長度為i的第一個(gè)符號(hào)的編碼H(i)與長度為i-l的最后~個(gè)符號(hào)的編碼H(i-l)的關(guān)系滿足以下公式:
該約束公式的含義是,長度為i第一個(gè)符號(hào)的編碼,是將長度為i-l的最后一個(gè)符號(hào)的編碼進(jìn)行左移一位并補(bǔ)零。
(3)哈夫曼編碼長度最小的第一個(gè)符號(hào)從0開始。第一個(gè)符號(hào)的編碼方式是依照符號(hào)的編碼長度分配相同長度的“0”值。
根據(jù)以上三個(gè)約束規(guī)則,可按順序?yàn)榇_定了長度的每個(gè)符號(hào)分配唯一可譯碼(unique decodable code)。如此,就把存儲(chǔ)整個(gè)哈夫曼樹編碼表的任務(wù)簡化為存儲(chǔ)每個(gè)符號(hào)編碼長度的任務(wù)。
范氏霍夫曼編碼要求相同長度編碼必須是連續(xù)的[5]:為盡可能減小儲(chǔ)存空間,編碼長度為i的第一個(gè)符號(hào)可以從編碼長度為i-1的最后一個(gè)符號(hào)所獲得。另外,最小編碼長度的第一個(gè)編碼必須從0開始。范氏哈夫曼編碼通過其約束規(guī)則,可以根據(jù)每個(gè)符號(hào)的長度,按照范氏哈夫曼編碼的規(guī)則重構(gòu)出整個(gè)編碼表。
在圖像數(shù)據(jù)的壓縮過程中,應(yīng)實(shí)現(xiàn)兩方面的最小化,即存儲(chǔ)編碼表和哈夫曼樹的存儲(chǔ)空間最小化:編解碼過程所消耗的計(jì)算資源的最小化。范式哈夫曼編碼技術(shù)能同時(shí)滿足這兩方面的需求,比傳統(tǒng)的哈夫曼編碼技術(shù)更加有效[6]。
4對(duì)位圖文件進(jìn)行壓縮、解壓縮
在本文研究中,以范氏哈夫曼編碼取代傳統(tǒng)哈夫曼編碼,對(duì)BMP圖像文件進(jìn)行壓縮與解壓縮,并觀察實(shí)際的壓縮效率。
BMP是位圖(Bit Map)的簡稱,是未實(shí)行壓縮處理的原始圖像,存儲(chǔ)格式是位映射。在Windows操作系統(tǒng)自帶的畫圖軟件中可按單色、16色、256色、24位四種格式保存BMP圖像。BMP圖像主要有三個(gè)特點(diǎn):一是格式簡單:二是圖像信息量豐富:三是存儲(chǔ)時(shí)所占用的內(nèi)存較大。BMP圖像由四部分組成,如表1所列。
傳統(tǒng)哈夫曼編碼必須保存哈夫曼樹,本文研究中采用靜態(tài)數(shù)組實(shí)現(xiàn)哈夫曼樹的構(gòu)建,哈夫曼樹節(jié)點(diǎn)包括權(quán)值、父節(jié)點(diǎn)、左右子節(jié)點(diǎn),數(shù)據(jù)結(jié)構(gòu)如下所示:
與傳統(tǒng)哈夫曼編碼相比,范式哈夫曼編碼節(jié)省了保存哈夫曼樹本身所需的數(shù)據(jù)量。
本文研究中的圖像壓縮解壓縮程序采用C++語言編寫,在CPU為Intel Core i5-102IOU,RAM為16CB的個(gè)人計(jì)算機(jī)上運(yùn)行。
該程序的流程圖如圖1所示。
以24位位圖為樣本,對(duì)多組24位位圖進(jìn)行測試,并選取三組不同壓縮效果的測試結(jié)果進(jìn)行對(duì)比,如表2所列。
對(duì)于不同內(nèi)容的圖像,壓縮率會(huì)根據(jù)內(nèi)容而變化,這與圖像數(shù)據(jù)的統(tǒng)計(jì)特性有關(guān)[7]。統(tǒng)計(jì)上冗余信息較多的圖像,壓縮率較高。
在本文研究中,針對(duì)同一幅圖像,轉(zhuǎn)換為四種BMP格式,分別為單色位圖、16色位圖、256色位圖、24位位圖,然后進(jìn)行壓縮與解壓測試,相應(yīng)的測試數(shù)據(jù)如表3所列。
對(duì)同一幅圖像的不同位圖格式的壓縮率進(jìn)行對(duì)比,程序?qū)紊粓D的壓縮效果最好,對(duì)16色位圖的壓縮效果也較為理想,對(duì)256色位圖也有較高的壓縮率,而對(duì)24位位圖的壓縮效果最差。
就壓縮耗時(shí)與解壓耗時(shí)而言,對(duì)于字節(jié)長度較小的文件,壓縮耗時(shí)比解壓耗時(shí)長;對(duì)于字節(jié)長度較大的文件,壓縮耗時(shí)比解壓耗時(shí)短。
5結(jié)束語
本文研究使用范式哈夫曼編碼對(duì)BMP圖像進(jìn)行壓縮處理,并得到相關(guān)測試數(shù)據(jù)。在相關(guān)程序的哈夫曼編碼過程中,判斷圖像是否全部出現(xiàn)256個(gè)顏色像素點(diǎn)后,僅讓有權(quán)值的像素點(diǎn)作為哈夫曼樹的葉結(jié)點(diǎn),未出現(xiàn)的像素點(diǎn)不涉及哈夫曼樹的構(gòu)建,由此可提高哈夫曼編碼的壓縮效率。由程序測試結(jié)果可知,屬于無損壓縮算法的范氏哈夫曼編碼的確能夠很好地?zé)o失真還原圖像壓縮文件。
在使用范氏哈夫曼編碼進(jìn)行圖像壓縮的過程中,硬件平臺(tái)對(duì)于軟件算法上也有影響,可以針對(duì)不同硬件平臺(tái)的數(shù)據(jù)吞吐量和緩存資源來改進(jìn)和優(yōu)化算法。