在計算機視覺中,有一個經(jīng)典的變換被廣泛使用——傅里葉變換。傅里葉變換是將時間域上的信號轉(zhuǎn)變?yōu)轭l率域上的信號,進而進行圖像去噪、圖像增強等處理。
一、時域與頻域
什么是時域(Time domain)?從我們出生,我們看到的世界都以時間貫穿,股票的走勢、人的身高、汽車的軌跡都會隨著時間發(fā)生改變。這種以時間作為參照來觀察動態(tài)世界的方法我們稱其為時域分析。而我們也想當然的認為,世間萬物都在隨著時間不停的改變,并且永遠不會靜止下來。
什么是頻域(Frequency domain)?頻域是描述信號在頻率方面特性時用到的一種坐標系。用線性代數(shù)的語言就是裝著正弦函數(shù)的空間。頻域最重要的性質(zhì)是:它不是真實的,而是一個數(shù)學構(gòu)造。頻域是一個遵循特定規(guī)則的數(shù)學范疇。正弦波是頻域中唯一存在的波形,這是頻域中最重要的規(guī)則,即正弦波是對頻域的描述,因為時域中的任何波形都可用正弦波合成。
對于一個信號來說,信號強度隨時間的變化規(guī)律就是時域特性,信號是由哪些單一頻率的信號合成的就是頻域特性。
時域分析與頻域分析是對信號的兩個觀察面。時域分析是以時間軸為坐標表示動態(tài)信號的關(guān)系;頻域分析是把信號變?yōu)橐灶l率軸為坐標表示出來。一般來說,時域的表示較為形象與直觀,頻域分析則更為簡練,剖析問題更為深刻和方便。目前,信號分析的趨勢是從時域向頻域發(fā)展。然而,它們是互相聯(lián)系,缺一不可,相輔相成的。貫穿時域與頻域的方法之一,就是傳說中的傅里葉分析。傅里葉分析可分為傅里葉級數(shù)(Fourier Serie)和傅里葉變換(Fourier Transformation)。
二、傅里葉級數(shù)
傅里葉級數(shù)是一種對周期信號進行分解的方式。
如下圖所示,左上角為正弦方波,余下為通過不同的正弦諧波數(shù)可以去擬合這個方波結(jié)果。
可以看到,疊加的諧波信號越多時,越接近于方波信號。
傅里葉級數(shù)由法國數(shù)學家傅里葉提出,即滿足條件(狄利克雷條件)的任何周期函數(shù)可以由一系列不同頻率的正弦(余弦)函數(shù)疊加而成。這種相加形式又稱為級數(shù),所以也稱為傅里葉級數(shù)。
三、傅里葉變換
那么對信號的不同頻率進行分解有什么好處呢?
如下圖所示,從時域上看,最下方疊加得到的信號是很難分析出里面蘊含的頻率信息的。
而通過傅里葉分解后,如下圖右圖所示,可以很容易地觀察到頻率的有無和幅度的大?。ㄏ辔灰灿袑南辔蛔V,這里沒有列出)。
因此,通過傅里葉變換將某一信號分解為不同頻率的信號,可以很容易地對信號中的某一段頻段進行觀察和操作。
3.1 傅里葉變換分類
根據(jù)原信號的不同類型,我們可以把傅立葉變換分為四種類別:
- 非周期性連續(xù)信號(傅立葉變換(Fourier Transform))
- 周期性連續(xù)信號(傅立葉級數(shù)(Fourier Series))
- 非周期性離散信號(離散時域傅立葉變換(Discrete Time Fourier Transform))
- 周期性離散信號(離散傅立葉變換(Discrete Fourier Transform))
這四種傅立葉變換都是針對正無窮大和負無窮大的信號,即信號的的長度是無窮大的,我們知道這對于計算機處理來說是不可能的,那么有沒有針對長度有限的傅立葉變換呢?沒有。因為正余弦波被定義成從負無窮小到正無窮大,我們無法把一個長度無限的信號組合成長度有限的信號。
面對這種困難,方法是把長度有限的信號表示成長度無限的信號,可以把信號無限地從左右進行延伸,延伸的部分用零來表示,這樣,這個信號就可以被看成是非周期性離散信號,我們就可以用到離散時域傅立葉變換的方法。還有,也可以把信號用復制的方法進行延伸,這樣信號就變成了周期性離散信號,這時我們就可以用離散傅立葉變換方法進行變換。
但是對于非周期性的信號,我們需要用無窮多不同頻率的正弦曲線來表示,這對于計算機來說是不可能實現(xiàn)的,因為在計算機中只有離散的和有限長度的數(shù)據(jù)才能被處理。所以對于離散信號的變換只有離散傅立葉變換(DFT)才能被適用,對于其它的變換類型只有在數(shù)學演算中才能用到,在計算機中我們只能用DFT方法。
3.2 一維傅里葉公式
其中,ω 表示頻率, t 表示時間, 它將頻率域的函數(shù)表示為時間域函數(shù) f(t) 的積分。
3.3 二維離散傅里葉變換
我們知道,灰度圖像是由二維的離散的點構(gòu)成的。二維離散傅里葉變換(Two-Dimensional Discrete Fourier Transform)常用于圖像處理中,對圖像進行傅里葉變換后得到其頻譜圖。頻譜圖中頻率高低表征圖像中灰度變化的劇烈程度。圖像中邊緣和噪聲往往是高頻信號,而圖像背景往往是低頻信號。我們在頻率域內(nèi)可以很方便地對圖像的高頻或低頻信息進行操作,完成圖像去噪,圖像增強,圖像邊緣提取等操作。
對二維圖像進行傅里葉變換公式如下:
其中,圖像長 M,高 N。F(u,v)表示頻域圖像,f(x,y)表示時域圖像。u 的范圍為[0,M-1],v 的范圍為[0,N-1]。
對二維圖像進行傅里葉逆變換公式如下:
其中,圖像長 M,高 N。f(x,y)表示時域圖像,F(xiàn)(u,v)表示頻域圖像。x 的范圍為[0,M-1],y 的范圍為[0,N-1]。
四、OpenCV中傅里葉變換的應用
4.1 傅里葉變換
代碼如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
img = cv2.imread('lenna.jpg', 0)
# 傅里葉變換
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
# 將頻譜低頻從左上角移動至中心位置
dft_shift = np.fft.fftshift(dft)
# 頻譜圖像雙通道復數(shù)轉(zhuǎn)換為0-255區(qū)間
result = 20*np.log(cv2.magnitude(dft_shift[:,:,0], dft_shift[:,:,1]))
# 顯示圖像
plt.subplot(121), plt.imshow(img, cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(result, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()
效果如下:
4.2 傅里葉逆變換
代碼如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 讀取圖像
img = cv2.imread('lenna.jpg', 0)
# 傅里葉變換
dft = cv2.dft(np.float32(img), flags = cv2.DFT_COMPLEX_OUTPUT)
dftshift = np.fft.fftshift(dft)
res1= 20*np.log(cv2.magnitude(dftshift[:,:,0], dftshift[:,:,1]))
# 傅里葉逆變換
ishift = np.fft.ifftshift(dftshift)
iimg = cv2.idft(ishift)
res2 = cv2.magnitude(iimg[:,:,0], iimg[:,:,1])
# 顯示圖像
plt.subplot(131), plt.imshow(img, 'gray'), plt.title('Original Image')
plt.axis('off')
plt.subplot(132), plt.imshow(res1, 'gray'), plt.title('Fourier Image')
plt.axis('off')
plt.subplot(133), plt.imshow(res2, 'gray'), plt.title('Inverse Fourier Image')
plt.axis('off')
plt.show()
效果如下:文章來源:http://www.zghlxwxcb.cn/news/detail-780340.html
源碼倉庫地址
??圖像處理、機器學習的常用算法匯總文章來源地址http://www.zghlxwxcb.cn/news/detail-780340.html
到了這里,關(guān)于傅里葉變換的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!