傅里葉變換與數(shù)字圖像處理_第1頁
傅里葉變換與數(shù)字圖像處理_第2頁
傅里葉變換與數(shù)字圖像處理_第3頁
傅里葉變換與數(shù)字圖像處理_第4頁
傅里葉變換與數(shù)字圖像處理_第5頁
已閱讀5頁,還剩26頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、傅里葉變換與數(shù)字圖像處理(2012-05-24 20:06:24)轉載 標簽:it傅里葉變換是將時域信號分解為不同頻率的正弦和/余弦和的形式。傅里葉變換是數(shù)字圖像處理技術的基礎,其通過在時域和頻域來回切換圖像,對圖像的信息特征 進行提取和分析。一維傅里葉變換及其反變換單變量連續(xù)函數(shù),f(x)的傅里葉變換F(u)定義為等式:u=0, 1, 2,,M1JS相反,給定F(,通過博里葉反變換可以萩得/(x)= f F(u)ej2jatxdi/J8這兩個等式組成了傅里時變換對,它指出在前一節(jié)中提到的重要事實,即 產(chǎn)(兒1,)二I* /(4,故一"''心%協(xié)類似地,反變摸為:/(

2、x/)= f I尸(小菽"向+口以調丫J00 J00單變量離散函數(shù)(其中冗二0, b 2,M 1)的傅里葉變換由以下等式給出m1 M-1尸二十Z/G上一.v=0同樣、給出F(u)、能用反DFT來獲得原函數(shù):/(.Y)二£尸(“卜八板”H =0x=Of L ,MT從政拉公式中得到:V - cos+ /sin得出:A/-1x-0| 3f-l=V5l&Xcos(2優(yōu))九H / sin( M M1=yM乙XKQOSltfX/ M -工-D2 mix1 sin 2 mix / M )lrf其中,u=0, 1, 2,,M 1。因此,我們看到傅里葉變換的每項即對于每個u 值,F(xiàn)(

3、u)的值由f(x)函數(shù)所有值的和組成。f(x)的值則與各種頻率的正弦值和余弦值 相乘。F(u)值的范圍覆蓋的域(u的值)稱為頻率域,因為u決定了變換的頻率成分(x 也作用于頻率,但它們相加,對每個 u值有相同的貢獻)。F(u)的M項中的每一個被 稱為變換的頻率分 量。使用術語 頻率域”和 頻率成分”與 時間域”和 時間成分”沒 有差別,如果x是一個時間變量,可以用它來表示 f(x)的域和值。二維DFT及其反變換一維離散傅里葉變換及其反變換向二維擴展是簡單明了的。一個圖像尺寸為MX N的函數(shù)f(x, y)的離散傅里葉變換由以下等式給出:M -1 N-l產(chǎn)(/)= /Z X /(%乎%-小仁W)M

4、N 工=o o像在一維中的情形一樣,此表達式必須對u值(u=0, 1, 2,,M-1)和v值(v=0,1, 2,,N-1)計算。同樣,給出F(u,v),可以通過反傅 里葉變換獲得,f(x, y), 由表 達式給出:.V1 1 N I/(X,J')= z z F(i口 w = 0 v = 0其中,x=0, 1, 2,,M-1, y=0, 1, 2,,N-1。變量u和v是變換或頻率變量,x和y是空間或圖像變量。正如在一維中的情形那樣,常量1/MN的位置并不重要, 有時它在反變換之前。其他時候,它被分為兩個相等的常數(shù)1/根號MN,分別乘在變換和反變換的式子前。定 義傅里葉譜、相角和頻率譜:而

5、八 y) = arc tan/()氏(#)并且其功率譜為:P(?/,v)=|F(z/,v)|2 二國"時 +Z(r/,v)2其中,R(u,v)和I(u,v)分別是F(u,v)的實部和虛部。通 常在進行傅里葉變換之前用(-1)x+y乘以輸入的圖像函數(shù)。由于指數(shù)的性 質,很 容易看出:F(h - M f 2.V - N / 2)其中Z 表示引文中的傅里葉變換。這個等式說明f(x,y)(-1)x+y傅 里葉變換的原點即 F(0,0)被設置在u =M/2和v=N/2上。換句話說,用(-1)x+y乘以f(x,y)將F(u,v)原點 變換到頻率坐標下的(M/2; N/2),它是二維DFT設置的M

6、X N區(qū)域的中心。我們 將此頻率域的范圍指定為頻率矩形,它從u=0到u=M-1從v=0到v=N-1(u和v是整數(shù))。為了確保移動后的坐標為整數(shù),要求 M和N為偶數(shù)。當在計算機中使用傅里 葉變換時,總和的范圍為u從1至ij M , v從1至ij N。實際的變換中心將為u=(M /2)+1 和 v=(N/2)十 1。當(u,v)=(0,0)時 的變換值為:尸(0,0) =MNM-lN-lZZ .仆)X-0 V-0 Bf即f(x,y)的 平均值。換句話說,如果f(x,y)是一幅圖像,在原點的傅里葉變換即等于 圖像的平均灰度級。因為在原點處常常為零,F(xiàn)(0,0)有時稱做頻率譜的直流成分。 了解了傅里葉

7、變化,下面看看為什么要在頻率域研究圖像增強。1 .可以利用頻率成分和圖像外表之間的對應關系。一些在空間域表述困難的增強任 務,在頻率域中變得非常普通。2 .濾波在頻率域更為直觀,它可以解釋空間域濾波的某些性質。3 .可以在頻率域指定濾波器,做反變換,然后在空間域使用結果濾波器作為空間域 濾波器的指導。4 .一旦通過頻率域試驗選擇了空間濾波,通常實施都在空間域進行。在 岡薩雷斯版 數(shù)字圖像處理 里 面的解釋就非常的形象:一個恰當?shù)谋扔魇菍⒏道锶~變換比作一個玻璃棱鏡。棱鏡是可以將光分解為不同顏色的物理儀器,每個成分的顏色由波長(或頻率)來決 定。傅里葉變換可以看作是數(shù)學上的棱鏡,將函數(shù)基于頻率分解

