摘要:傅里葉變換主要是將時(shí)間域上的信號(hào)轉(zhuǎn)變?yōu)轭l率域上的信號(hào),用來進(jìn)行圖像除噪、圖像增強(qiáng)等處理。
本文分享自華為云社區(qū)《[Python圖像處理] 二十二.Python圖像傅里葉變換原理及實(shí)現(xiàn)》,作者:eastmount。
十年的彝良網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整彝良建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“彝良網(wǎng)站設(shè)計(jì)”,“彝良網(wǎng)站推廣”以來,每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
本文主要講解圖像傅里葉變換的相關(guān)內(nèi)容,在數(shù)字圖像處理中,有兩個(gè)經(jīng)典的變換被廣泛應(yīng)用——傅里葉變換和霍夫變換。其中,傅里葉變換主要是將時(shí)間域上的信號(hào)轉(zhuǎn)變?yōu)轭l率域上的信號(hào),用來進(jìn)行圖像除噪、圖像增強(qiáng)等處理。
傅里葉變換(Fourier Transform,簡(jiǎn)稱FT)常用于數(shù)字信號(hào)處理,它的目的是將時(shí)間域上的信號(hào)轉(zhuǎn)變?yōu)轭l率域上的信號(hào)。隨著域的不同,對(duì)同一個(gè)事物的了解角度也隨之改變,因此在時(shí)域中某些不好處理的地方,在頻域就可以較為簡(jiǎn)單的處理。同時(shí),可以從頻域里發(fā)現(xiàn)一些原先不易察覺的特征。傅里葉定理指出“任何連續(xù)周期信號(hào)都可以表示成(或者無限逼近)一系列正弦信號(hào)的疊加。”
下面引用李老師“Python+OpenCV圖像處理”中的一個(gè)案例,非常推薦同學(xué)們?nèi)W(xué)習(xí)。如下圖所示,他將某飲料的制作過程的時(shí)域角度轉(zhuǎn)換為頻域角度。
繪制對(duì)應(yīng)的時(shí)間圖和頻率圖如下所示:
傅里葉公式如下,其中w表示頻率,t表示時(shí)間,為復(fù)變函數(shù)。它將時(shí)間域的函數(shù)表示為頻率域的函數(shù)f(t)的積分。
傅里葉變換認(rèn)為一個(gè)周期函數(shù)(信號(hào))包含多個(gè)頻率分量,任意函數(shù)(信號(hào))f(t)可通過多個(gè)周期函數(shù)(或基函數(shù))相加合成。從物理角度理解,傅里葉變換是以一組特殊的函數(shù)(三角函數(shù))為正交基,對(duì)原函數(shù)進(jìn)行線性變換,物理意義便是原函數(shù)在各組基函數(shù)的投影。如下圖所示,它是由三條正弦曲線組合成。
傅里葉變換可以應(yīng)用于圖像處理中,經(jīng)過對(duì)圖像進(jìn)行變換得到其頻譜圖。從譜頻圖里頻率高低來表征圖像中灰度變化劇烈程度。圖像中的邊緣信號(hào)和噪聲信號(hào)往往是高頻信號(hào),而圖像變化頻繁的圖像輪廓及背景等信號(hào)往往是低頻信號(hào)。這時(shí)可以有針對(duì)性的對(duì)圖像進(jìn)行相關(guān)操作,例如圖像除噪、圖像增強(qiáng)和銳化等。
二維圖像的傅里葉變換可以用以下數(shù)學(xué)公式(15-3)表達(dá),其中f是空間域(Spatial Domain))值,F(xiàn)是頻域(Frequency Domain)值
對(duì)上面的傅里葉變換有了大致的了解之后,下面通過Numpy和OpenCV分別講解圖像傅里葉變換的算法及操作代碼。
Numpy中的 FFT包提供了函數(shù) np.fft.fft2()可以對(duì)信號(hào)進(jìn)行快速傅里葉變換,其函數(shù)原型如下所示,該輸出結(jié)果是一個(gè)復(fù)數(shù)數(shù)組(Complex Ndarry)。
fft2(a, s=None, axes=(-2, -1), norm=None)
Numpy中的fft模塊有很多函數(shù),相關(guān)函數(shù)如下:
#計(jì)算一維傅里葉變換
numpy.fft.fft(a, n=None, axis=-1, norm=None)
#計(jì)算二維的傅里葉變換
numpy.fft.fft2(a, n=None, axis=-1, norm=None)
#計(jì)算n維的傅里葉變換
numpy.fft.fftn()
#計(jì)算n維實(shí)數(shù)的傅里葉變換
numpy.fft.rfftn()
#返回傅里葉變換的采樣頻率
numpy.fft.fftfreq()
#將FFT輸出中的直流分量移動(dòng)到頻譜中央
numpy.fft.shift()
下面的代碼是通過Numpy庫實(shí)現(xiàn)傅里葉變換,調(diào)用np.fft.fft2()快速傅里葉變換得到頻率分布,接著調(diào)用np.fft.fftshift()函數(shù)將中心位置轉(zhuǎn)移至中間,最終通過Matplotlib顯示效果圖。
# -*- coding: utf-8 -*- import cv2as cv import numpyas np from matplotlib import pyplot as plt #讀取圖像 img= cv.imread('test.png', 0) #快速傅里葉變換算法得到頻率分布 f= np.fft.fft2(img) #默認(rèn)結(jié)果中心點(diǎn)位置是在左上角, #調(diào)用fftshift()函數(shù)轉(zhuǎn)移到中間位置 fshift= np.fft.fftshift(f) #fft結(jié)果是復(fù)數(shù), 其絕對(duì)值結(jié)果是振幅 fimg= np.log(np.abs(fshift)) #展示結(jié)果 plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original Fourier') plt.axis('off') plt.subplot(122), plt.imshow(fimg, 'gray'), plt.title('Fourier Fourier') plt.axis('off') plt.show()