按照某度的解釋?zhuān)盗⑷~變換,是表示能將滿(mǎn)足一定條件的某個(gè)函數表示成三角函數(正弦和/或余弦函數)或者它們的積分的線(xiàn)性組合。在不同的研究領(lǐng)域,傅立葉變換具有多種不同的變體形式,如連續傅立葉變換和離散傅立葉變換。最初傅立葉分析是作為熱過(guò)程的解析分析的工具被提出的。其公式是一個(gè)連續積分函數:
公式描述:公式中F(ω)為f(t)的像函數,f(t)為F(ω)的像原函數。
原理解析
拋開(kāi)復雜的公式推導簡(jiǎn)單來(lái)說(shuō),傅立葉變換的實(shí)際意義就是對一個(gè)指定的信號曲線(xiàn),可以使用傅立葉變換的方法對其進(jìn)行分解重組,其目的就是將復雜問(wèn)題簡(jiǎn)單化處理,再將處理后的結果綜合起來(lái)考慮。
具體操作就是將一個(gè)信號曲線(xiàn)分解成若干個(gè)正弦曲線(xiàn),這些正弦的頻率代表了原信號曲線(xiàn)的頻率變化情況,總的來(lái)說(shuō)就是對原來(lái)信號曲線(xiàn)上的不同頻率的信號進(jìn)行分門(mén)別類(lèi),同一頻率下的信號被分到了一個(gè)正弦曲線(xiàn)上,這樣就有了若干個(gè)不同頻率的正弦曲線(xiàn)了,而這些正弦曲線(xiàn)中,有些是我們需要的信息,而有些是不需要的信息。
相對原始的信號,分解后的若干正弦曲線(xiàn)的信號是非常容易處理的,比如我們需要去除指定頻段的信號,在原信號曲線(xiàn)上是比較難實(shí)現的,但是在分解后的若干正弦曲線(xiàn)中就變得非常容易,我們要做的只需要對這些正弦曲線(xiàn)按照頻率大小進(jìn)行排序,然后刪除掉不需要的頻段曲線(xiàn)即可,當然,操作完之后要記得將分解處理完后剩下的正弦曲線(xiàn)信號合并成原始的信號,這種操作被稱(chēng)為傅立葉逆變換或者逆傅立葉變換。
以語(yǔ)音信號為例,一般我們接觸到的信號是一幅基于時(shí)間序列的音頻聲波圖,也稱(chēng)為時(shí)域圖。聲音是介質(zhì)振動(dòng)在聽(tīng)覺(jué)系統中產(chǎn)生的反應。聲音總可以被分解為不同頻率不同強度正弦波的疊加(傅里葉變換)。聲音有兩個(gè)基本的物理屬性:頻率與振幅。聲音的振幅就是音量,頻率的高低就是指音調,頻率用赫茲(Hz)作單位。人耳只能聽(tīng)到20Hz到20khz范圍的聲音。
音頻圖上波峰的高低象征著(zhù)聲音的振幅大小,從物理角度解釋?zhuān)穹褪锹晭x原來(lái)位置的大小,聲帶偏離原來(lái)的位置越大,則聲音越大,波峰越高的地方意味著(zhù)音頻的振幅越高,也就是音量越大。而頻率就是聲帶在單位時(shí)間內振動(dòng)的次數,在音頻圖上可以看作是一個(gè)周期,頻率越高,就意味著(zhù)聲帶振動(dòng)的次數越多,也就是音調越高。
直接時(shí)域上的音頻圖進(jìn)行處理比較麻煩,所以一般會(huì )先將時(shí)域圖按照不同的頻率振幅分解成若干個(gè)音頻和振幅不同的音頻信號圖。再將這些不同的信號圖按照不同的振幅映射到一個(gè)平面圖上,就是我們所說(shuō)的頻域圖。