8、為不同的成分。當我們考慮光時,討論它 的光譜或頻率譜。同樣,傅立 葉變換使我們能通過頻率成分來分析一個函數(shù)。傅立葉變換在圖像處理中有非常非常的作用。因為不僅傅立葉分析涉及圖像處理的 很多方面,傅立葉的改進算法,比如離散余弦變換,gabor與小波在圖像處理中也有 重要的分量。傅立葉變換在圖像處理以下幾個話題都有重要作用:1 .圖像增強與圖像去噪絕大部分噪音都是圖像的高頻分量,通過低通濾波器來濾除高頻噪聲;邊緣也 是圖像的高頻分量,可以通過添加高頻分量來增強原始圖像的邊緣;2 .圖像分割之邊緣檢測提取圖像高頻分量3 .圖像特征提?。盒螤钐卣鳎焊道锶~描述子紋理特征:直接通過傅里葉系數(shù)來計算紋理特征其

9、他特征:將提取的特征值進行傅里葉變換來使特征具有平移、伸縮、旋轉不變性4 .圖像壓縮可以直接通過傅里葉系數(shù)來壓縮數(shù)據(jù); 常用的離散余弦變換是傅立葉變換的實變換;5 .信號在頻率域的表現(xiàn)在頻域中,頻率越大說明原始信號變化速度越快;頻率越小說明原始信號越平緩。當頻率為0時,表示直流信號,沒有變化。因此,頻率的大小反應了信號的變化快慢。高頻分量解釋信號的突變部分,而低頻分量決定信號的整體形象。在 圖像處理中,頻域反應了圖像在空域灰度變化劇烈程度,也就是圖像灰度的變化速度,也就是圖像的梯度大小。對圖像而言,圖像的邊緣部分是突變部分,變化較 快, 因此反應在頻域上是高頻分量;圖像的噪聲大部分情況下是高頻

10、部分;圖像平緩變化部分則為低頻分量。也就是說,傅立葉變換提供另外一個角度來觀察圖像,可以將圖像從灰度分布轉化到頻率分布上來觀察圖像的特征。書面一點說就是,傅里葉 變換提供了一條從空域到頻率自由轉換的途徑。對圖像處理而言,以下概念非 常的重要:圖像高頻分量:圖像突變部分;在某些情況下指圖像邊緣信息,某些情況 下指噪聲, 更多是兩者的混合;低頻分量:圖像變化平緩的部分,也就是圖像輪廓信息高通濾波器:讓圖像使低頻分量抑制,高頻分量通過低通濾波器:與高通相反,讓圖像使高頻分量抑制,低頻分量通過帶通濾波器:使圖像在某一部分 的頻率信息通過,其他過低或過高都抑制還有個帶阻濾波器,是帶通的反。6 .圖像去噪

