戴微微 楊銘
(吉林電子信息職業(yè)技術(shù)學(xué)院,吉林 吉林 132021)
隨著多媒體技術(shù)的快速發(fā)展,靜止圖像的應(yīng)用越來越廣泛。它的應(yīng)用主要集中在圖像的存儲(chǔ)和圖像的傳輸兩方面,從具體應(yīng)用中我們可以發(fā)現(xiàn)靜止圖像占用了越來越多的資源。在這樣的背景條件下,靜止圖像的壓縮成為了一個(gè)研究的熱點(diǎn)。目前靜止圖像的壓縮算法以JPEG(Joint Photographic Experts Group)和JPE G2000為主。JPEG壓縮格式是目前圖像處理領(lǐng)域里面用得最廣泛的一種圖像壓縮方式,本文主要就JPEG標(biāo)準(zhǔn)對圖像進(jìn)行編、解碼的研究。主要應(yīng)用是圖像信息的傳輸和存儲(chǔ),可廣泛地應(yīng)用于廣播電視、電視會(huì)議、計(jì)算機(jī)通訊、傳真、多媒體系統(tǒng)、醫(yī)學(xué)圖像、衛(wèi)星圖像等領(lǐng)域。壓縮編碼的方法有很多,主要分成以下四大類:(1)象素編碼;(2)預(yù)測編碼;(3)變換編碼;(4)其它方法。
根據(jù)系統(tǒng)功能的要求,可將系統(tǒng)分解成幾個(gè)功能模塊來分別設(shè)計(jì)。JPEG的壓縮原理其實(shí)上面介紹的那些原理的綜合,博采眾家之長,這也正是JPEG有高壓縮比的原因。其編碼器的流程如下。
圖JPEG編碼器流程
本系統(tǒng)采用VC++來實(shí)現(xiàn)。系統(tǒng)實(shí)現(xiàn)的各個(gè)步驟如下。
3.1 讀取BMP圖像信息,獲取圖像行像素和列像素?cái)?shù)值,在BMP圖像中,圖像數(shù)據(jù)是以倒序存放的。亦即實(shí)際圖像第一行資料存放在BMP圖像數(shù)據(jù)矩陣的最后一行,依次類推,所以取資料的時(shí)候要從BMP圖像數(shù)據(jù)矩陣的最后一行開始讀起,把數(shù)據(jù)存放在新建數(shù)組(或稱矩陣)的第一行,一直取完。BMP圖像行像素和列像素的數(shù)值分別存于文件頭信息的第18和22字節(jié)。從Cimage類中可得到Width(圖像寬度)和hight(圖像高度)的數(shù)值。
3.2 得到Pwidth*Phight后便得知BMP圖像的像素點(diǎn)大小,而數(shù)據(jù)矩陣(三基色,RGB矩陣)的大小是Pwidth*Phight*3,因?yàn)槊恳粋€(gè)像素點(diǎn)都含有RGB三個(gè)數(shù)據(jù),我們要處理的是數(shù)據(jù)矩陣而不是像素點(diǎn)矩陣。所以,新建數(shù)組的大小是(Pwidth*3)*Phight。
3.3 接下來,把這一個(gè)矩陣(包含BGR)拆分成三個(gè)獨(dú)立的B、G、R矩陣,得到三個(gè)新的矩陣(只包含B的矩陣,只包含G的矩陣,只包含R的矩陣),簡稱為B矩陣、G矩陣、R矩陣(大小為Pwidth*Phight),用程序?qū)崿F(xiàn)拆分,只要依次取原矩陣的第1、4、7、10、13......個(gè)資料即得到B矩陣,依次讀取第2、5、8、11......個(gè)數(shù)據(jù)即得到G矩陣,依次讀第3、6、9、12......個(gè)資料即得到R矩陣。得到B、G、R矩陣后再利用顏色轉(zhuǎn)換公式很容易就可得到Y(jié)CbCr矩陣。
Y(n)=0.114B(n)+0.587G(n)+0.299R(n)
Cb(n)=0.5B(n)-0.3313G(n)-0.1687R(n)
Cr(n)=0.0813B(n)-0.14187G(n)+0.5R(n)
(For n=1 To PW*PH),其中PW為Pwidth的簡寫,PH為Phight的簡寫。
3.4 二維DCT變換
由于VC中無法實(shí)現(xiàn)二維DCT計(jì)算公式,所以只有把二維的變換變成先做一維,再做另一維的變換,俗稱快速DCT變換??焖貲CT變換方法如下:設(shè)一個(gè)大小為8的數(shù)組SL(8),先讀取一個(gè)8*8塊的第一行資料值,賦給SL(8),對SL (8)進(jìn)行一維DCT變換后得到一個(gè)新的SL(8)數(shù)組,再把SL(8)數(shù)組覆蓋到原來的8*8塊中相應(yīng)的地方去。做完第一行后再做第二行,一直做完8行,一個(gè)8*8塊的一維DC即告完成,然后再做列方向的第二維DCT變換,變換公式一樣,只是由SL(8)取8*8塊的行資料變成取列數(shù)值。做完后覆蓋回原值,即得到一個(gè)8*8塊的DFT系數(shù)塊,再重復(fù)這兩個(gè)過程做第二個(gè)8*8塊......一直到做完全部8*8塊(Y,Cb,Cr)。這樣就得到Y(jié)、Cb、Cr的DFT系數(shù)矩陣。
3.5 量化
讀取Y矩陣中第一個(gè)8*8塊,與量化系數(shù)矩陣中對應(yīng)的相乘,得到的值覆蓋回原矩陣,然后做第二個(gè)8*8塊,一直到做完全部8*8塊,然后做CbCr矩陣的量化,用另外一個(gè)系數(shù)矩陣。
3.6 “之”字形掃描
3.7 哈夫曼編碼
哈夫曼編碼時(shí)必須判斷一個(gè)個(gè)DC(AC)的值,以及轉(zhuǎn)換成二進(jìn)制代碼后的碼長,再去對照哈夫曼編碼表進(jìn)行編碼,比如對一個(gè)DC值編碼,首先得先判斷該DC的值在哪段范圍內(nèi),在某一段范圍內(nèi)的數(shù)值,其二進(jìn)制代碼長相等。并要讓程序知道該DC的值到底為多少,然后才能進(jìn)行編碼。
壓縮過程完成以后,接下去要做的工作便是碼串存貯,存貯時(shí)需要注意的——點(diǎn)是在抽樣過程中得到1個(gè)Y塊對應(yīng)1個(gè)Cb塊合一個(gè)Cr塊的對應(yīng)關(guān)系,在存貯時(shí)也要按這種對應(yīng)關(guān)系存貯,即1個(gè)Y塊的碼串后面緊接著存放與其對應(yīng)的一個(gè)Cb塊的碼串及一個(gè)Cr塊的碼串,循環(huán)往復(fù),存完所有串。這樣的1個(gè)Y8*8塊+1個(gè)Cb塊+1個(gè)Cr簡稱為MCU,是JPEG格式的最小存貯處理單元。
[1]張旭東,盧國棟,馮健.圖像編碼基礎(chǔ)和小波壓縮技術(shù)——原理、算法和標(biāo)準(zhǔn)[M].北京:清華大學(xué)出版社,2004。
[2]鐘玉琢.多媒體技術(shù)[M].北京:清華大學(xué)出版社,1999.
[3]黎洪松.數(shù)字圖象壓縮編碼技術(shù)及其C語言程序范例[M].北京:學(xué)苑出版社,1998.
[4]林福宗.圖象文件格式大全[M].北京:清華大學(xué)出版社,1998.
[5]郎銳.數(shù)字圖像處理的Vc++實(shí)現(xiàn)[M].北京:北京希望電子出版社,1996.