小波变换c语言程序包,小波变换VC6.0程序实现
摘要:隨著小波研究的深入,小波變換的應用范圍越來越廣泛,但是一般的研究、工作中只是使用Matlab的小波工具包來編程。該文使用VC++6.0設計實現基于小波變換的數字圖像處理軟件模塊,編寫具體實現程序,設計軟件界面,使其使用方便快捷,對于今后使用小波變換進行各種實際工作有一定的幫助。
關鍵詞:小波變換;VC++6.0;Matlab
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2010)03-615-02
Wavelet Transform Procedures for Implementation VC++6.0
LIU Chao1, XING Shu-guang1, YANG Xi-e2
(1.China University of Geosciences (Wuhan) The Faculty of Earth Resources, Wuhan 430074, China; 2.Northwest A&F University, College of Humanities, Yangling 712100, China)
Abstract: With the wavelet-depth study, the scope of application of wavelet transform more and more widely, but most of the research, the work is the use of Matlab wavelet toolkit for programming. This paper uses the Design and Implementation of VC++6.0 digital image processing software modules based on wavelet transform to prepare concrete realization of programs, design software interface to make it a convenient, for helping future use of wavelet transform to the practical work.
Key words: wavelet transform; VC++6.0; Matlab
1 概述
多分辨率分析和多尺度幾何分析的結合已經成為目前學術界的熱門課題。
小波最先始于學者Harr提出的一種非連續可微的正交分解,之后,物理學家Levy利用Harr小波變換研究分子的布朗運動,Mallat提出了相當于傅里葉變換中FFT的Mallat算法,Daubechies構造出的緊支撐小波,如今,第二代甚至第三代小波都得到了飛速發展。
小波分析是即傅里葉分析之后,信號處理方面里程碑式的發展結晶。工程應用方面,小波變換在數字信號處理、圖像處理、語音處理、生物醫學信號處理等實踐中的應用越來越廣泛。但是目前,在小波變換研究和工程應用主要通過使用Matlab小波工具箱來實現。相關的C語言編碼較少,且不易使用。
2 離散小波變換
在實際應用中,離散小波變換的實現容易,能為信號分析與合成提供足夠的信息,同時降低計算機的資源消耗和計算量。因此,本文主要介紹離散小波變換。
在離散小波變換中,首先通過卷積運算完成信號的濾波,將信號分解為信號的初級估計近似和信號的細節信息,然后在不同的頻帶上利用不同的尺度因子對信號進行處理。離散變換示意圖如圖1。
圖中x(n)是原始信號,然后通過g(n)和h(n)完成分解,信號帶寬利用f表示。完成濾波后的濾波輸出等式為等式(1)高通濾波輸出和等式(2)低通濾波輸出
3 一維小波變換VC++實現
由2可知,離散小波變換實際是通過卷積運算完成的,小波變換一維DWT或IDWT實現代碼如下:
1) 函數輸入
double * data,指向源數據的指針。intnCurLongth,當前處理數據長度。int IDWT,是否為DWT,1表示為IDWT,0表示DWT。int nStep,當前分解層數 。int nSupp,小波基的緊支集的長度。本文中,小波基存儲在hCoef這個二維數組中,通過nSupp調用小波基
double s = sqrt(2);double* h = NULL;
h = (double*)hCoef[m_nSupp-1]; // 獲得小波基的指針
int CurN = nCurLongth; // 計算當前層數的長度
// 確認所選擇的小波基和當前層數的長度有效
if (m_nSupp
return FALSE;
// 分配臨時內存用于存放結果
double *ptemp = new double[CurN];
if (!ptemp) return FALSE;
double s1, s2; int Index1, Index2;
// 判斷是進行DWT還是IDWT
if (!nInv)
{ // DWT
Index1=0,Index2=2*m_nSupp-1;
// 進行卷積,其中s1為低頻部分,s2為高頻部分的結果
for (int i=0; i
{
s1 = s2 = 0;double t = -1;
for (int j=0; j
{
int m = 0,n = 0;
if(Index1 >= 0 && Index1
else if(Index1 < 0) m = CurN + Index1;
else m = Index1-CurN;
if (Index2 >= 0 && Index2
else if(Index2 < 0) n = CurN + Index2;
else n = Index2-CurN;
s1 += h[j]*data[m * nStep];
s2 += t*h[j]*data[n * nStep];
Index1++; Index2--;}
// 將結果存放在臨時內存中
ptemp[i] = s1/s,ptemp[i+CurN/2] = s2/s;
Index1 -= 2*m_nSupp,Index2 += 2*m_nSupp;
Index1 += 2,Index2 += 2;
}
}
else{ // IDWT
Index1 = CurN/2; Index2 = CurN/2-m_nSupp+1;、
int nHalf=CurN/2;
for (int i=0; i
{
s1 = s2 = 0;
int Index3 = 0;
for (int j=0; j
{
int m=0, n=0;
if (Index1>=nHalf)m = Index1 - nHalf;
elsem = Index1;
if (Index2>=nHalf)n = Index2 - nHalf;
else n = Index2;
s1 += h[Index3]*data[m * nStep]
+h[Index3+1]*data[(n + CurN/2) * nStep];
s2 += h[Index3+1]*data[m * nStep]
-h[Index3]*data[(n + CurN/2) * nStep];
Index3+=2,Index1--,Index2++;}
// 將結果存入臨時內存
ptemp[2*i] = s1*s,ptemp[2*i+1] = s2*s;
Index1 += m_nSupp,Index2 -= m_nSupp;
Index1++,Index2++;
}
}
// 將結果存入源圖象中
for (int i=0; i
data[i*nStep] = ptemp[i];
// 釋放臨時內存
delete[] ptemp;
4 圖像的小波變換
圖像可以看做是二維的矩陣。完成小波變換后,圖像便分解為4個大小為原來尺寸1/4的子塊頻帶區域,具體處理結果如圖2所示。
圖中LL頻帶保持了原始圖像內容信息,HL、LH、HH分別保持了圖像水平、豎直、對角線方向上的高頻邊緣信息。由于篇幅有限這里就不寫出二維信號的具體小波變換實現代碼。其具體實現方法為先對圖像小波行變換,再進行小波列變換。
本文給出了一維小波變換具體實現代碼,此代碼優點為實現一維變換與逆變換簡便容易。在以其為基礎實現二維變換時,處理圖片大小不局限于N*N大小。希望對需要自己編寫小波變換代碼的讀者有一定幫助。
參考文獻:
[1] 靳濟芳.Visual C++小波變換技術與工程實踐[M].北京:人民郵電出版社,2004.
[2] 楊淑熒,邊奠英.VC++圖像處理程序設計[M].北京:清華大學出版社,北京交通大學出版社,2007.
[3] 許剛,董士崇.小波變換算法的C語言實現[J].電腦知識與技術,2005(2).
[4] 葛哲學,沙威.小波分析理論與MATLAB R2007實現[M].北京:電子工業出版社,2007.
總結
以上是生活随笔為你收集整理的小波变换c语言程序包,小波变换VC6.0程序实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魔兽争霸3地图(WarIII Maps)
- 下一篇: 最新JS正则大全(常用)