11、圖像去噪就是壓制圖像的噪音部分。因此,如果噪音是高頻額,從頻域的角度來看, 就是需要用一個低通濾波器對圖像進行處理。通過低通濾波器可以抑制圖像的高頻 分量。但是這種情況下常常會造成邊緣信息的抑制。常見的去噪模板有均值模板, 高斯模板等。這兩種濾波器都是在局部區(qū)域抑制圖像的高頻分量,模糊圖像邊緣的 同時也抑制了噪聲。還有一種非線性濾波 -中值濾波器。中值濾波器對脈沖型噪聲有 很好的去掉。因為脈 沖點都是突變的點,排序以后輸出中值,那么那些最大點和最 小點就可以去掉了。中值濾波對高斯噪音效果較差。椒 鹽噪聲:對于椒鹽采用中值濾波可以很好的去除。 用均值也可以取得一定的效果, 但是會引起邊緣的模糊。

12、高 斯白噪聲:白噪音在整個頻域的都有分布,好像比較困難。7 .圖像增強有時候感覺圖像增強與圖像去噪是一對矛盾的過程,圖像增強經(jīng)常是需要增強圖像的邊緣,以獲得更好的顯示效果,這就需要增加圖像的高頻分量。而圖像去噪是為 了消除圖像的噪音,也就是需要抑制高頻分量。有時候這兩個又是指類似的事情。比如說,消除噪音的同時圖像的顯示效果顯著的提升了, 那么,這時候就是同樣的 意思了。常見的圖像增強方法有對比度拉伸,直方圖均衡化,圖像銳化等。前面兩個是在空 域進行基于像素點的變換,后面一個是在頻域處理。我理解的銳化就是直接在圖像 上加上圖像高通濾波后的分量,也就是圖像的邊緣效果。對比度拉伸和直方圖均衡 化都是

13、為了提高圖像的對比度,也就是使圖像看起來差異更明顯一些,我想,經(jīng)過 這樣的處理以后,圖像也應 該增強了圖像的高頻分量,使得圖像的細節(jié)上差異更大。 同時也引入了一些噪音。最后討論一下圖像傅立葉變換的物理意義圖像的頻率是表征圖像中灰度變化劇烈程度的指標,是灰度在平面空間上的梯度。如:大面積的沙漠在圖像中是一片灰度變化緩慢的區(qū)域,對應的頻率值很低;而對于地表屬性變換劇烈的邊緣區(qū)域在圖像中是一片灰度變化劇烈的區(qū)域,對應的頻率值 較高。傅立葉變換在實際中有非常明顯的物理意義,設f是一個能量有限的模擬信號,則其傅立葉變換就表示f的譜。從純粹的數(shù)學意義上看,傅立葉變換是將一個 函數(shù)轉換為一系列周期函數(shù)來處理

14、的。從物理效果看,傅立葉變換是將圖像從空間 域轉換到頻率域,其逆變換是將 圖像從頻率域轉換到空間域。 換句話說,傅立葉變 換的物理意義是將圖像的灰度分布函數(shù)變換為圖像的頻率分布函數(shù),傅立葉逆變換 是將圖像的頻率分布函數(shù)變換為 灰度分布函數(shù)。最后附上傅里葉變換的一個例子通過上面的DFT變換可以看到:圖像信號能量將集中在系數(shù)矩陣的四個角上。這是由二維傅立葉變換本身性質決定的。同時也表明一股圖像能量集中低頻區(qū)域。DFT原點居中經(jīng)過變換之后的圖像在原點平移之前四角是低頻,最亮,平移之后中間部分是低頻,最亮,亮度大說明低頻的能量大。傅立葉變換在圖像處理中有非常非常的作用。因為不僅傅立葉分析涉及圖像處理的

15、很多方面,傅立葉的改進算法,比如離散余弦變換,gabor與小波在圖像處理中也有重要的分量。印象中,傅立葉變換在圖像處理以下幾個話題都有重要作用:1 .圖像增強與圖像去噪絕大部分噪音都是圖像的高頻分量,通過低通濾波器來濾除高頻噪聲;邊緣也是圖像的高頻分量,可以通過添加高頻分量來增強原始圖像的邊緣;2 .圖像分割之邊緣檢測提取圖像高頻分量3 .圖像特征提?。盒螤钐卣鳎焊道锶~描述子紋理特征:直接通過傅里葉系數(shù)來計算紋理特征其他特征:將提取的特征值進行傅里葉變換來使特征具有平移、伸縮、旋轉不變性4 .圖像壓縮可以直接通過傅里葉系數(shù)來壓縮數(shù)據(jù); 常用的離散余弦變換是傅立葉變換的實變換;傅立葉變換傅里葉變