傅立葉變換對于信號的處理主要作用是將信號從時(shí)域圖像轉換到頻域圖像,其完整步驟如下:傅立葉變換(時(shí)域圖→頻域圖)→頻域圖排序→去除指定頻率的信號→頻域圖順序還原→逆傅立葉變換(頻域圖→時(shí)域圖)→時(shí)域圖取模還原。

那么我們如此大費周章地去除信號中指定頻段的信號目的是什么呢?當然是基于實(shí)際問(wèn)題的處理,最常見(jiàn)的就是信號去噪,一般來(lái)說(shuō)。信號中都會(huì )存在一些干擾的噪聲信號,不利于信號的處理,而這些噪聲信號的頻段往往都是固定的,只要我們對信號進(jìn)行傅立葉變換的操作,就很容易去除掉這些干擾的噪聲信號了。
舉個(gè)例子,我們在戶(hù)外街道上錄制一段語(yǔ)音,這段語(yǔ)音的信號中,實(shí)際是上包含了我們正常發(fā)出的聲音和街道背景的噪聲信號的。這個(gè)時(shí)候我們如果想要讓錄制的語(yǔ)音變得清晰一些,就需要對這段語(yǔ)音進(jìn)行傅立葉變換的操作,目的就是去除噪聲干擾。當然處理語(yǔ)音信號噪聲的方法有很多,而傅里葉變換是必將經(jīng)典的一種方法。

大多數情況下,噪聲屬于高頻信號,去除掉噪聲的音頻圖和原始音頻圖相比,差異不大,整體來(lái)看,由于有一部分的高頻信號被去除了,去噪后的信號圖比原圖會(huì )更平滑一些。
說(shuō)完傅立葉變換在信號領(lǐng)域的應用,接下來(lái)說(shuō)說(shuō)傅立葉變換在圖像視覺(jué)領(lǐng)域的應用。我們一般所說(shuō)的信號是一個(gè)一維數據,數據前后是由順序的,而圖像是一個(gè)二維(灰度圖)或三維(RGB圖)的數據(在代碼實(shí)現中,會(huì )統一轉成二維灰度圖),但是無(wú)論數據是多少個(gè)維度,他們的處理步驟都是一樣的,只不過(guò)具體操作細節有所變換而已,但是要明白,不管是一維數據也好,還是二維三維數據也罷,它們之間其實(shí)都是可以互相轉換的。
那么傅立葉變換在圖像視覺(jué)領(lǐng)域的具體實(shí)現方法是怎么樣的呢?實(shí)際上只需要把在一維信號中處理流程的時(shí)域信號換成空域信號即可,其他步驟不做任何變化。其實(shí)也很好理解,一維信號數據是具有先后時(shí)序的,而二維或者三維數據之間的關(guān)系就不像一維信號那么,只是基于時(shí)序的關(guān)系了,它們之間的關(guān)系是基于空間的關(guān)系。
代碼演示
接下來(lái),我們就傅立葉變換在圖像領(lǐng)域的應用進(jìn)行代碼實(shí)際操作演示,我們先通過(guò)傅立葉變換對圖像進(jìn)行去噪操作的演示,也就是去掉一部分高頻信號的操作,由于是去高頻信號,留低頻信號,這個(gè)操作也被稱(chēng)為低通濾波。
下面以成都深度智谷科技的教學(xué)機構“深度人工智能學(xué)院”的教學(xué)練習題為例演示傅立葉變換的結果,在opencv中以離散傅立葉變換(DFT)來(lái)實(shí)現圖像低通濾波操作:
import numpyimport cv2import matplotlib.pyplot as plt DFT:離散傅里葉變換'# 2.OpenCV中的 DFT(Discrete Fourier Transform) 離散傅里葉變換img = cv2.imread('.images/1.jpg')# 0.轉化為灰度圖gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)rows, cols = gray.shape # 1.DFT離散傅里葉變換:空域-->頻域dft = cv2.dft(src=numpy.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT) # src為灰度圖,并且是numpy.float32類(lèi)型print(dft.shape)#兩個(gè)通道 # 2.中心化:將低頻移動(dòng)到圖像中心fftshift = numpy.fft.fftshift(dft)# 獲取振幅譜(展示圖片用): numpy.log()是為了將值限制在[0, 255]magnitude_spectrum = numpy.log(cv2.magnitude(fftshift[:, :, 0], fftshift[:, :, 1])) # 3.濾波操作之低通濾波(去高頻,保低頻)mask = numpy.zeros((rows, cols,2), dtype=numpy.uint8)mask[(rows / 2 - 30): (rows / 2 + 30), (cols / 2 - 30): (cols / 2 + 30)] = 1fftshift = fftshift * mask # 4.去中心化:將低頻和高頻的位置還原ifftshift = numpy.fft.ifftshift(fftshift) # 5.逆傅里葉變換:頻域-->空域idft = cv2.idft(ifftshift) # 6.二維向量取模(幅值)img_back = cv2.magnitude(idft[:, :, 0], idft[:, :, 1]) # 結合matplotlib展示多張圖片plt.figure(figsize=(10, 10))plt.subplot(221), plt.imshow(gray, cmap='gray'), plt.title('Input Gray Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(magnitude_spectrum, cmap='gray'), plt.title('Magnitude Spectrum')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(img_back, cmap='gray'), plt.title('Image after LPF')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(img_back), plt.title('Result in JET') # 默認cmap='jet'plt.xticks([]), plt.yticks([])plt.show()代碼展現效果:

