摘要:該文討論了數字圖像壓縮中三種具有代表性的圖像變換方法,并采用C++程序語言驗證這幾種方法。
關鍵詞:圖像壓縮 快速傅里葉變換 離散余弦變換 小波變換 頻譜分析
中圖分類號:TP752文獻標識碼:A文章編號:1009-3044(2008)34-1745-02
Transformation of Domain in Digital Image Compression
ZHU Ming-xuan
(College of Software Engineering, Southeast University, Nanjing 210096, China)
Abstract: This paper discusses three kinds of representative methods about image transformations in image compression, and adopts C++ to verify these transformations.
Key words: image compression; fast Fourier transform; discrete cosine transform; wavelet transform; frequency analysis
1 引言
目前多媒體數據通信的需求在不斷增長,而圖像數據構成了多媒體通信的主要部分,它們占據了很大一部分通信帶寬。同時圖像數據也占據了很多設備的存儲空間,基于以上兩點,促進了圖像壓縮技術的發展。其中圖像變換技術就是其中之一。圖像變換本身并不進行數據壓縮,它只把信號映射到另一個域中,使信號在變換后的域中容易壓縮而已。對于一幅圖像來說,直接在空間域中進行處理需要的運算量很大。為了減少運算量,我們可以采用數學手段對空間域的圖像進行積分變換,將空間域的問題轉化到頻率域來處理。這樣不僅可以減少運算量,而且可以獲得更有效的處理結果。例如,一幅重影圖像在空間域中是無法把它們分開的,然而將它們變換到頻率域后,它們在頻譜上確是獨立分開的,由此便可以對它們進行分別處理。
圖像變換的方法眾多,包括經典的傅里葉變換、余弦變換等。這些變換名稱意義各不相同,但它們的共同點是都存在自己的正交函數集,正是由于這些正交函數集的不同才產生了不同的變換。該文主要討論了數據壓縮中的三種變換及其各自的特點,同時用C++進行了實現,最后對3種變換進行對比。
2 快速傅里葉變換
快速傅里葉變換(FFT)是建立在離散傅里葉變換(DFT)基礎上的。而離散傅里葉變換(DFT)是連續傅里葉變換的離散形式。離散傅里葉變換建立了函數在空間域與頻率域之間的轉換關系,把空間域難以表示的特征在頻率域中顯示出來。但是,在離散傅里葉變換的計算中,不論乘法或是加法,計算量均與N2成正比,所以N較大時計算量是相當大的。而快速傅里葉變換則利用變換系數ωNnk的周期性和對稱性對DFT運算進行合并和分解,從而降低了DFT的計算量。FFT從本質上說就是DFT的一種快速算法。由于圖像數據是二維的,因此在圖像壓縮中采用的是二維離散傅里葉變換。變換公式如下(本文的傅里葉變換取方陣形式):
■
由公式可以看出二維DFT具有分離性,因此二維DFT可以通過兩次一維DFT來實現。本文采用蝶形運算實現一維FFT和二維FFT。其蝶形運算關鍵代碼如下:
//蝶形運算
c = cos(-2*PI*(i-pow(2,r)/2)/ pow(2,r)); // 加權因子
s = sin(-2*PI*(i-pow(2,r)/2)/ pow(2,r));
tmp1[k* pow(2,r)+i].real = tmp2[k* pow(2,r)+i].real*c-tmp2[k* pow(2,r)+i].imag*s;
tmp1[k* pow(2,r)+i].imag = tmp2[k* pow(2,r)+i].imag*c+tmp2[k* pow(2,r)+i].real*s;
3 離散余弦變換
離散余弦變換(DCT)是數字圖像處理中的一種重要變換,它是JPEG國際標準的變換核心。DCT是一種可分離的正交變換,并且是中心對稱的。它與DFT有密切的聯系。DFT的一個最重要的問題是它的運算都是復數運算,在數據表述中是實數的2倍,不易計算。而離散余弦變換是以實數為對象的運算。離散余弦變換的基本思想就是通過對圖像的變換使分散在各個像素上的能量集中到變換后的少數系數上,同時除去0或近似于0的系數,從而達到數據壓縮的目的。二維DCT變換公式如下:
■
其中,d(0,0)=■,d(k,l)=1, 1≤k,l≤N-1
由上式公式可知,二維DCT變換的基函數也是可分離的,因此二維DCT變換可以通過分別對行和列進行一維DCT變換實現。即如圖1所示。
在JPEG標準中,圖像被分割成一個一個由8*8像素構成的像塊,而后再對每一像塊進行DCT變換。對一個像塊進行變換的關鍵代碼如下:
//DCT正向變換(IMG[y][x]為原信號,DCT[m][n]為變換后信號)
sum = sum + IMG[y][x]*cos((2*x+1)*n*PI/16) *cos((2*y+1)*m*PI/16);
DCT[m][n] = sum*d[m][n]*2/8;
4 小波變換
所謂小波,就是用具有零均值,在時域和頻域內能量局部化的函數表示,其波形表現為兩端衰減為零的小的波形。由于傅里葉變換和離散余弦變換是一種全局變換,完全在空域或者完全在頻域,因此無法表達信號的時頻局部特性。而小波變換在空域和頻域都具有表征信號局部特征的能力,即在低頻部分具有較高的頻率分辨率和較低的時間分辨率,而在高頻部分具有較高的時間分辨率和較低的頻率分辨率。小波變換采用塔形分解的數據結構,與人眼由粗到精,由整體到細節的觀察習慣一致,即先傳送頻率最低的子圖像,再依次傳送其他圖像。
圖像經過小波變換后,圖像數據就被分解為大小,位置和方向都不同的分量。能量在各個頻率空間進行了重新分配。其中不同分辨率的子圖像對應的頻率是不一樣的。同時小波系數與原始圖像存在著空間上的對應關系,通過對小波系數分布情況的分析,利用不同的濾波器處理小波系數,經過逆變換后可以得到理想的處理效果。
標準的圖像可以對其進行3次小波變換。小波的每一次變換實際就是對圖像進行行列變換,其結果是左上角顯示縮小為原來四分之一的圖像,右上角是圖像行變換的結果,左下角是圖像列變換的結果,而右下角則是對圖像進行45度邊緣檢測的處理結果。其行變換的關鍵代碼如下(列變換類似):
//實行行變換(j為圖像的高度變量,i為圖像寬度一半的變量)
int w =i*2;
tmp[j*wide+i]=m_pData[j*wide+w];//偶
tmp[j*wide+wide/2+i]=m_pData[j*wide+w+1];//奇
//通過圖像的差分完成小波變換
tmp=[j*wide+wide/2-1+i]=tmp[j*wide+wide/2-1+i]-tmp[j*wide+i]+128;
5 結論
傅里葉變換是一種經典的數學變換方法,本身提供了很多有用的特性,但是也有不足的地方。其一,是需要計算復數,而復數計算相對比較費時。而離散余弦變換是以實數為運算對象,避免了這種復數運算。因此計算速度要比傅里葉變換快得多。其二,傅里葉變換收斂慢,尤其在圖像編碼中比較突出。
離散余弦變換由于對原信號進行了以網格為單位的處理,每個網格之間信號的連續性被分割,由此產生了方塊效應。也就是說所得的變換系數只反映塊內信息,而不能反映塊間信息。而小波變換是一種全局變換,故在重建圖像中可以免除離散余弦變換所固有的方塊效應,在較低的碼率下比采用離散余弦變換效果更好。這也是為什么JPEG2000標準中采用了小波變換。
參考文獻:
[1] 章毓晉.圖像工程——圖像處理與分析[M].北京:清華大學出版社,1997.
[2] 楊淑瑩. VC++圖像處理程序設計[M].2版.北京:清華大學出版社,2005
[3] Gonzalez R C, Woods R E. Digital Image Processing[M].2nd ed.Pearson Education,Inc,2002.
[4] Acharya T, Ray A K. Image Processing: Principles and applications[M].Wiley-interscience,2007.
[5] 邱寬民,趙勝凱.DFT與FFT在實際應用時的性能比較[J].北方交通大學學報,2000,24(5):60-62.