16、換是將時域信號分解為不同頻率的正弦信號或余弦函數(shù)疊加之和。連續(xù)情 況下要求原始信號在一個周期內(nèi)滿足絕對可積條件。離散情況下,傅里葉變換一定 存在。岡薩雷斯版 圖像處理里面的解釋非常形象:一個恰當?shù)谋扔魇菍⒏道锶~變 換比作一個玻璃棱鏡。棱鏡是可以將光分解為不同顏色的物理儀器,每個成分的顏 色由波長(或頻率)來決定。傅里葉變換可以看作是數(shù)學上的棱鏡,將函數(shù)基于頻 率分解為不同的成分。當我們考慮光時,討論它的光譜或頻率譜。同樣,傅立葉變換使 我們能通過頻率成分來分析一個函數(shù)。傅立葉變換有很多優(yōu)良的性質。比如線性,對稱性(可以用在計算信號的傅里葉變 換里面);時移性:函數(shù)在時域中的時移,對應于其在頻率

17、域中附加產(chǎn)生的相移,而幅度頻譜 則保持不變;頻移性:函數(shù)在時域中乘以eAjwt,可以使整個頻譜搬移 wo這個也叫調制定理,通 訊里面信號的頻分復用需要用到這個特性(將不同的信號調制到不同的頻段上同時 傳輸);卷積定理:時域卷積等于頻域乘積; 時域乘積等于頻域卷積(附加一個系數(shù))。(性 像處理里面這個是個重點)信號在頻率域的表現(xiàn)在頻域中,頻率越大說明原始信號變化速度越快;頻率越小說明原始信號越平緩。 當頻率為0時,表示直流信號,沒有變化。因此,頻率的大小反應了信號的變化快 慢。高頻分量解釋信號的突變部分,而低頻分量決定信號的整體形象。在圖像處理中,頻域反應了圖像在空域灰度變化劇烈程度,也就是圖像

18、灰度的變化 速度,也就是圖像的梯度大小。對圖像而言,圖像的邊緣部分是突變部分,變化較 快,因此反應在頻域上是高頻分量;圖像的噪聲大部分情況下是高頻部分;圖像平 緩變化部分則為低頻分量。也就是說,傅立葉變換提供另外一個角度來觀察圖像, 可以將圖像從灰度分布轉化到頻率分布上來觀察圖像的特征。書面一點說就是,傅 里葉變換提供了一條從空域到頻率自由轉換的途徑。對圖像處理而言,以下概念非 常的重要:圖像高頻分量:圖像突變部分;在某些情況下指圖像邊緣信息,某些情況下指噪聲, 更多是兩者的混合;低頻分量:圖像變化平緩的部分,也就是圖像輪廓信息 高通濾波器:讓圖像使低頻分量抑制,高頻分量通過 低通濾波器:與高

19、通相反,讓圖像使高頻分量抑制,低頻分量通過 帶通濾波器:使圖像在某一部分的頻率信息通過,其他過低或過高都抑制 還有個帶阻濾波器,是帶通的反。模板運算與卷積定理在時域內(nèi)做模板運算,實際上就是對圖像進行卷積。模板運算是圖像處理一個很重要的處理過程,很多圖像處理過程,比如增強 /去噪(這兩個分不清楚),邊緣檢測 中普遍用到。根據(jù)卷積定理,時域卷積等價與頻域乘積。因此,在時域內(nèi)對圖像做 模板運算就等效于在頻域內(nèi)對圖像做濾波處理。比如說一個均值模板,其頻域響應為一個低通濾波器;在時域內(nèi)對圖像作均值濾波 就等效于在頻域內(nèi)對圖像用均值模板的頻域響應對圖像的頻域響應作一個低通濾波。圖像去噪圖像去噪就是壓制圖像

20、的噪音部分。 因此,如果噪音是高頻額,從頻域的角度來看, 就是需要用一個低通濾波器對圖像進行處理。通過低通濾波器可以抑制圖像的高頻 分量。但是這種情況下常常會造成邊緣信息的抑制。常見的去噪模板有均值模板, 高斯模板等。這兩種濾波器都是在局部區(qū)域抑制圖像的高頻分量,模糊圖像邊緣的同時也抑制了噪聲。還有一種非線性濾波 -中值濾波器。中值濾波器對脈沖型噪聲有 很好的去掉。因為脈沖點都是突變的點,排序以后輸出中值,那么那些最大點和最 小點就可以去掉了。中值濾波對高斯噪音效果較差。椒鹽噪聲:對于椒鹽采用中值濾波可以很好的去除。 用均值也可以取得一定的效果, 但是會引起邊緣的模糊。高斯白噪聲:白噪音在整個