通過(guò)上面案例,我們直觀(guān)地感受到了傅立葉變換在圖像去噪方面的實(shí)際效果,去掉了高頻信號后,無(wú)論是灰度圖,還是默認色彩圖,圖像的輪廓都會(huì )被軟化,界限變得模糊,這是由于圖像的噪聲以及邊緣部位往往梯度變化較大,而梯度較大的地方屬于高頻信號,所以在去噪的同時(shí)會(huì )軟化圖像邊緣。
接下來(lái)我們進(jìn)行一個(gè)反向操作,也就是圖像高通濾波操作,即去低頻信號,留高頻信號,看看處理后的圖像最終有什么變化。我們這次以numpy中的快速傅立葉變換為例來(lái)實(shí)現圖像高通濾波操作:
import numpyimport cv2import matplotlib.pyplot as plt img = cv2.imread('.images/1.jpg')# 0.轉化為灰度圖gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)rows, cols = gray.shapeprint(gray.shape) # 1.FFT快速傅里葉變換:空域-->頻域fft = numpy.fft.fft2(gray) # 傅里葉變換,參數為灰度圖print(fft.shape) # 2.中心化:將低頻信號移動(dòng)到圖像中心fftshift = numpy.fft.fftshift(fft)print(numpy.min(numpy.abs(fftshift)))#絕對最低頻率信號print(numpy.max(fftshift),numpy.min(fftshift))#最高頻率信號,最低頻率信號# 獲取振幅譜(展示圖片用): numpy.log()是為了將值壓縮在[0, 255]附近magnitude_spectrum = numpy.log(numpy.abs(fftshift))print(numpy.max(magnitude_spectrum),numpy.min(magnitude_spectrum)) # 3.濾波操作之高通濾波(去低頻,保高頻)fftshift[rows / 2 - 50:rows / 2 + 50, cols / 2 - 50: cols / 2 + 50] = 0# print(fftshift.shape) # 4.去中心化:將剩余的低頻和高頻的位置還原ifftshift = numpy.fft.ifftshift(fftshift) # 5.逆傅里葉變換:頻域-->空域ifft = numpy.fft.ifft2(ifftshift)# print(ifft) # 6.二維向量取模(幅值)img_back = numpy.abs(ifft) #結合matplotlib展示多張圖片plt.figure(figsize=(10, 10))plt.subplot(221), plt.imshow(gray, cmap='gray'), plt.title('Input Gray Image')plt.xticks([]), plt.yticks([])plt.subplot(222), plt.imshow(magnitude_spectrum, cmap='gray'), plt.title('Magnitude Spectrum')plt.xticks([]), plt.yticks([])plt.subplot(223), plt.imshow(img_back, cmap='gray'), plt.title('Image after HPF')plt.xticks([]), plt.yticks([])plt.subplot(224), plt.imshow(img_back), plt.title('Result in JET') # 默認cmap='jet'plt.xticks([]), plt.yticks([])plt.show()代碼展現效果:

圖像高通濾波的效果和低通濾波效果剛好相反,從上面案例的結果來(lái)看,高通濾波的操作會(huì )使圖像失去更多的背景細節部分,只保留了圖像相應的輪廓界面。這是因為背景部分的圖像梯度變化相對輪廓部分的梯度變化較小,圖像梯度變化較小的這部分屬于低頻信號,去除掉這部分低頻信號,會(huì )使得圖像缺少過(guò)渡,邊緣顯得生硬,當去除過(guò)多的低頻信號時(shí),甚至會(huì )讓圖像變成一副邊緣輪廓圖。
既然我們能夠通過(guò)傅立葉變換對圖像進(jìn)行高通濾波或低通濾波的操作,那么同樣也能對圖像進(jìn)行指定任意頻段的濾波操作,比如中通濾波就是保留圖像中間指定頻段的數據,去除高頻數據和低頻數據的操作,而阻滯濾波剛好是去除圖像中間指定頻段的數據,保留高頻和低頻數據。
后記:
關(guān)于普通傅立葉變換和離散傅立葉變換、快速傅立葉變換之間的概念關(guān)系如下:
DTFT是離散時(shí)間傅里葉變換,用來(lái)表達連續的信號的頻譜。
DFT是離散傅里葉變換,針對的是離散的信號和頻譜DFT是DTFT變化而來(lái),其實(shí)就是將連續時(shí)間t變成了nT。為什么要這樣做呢,因為計算機是在數字環(huán)境下工作的,它不可能看見(jiàn)或者處理現實(shí)中連續的信號,只能夠進(jìn)行離散計算,在真實(shí)性上盡可能地逼近連續信號。所以DFT是為了我們能夠去用工具分析信號而創(chuàng )造出來(lái)的,通常我們直接用DTFT的機會(huì )很少。
FFT(Fast Fourier Transformation),即為快速傅氏變換,是離散傅氏變換的快速算法,
它是根據離散傅氏變換的奇、偶、虛、實(shí)等特性,對離散傅立葉變換的算法進(jìn)行改進(jìn)獲得的。
它對傅氏變換的理論并沒(méi)有新的發(fā)現,但是對于在計算機系統或者說(shuō)數字系統中應用離散傅立葉變換,可以說(shuō)是進(jìn)了一大步。在FFT中,利用WN的周期性和對稱(chēng)性,把一個(gè)N項序列(設N=2k,k為正整數),分為兩個(gè)N/2項的子序列,每個(gè)N/2點(diǎn)DFT變換需要(N/2)2次運算,再用N次運算把兩個(gè)N/2點(diǎn)的DFT變換組合成一個(gè)N點(diǎn)的DFT變換。這樣變換以后,總的運算次數就變成N+2*(N/2)^2=N+N^2/2。FFT提高了運算速度,但是,也對參與運算的樣本序列作出了限制,即要求樣本數為2^N點(diǎn)。離散傅里葉變換DFT則無(wú)上述限制。
小結:FFT快,DFT靈活,各有優(yōu)點(diǎn),如果滿(mǎn)足分析要求,兩者準確度相同。
關(guān)注深度人工智能學(xué)院,我們長(cháng)期致力于人工智能職業(yè)教育培訓領(lǐng)域的發(fā)展,“傳播AI教育,培養AI人才” 是我們的長(cháng)期愿景。
文末附上一張傅立葉變換的動(dòng)態(tài)圖,理論上任何圖形都能被分解成若干個(gè)正弦波,也就可以被若干個(gè)圓組合的運動(dòng)軌跡擬合:

聯(lián)系客服