21、頻域的都有分布,好像比較困難。岡薩雷斯版圖像處理P185:算術均值濾波器和幾何均值濾波器 (尤其是后者)更適 合于處理高斯或者均勻的隨機噪聲。諧波均值濾波器更適合于處理脈沖噪聲。圖像增強有時候感覺圖像增強與圖像去噪是一對矛盾的過程,圖像增強經(jīng)常是需要增強圖像 的邊緣,以獲得更好的顯示效果,這就需要增加圖像的高頻分量。而圖像去噪是為 了消除圖像的噪音,也就是需要抑制高頻分量。有時候這兩個又是指類似的事情。 比如說,消除噪音的同時圖像的顯示效果顯著的提升了,那么,這時候就是同樣的 意思了。常見的圖像增強方法有對比度拉伸,直方圖均衡化,圖像銳化等。前面兩個是在空 域進行基于像素點的變換,后面一個是在

22、頻域處理。我理解的銳化就是直接在圖像 上加上圖像高通濾波后的分量,也就是圖像的邊緣效果。對比度拉伸和直方圖均衡 化都是為了提高圖像的對比度,也就是使圖像看起來差異更明顯一些,我想,經(jīng)過 這樣的處理以后,圖像也應該增強了圖像的高頻分量,使得圖像的細節(jié)上差異更大。 同時也引入了一些噪音。* /函數(shù)名稱:* LowPassFilter()* /輸入?yún)?shù):* LPSTR IpDIBBits - 指向需要濾波的圖像像素指針* int nWidth - 數(shù)據(jù)寬度* int nHeight - 數(shù)據(jù)高度* int nRadius -理想低通濾波的濾波半徑* /返回值:BOOL/成功返回TRUE ,否則返回F

23、ALSE* /說明:lpD舊Bits是指向需要濾波的圖像像素指針。經(jīng)過低通濾波的數(shù)據(jù)仍然存儲在IpDIBBits當中。*/BOOL LowPassFilter(LPSTR IpDIBBits, LONG nWidth, LONG nHeight,int nRadius) unsigned char* IpSrc; /指向源圖像的指針int y ;/循環(huán)控制變量double dTmpOne ;double dTmpTwo ;int nTransWidth ;int nTransHeight;double unchValue;int x ;/循環(huán)控制變量/存放臨時變量/存放臨時變量/傅立葉變換的寬

24、度(2的整數(shù)次曷)/傅立葉變換的高度(2的整數(shù)次曷)/存貯圖像各像素灰度的臨時變量指向時域數(shù)據(jù)的指針指向頻域數(shù)據(jù)的指針complex<double> * pCTData ;/complex<double> * pCFData ;/計算進行傅立葉變換的點數(shù)-橫向(2的整數(shù)次曷)dTmpOne = log(nWidth)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo);nTransWidth = (int) dTmpTwo;/計算進行傅立葉變換的點數(shù)-縱向(2的整數(shù)次曷)dTmpOne = log(nHeigh

25、t)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo);nTransHeight = (int) dTmpTwo;double dReal;/ 傅立葉變換的實部double dImag;/ 傅立葉變換的虛部/低通濾波的半徑不能超過頻域的最大半徑if(nRadius> (nTransWidth/2) | nRadius> (nTransHeight/2)return (false); / 返回 FALSE pCTData二new complex<double>nTransWidth * nTransHeight

26、; /分配內(nèi)存pCFData二new complex<double>nTransWidth * nTransHeight; /分配內(nèi)存/圖像數(shù)據(jù)的寬和高不一定是2的整數(shù)次曷,所以pCTData有一部分數(shù)據(jù)需要補0for(y=0; yvnTransHeight; y+) for(x=0; x<nTransWidth; x+) pCTDatay*nTransWidth + x=complex<double>(0,0); / 補零 把圖像數(shù)據(jù)傳給pCTDatafor(y=0; yvnHeight; y+) for(x=0; x<nWidth; x+) /指向DIB

27、第y行,第x個象素的指針I(yè)pSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex<double>(unchValue,0); FFT_2D(pCTData, nWidth, nHeight, pCFData) ; /傅立葉正變換for(x=0;x<nTransWidth;x+) / 開始實施理想的低通濾波 for(y=nRadius;y<nTransHeight-nRadius;y+) /把縱

28、向所有大于nRadius2的高頻分量設置為0pCFDatax*nTransHeight + y=complex<double>(0,0); for(x=nRadius;x<nTransWidth-nRadius;x+) for(y=0;y<nTransHeight;y+)/把橫向所有大于nRadiusI的高頻分量設置為0pCFDatax*nTransHeight + y=complex<double>(0,0); IFFT_2D(pCFData, pCTData,nHeight, nWidth); / 經(jīng)過低通濾波的圖象進行反 變換for(y=0; y<

29、;nHeight; y+)/反變換的數(shù)據(jù)傳給 IpDIBBitsfor(x=0; x<nWidth; x+) /需要考慮信號的正負問題以及實際所用的圖象數(shù)據(jù)是灰度值還是原始數(shù)據(jù)dReal = pCTDatay*nTransWidth + x.real() ; / 實部dImag = pCTDatay*nTransWidth + x.imag() ; / 虛部unchValue 二dReal;/指向DIB第y行,第x個象素的指針lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*lpSrc 二unchVal

30、ue ; delete pCTData;/ 釋放內(nèi)存delete pCFData;/ 釋放內(nèi)存pCTData = NULL;pCFData = NULL;return (true);/返回結果/* /函數(shù)名稱:* ButterWorthLowPass()* /輸入?yún)?shù):* LPSTR lpD舊Bits -指向需要濾波的圖像像素指針* int nWidth - 數(shù)據(jù)寬度* int nHeight - 數(shù)據(jù)高度* int nRadius - ButterWorth 低通濾波的"半功率"點* /返回值:* BOOL /成功返回TRUE ,否則返回FALSE。* /說明:* pDI

31、BBits是指向需要濾波的圖像像素指針。*經(jīng)過ButterWorth低通濾波的數(shù)據(jù)仍然存儲在IpDIBBits當中*/BOOL ButterWorthLowPass(LPSTR IpDIBBits, LONG nWidth, LONG nHeight, int nRadius) unsigned char* IpSrc; /指向源圖像的指針int y ;/循環(huán)控制變量int x ;/循環(huán)控制變量double dTmpOne ;/存放臨時變量double dTmpTwo ;/ 存放臨時變量double H ;/ ButterWorth濾波系數(shù)int nTransWidth ;/傅立葉變換的寬度(

32、2的整數(shù)次曷)int nTransHeight; / 傅立葉變換的高度(2的整數(shù)次曷) double dReal ;/ 傅立葉變換的實部double dImag;/ 傅立葉變換的虛部double unchValue; /存貯圖像各像素灰度的臨時變量complex<double> * pCTData ;/指向時域數(shù)據(jù)的指針complex<double> * pCFData ;/指向頻域數(shù)據(jù)的指針/計算進行傅立葉變換的點數(shù)-橫向(2的整數(shù)次曷)dTmpOne = log(nWidth)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow

33、(2,dTmpTwo);nTransWidth = (int) dTmpTwo;/計算進行傅立葉變換的點數(shù)-縱向(2的整數(shù)次曷)dTmpOne = log(nHeight)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo);nTransHeight = (int) dTmpTwo;/低通濾波的半徑不能超過頻域的最大半徑if(nRadius> (nTransWidth/2) | nRadius> (nTransHeight/2)return (false); / 返回 FALSE分配內(nèi)存分配內(nèi)存部分數(shù)據(jù)需要補pCTData

34、二new complex<double>nTransWidth * nTransHeight; /pCFData二new complex<double>nTransWidth * nTransHeight; /圖像數(shù)據(jù)的寬和高不一定是2的整數(shù)次曷,所以pCTData有0for(y=0; yvnTransHeight; y+)for(x=0; x<nTransWidth; x+)pCTDatay*nTransWidth + x=complex<double>(0,0); / 補零for(y=0; yvnHeight; y+)/把圖像數(shù)據(jù)傳給 pCTDat

35、afor(x=0; x<nWidth; x+)/指向DIB第y行,第x個象素的指針I(yè)pSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex<double>(unchValue,0); FFT_2D(pCTData, nWidth, nHeight, pCFData) ; /傅立葉正變換for(y=0; y<nTransHeight; y+)/開始實施 ButterWorth 低通濾波for(x

36、=0; x<nTransWidth; x+)H = (double)(y*y+x*x);H = H / (nRadius * nRadius);H = 1/(1+H); 求 H 值pCFDatay*nTransWidth + x=complex<double>(pCFDatay*nTransWidth + x.real()*H,pCFDatay*nTransWidth + x.imag()*H); /經(jīng)過ButterWorth低通濾波的圖象進行反變換IFFT_2D(pCFData, pCTData, nWidth, nHeight);for(y=0; y<nHeight

37、; y+)/反變換的數(shù)據(jù)傳給 IpDIBBitsfor(x=0; x<nWidth; x+) dReal = pCTDatay*nTransWidth + x.real();dImag = pCTDatay*nTransWidth + x.imag();unchValue = max(0,min(255,sqrt(dReal*dReal+dImag*dImag);/指向DIB第y行,第x個象素的指針I(yè)pSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*IpSrc 二unchValue ;delete pCT

38、Data;/ 釋放內(nèi)存delete pCFData;/ 釋放內(nèi)存pCTData = NULL;pCFData = NULL;return (true); / 返回結果/* /函數(shù)名稱:* GaussLowPass()* /輸入?yún)?shù):* LPSTR lpD舊Bits -指向需要濾波的圖像像素指針* int nWidth - 數(shù)據(jù)寬度* int nHeight - 數(shù)據(jù)高度* int nRadius - Gauss 低通濾波的"半功率"點* /返回值:* BOOL /成功返回TRUE ,否則返回FALSE。* /說明:* pDIBBits是指向需要濾波的圖像像素指針。*經(jīng)過Ga

39、uss低通濾波的數(shù)據(jù)仍然存儲在IpDIBBits當中。 */ BOOL GaussLowPass(LPSTR IpDIBBits, LONG nWidth, LONG nHeight, int nRadius) unsigned char* IpSrc; /指向源圖像的指針int y ;/循環(huán)控制變量int x ;/循環(huán)控制變量double dTmpOne ;/存放臨時變量double dTmpTwo ;/ 存放臨時變量double H ;/ ButterWorth 濾波系數(shù)int nTransWidth ;/ 傅立葉變換的寬度(2的整數(shù)次曷)int nTransHeight; /傅立葉變換的

40、高度(2的整數(shù)次曷)double dReal ;/ 傅立葉變換的實部double dImag;/ 傅立葉變換的虛部double unchValue; / 存貯圖像各像素灰度的臨時變量 complex<double> * pCTData ;/指向時域數(shù)據(jù)的指針complex<double> * pCFData ;/指向頻域數(shù)據(jù)的指針/計算進行傅立葉變換的點數(shù)-橫向(2的整數(shù)次曷)dTmpOne = log(nWidth)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo); nTransWidth = (int)

41、 dTmpTwo;/計算進行傅立葉變換的點數(shù)-縱向(2的整數(shù)次曷)dTmpOne = log(nHeight)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo); nTransHeight = (int) dTmpTwo;/低通濾波的半徑不能超過頻域的最大半徑if(nRadius> (nTransWidth/2) | nRadius> (nTransHeight/2) return (false); / 返回 FALSE pCTData二new complex<double>nTransWidth * nTr

42、ansHeight; /分配內(nèi)存pCFData二new complex<double>nTransWidth * nTransHeight; /分配內(nèi)存/圖像數(shù)據(jù)的寬和高不一定是2的整數(shù)次曷,所以pCTData有一部分數(shù)據(jù)需要補0for(y=0; yvnTransHeight; y+) for(x=0; x<nTransWidth; x+) 補零pCTDatay*nTransWidth + x=complex<double>(0,0); /for(y=0; y<nHeight; y+)/把圖像數(shù)據(jù)傳給 pCTDatafor(x=0; x<nWidth;

43、 x+)/指向DIB第y行,第x個象素的指針I(yè)pSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchValue = *lpSrc;pCTDatay*nTransWidth + x=complex<double>(unchValue,0);FFT_2D(pCTData, nWidth, nHeight, pCFData) ; /傅立葉正變換for(y=0; y<nTransHeight; y+)/ 開始實施 Gauss 低通濾波for(x=0; x<nTransWidth; x+)H =

44、 (double)(y*y+x*x);H = H / (2 * nRadius * nRadius);H = exp (-H); 求 H 值pCFDatay*nTransWidth + x=complex<double>(pCFDatay*nTransWidth + x.real()*H,pCFDatay*nTransWidth + x.imag()*H);/經(jīng)過Gauss低通濾波的圖象進行反變換IFFT_2D(pCFData, pCTData, nWidth, nHeight);for(y=0; y<nHeight; y+)/反變換的數(shù)據(jù)傳給 IpDIBBitsfor(x=

45、0; x<nWidth; x+)dReal = pCTDatay*nTransWidth + x.real();dImag = pCTDatay*nTransWidth + x.imag();unchValue = max(0,min(255,sqrt(dReal*dReal+dImag*dImag);/指向DIB第y行,第x個象素的指針I(yè)pSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*lpSrc 二unchValue ; delete pCTData;/釋放內(nèi)存delete pCFData;/釋放內(nèi)存

46、pCTData = NULL;pCFData = NULL; return (true); / 返回結果/* /函數(shù)名稱:* HighPassFilter()* /輸入?yún)?shù):* LPSTR lpDIBBits -指向需要濾波的圖像像素指針* int nWidth - 數(shù)據(jù)寬度* int nHeight- 數(shù)據(jù)高度* int nRadius- 理想高通濾波的濾波半徑* /返回值:* BOOL /成功返回TRUE ,否則返回FALSE。* /說明:* lpDIBBits是指向需要濾波的圖像像素指針。* 經(jīng)過高通濾波的數(shù)據(jù)仍然存儲在lpDIBBits當中。*/BOOL HighPassFilter(

47、LPSTR lpDIBBits, LONG nWidth, LONG nHeight,int nRadius) unsigned char* lpSrc; /指向源圖像的指針int y ;/循環(huán)控制變量double dTmpOne ;double dTmpTwo ;int nTransWidth ;int nTransHeight;double unchValue;int x ;/循環(huán)控制變量/存放臨時變量/存放臨時變量/傅立葉變換的寬度(2的整數(shù)次曷)/傅立葉變換的高度(2的整數(shù)次曷)/存貯圖像各像素灰度的臨時變量指向時域數(shù)據(jù)的指針指向頻域數(shù)據(jù)的指針(2的整數(shù)次曷)(2的整數(shù)次曷)compl

48、ex<double> * pCTData ; / complex<double> * pCFData ; / /計算進行傅立葉變換的點數(shù)橫向dTmpOne = log(nWidth)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo);nTransWidth = (int) dTmpTwo;/計算進行傅立葉變換的點數(shù)縱向dTmpOne = log(nHeight)/log(2);dTmpTwo = ceil(dTmpOne);dTmpTwo = pow(2,dTmpTwo);nTransHeight = (in

49、t) dTmpTwo;double dReal;/ 傅立葉變換的實部double dImag;/ 傅立葉變換的虛部/濾波的半徑不能超過頻域的最大半徑if(nRadius>nTransWidth-1 | nRadius>nTransHeight-1)return (false); / 返回 false分配內(nèi)存分配內(nèi)存部分數(shù)據(jù)需要補pCTData二new complex<double>nTransWidth * nTransHeight; /pCFData二new complex<double>nTransWidth * nTransHeight; /圖像數(shù)據(jù)的

50、寬和高不一定是 2的整數(shù)次曷,所以pCTData有 for(y=0; yvnTransHeight; y+)for(x=0; x<nTransWidth; x+)補零pCTDatay*nTransWidth + x=complex<double>(0,0); / for(y=0; y<nHeight; y+)/把圖像數(shù)據(jù)傳給 pCTDatafor(x=0; x<nWidth; x+) /指向DIB第y行,第x個象素的指針I(yè)pSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;unchVa

51、lue = *lpSrc;pCTDatay*nTransWidth + x=complex<double>(unchValue,0);FFT_2D(pCTData, nWidth, nHeight, pCFData) ; /傅立葉正變換for(x=0;x<nTransWidth;x+) /開始實施理想的高通濾波 for(y=0;y<nRadius;y+) 把縱向所有小于nRadius的低頻分量設置為0pCFDatax*nTransHeight + y=complex<double>(0,0);for(y二nTransHeight-1-nRadius;y<

52、;nTransHeight;y+) pCFDatax*nTransHeight + y=complex<double>(0,0);for(x=0;x<nRadius;x+)把橫向所有小于nRadius的低頻分量設置為0 for(y=0;y<nTransHeight;y+)pCFDatax*nTransHeight + y=complex<double>(0,0); for(x=nTransWidth-nRadius;x<nTransWidth;x+) for(y=0;y<nTransHeight;y+) pCFDatax*nTransHeight

53、 + y=complex<double>(0,0); IFFT_2D(pCFData, pCTData,nHeight, nWidth); /經(jīng)過高通濾波的圖象進行反變換for(y=0; y<nHeight; y+)/反變換的數(shù)據(jù)傳給 IpDIBBitsfor(x=0; x<nWidth; x+) /需要考慮信號的正負問題以及實際所用的圖象數(shù)據(jù)是灰度值還是原始數(shù)據(jù)dReal = pCTDatay*nTransWidth + x.real();dImag = pCTDatay*nTransWidth + x.imag();unchValue 二dReal;/指向DIB第y行,第x個象素的指針lpSrc = (unsigned char*)lpDIBBits + nWidth * (nHeight - 1 - y) + x;*lpSrc 二unchValue ; delete pCTData;/ 釋放內(nèi)存delete pCFData;/ 釋放內(nèi)存pCTData = NULL;pCFData = NULL;return (true);/ 返回結果/* /函數(shù)名稱:* ButterWorthHighPa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論