如果你對傅裡葉變換到底是幹嘛的不太熟悉,可參考:0704:傅裡葉變換
這裡主要說一下傅裡葉變換應用于圖像處理,顯示原圖像的頻譜圖像.
在Python中,實作傅裡葉的變換主要有兩種方法,一種是使用numpy,一種是OpenCV.
1.numpy
① 傅裡葉變換函數1:numpy.fft.fft2()
功能:實作傅裡葉變換;
傳回:一個複數數組.
圖1 fft2函數
複數包括實數與虛數,複數可以寫成: z=a+bi .
其中a為實部,b為虛部,i為虛數機關,當a、b都不為0時,
z為虛數.當b=0時,z為實數. 當a=0時,z為純虛數.
函數2:numpy.fft.fftshift()
功能:将零頻率分量移到頻譜中心.
圖2 fftshif函數
函數3:20*np.log(np.abs(fshift))
功能:傅裡葉變換得到的結果是一個複數數組,不能直接用于顯示圖像,要想得到頻譜灰階圖像,我們需要一個映射,把複數映射[0, 255]之間.
圖3 映射函數
實驗1:
import
圖4 原圖像與頻譜圖像
Q1:現在我們得到頻譜圖,現在我們應該想一個問題,我們對圖像作傅裡葉變換是為了啥?
A1:
★ 傅裡葉變換變換可以得到高頻與低頻,針對高頻與低頻處理,可以實作不同的目的;
★ 傅裡葉變換是可逆的,通過逆傅裡葉變換,可以恢複原圖像;
★ 如果對高頻與低頻進行處理,然後進行逆傅裡葉變換,所做的處理會反映到逆變換圖像上.
附加:在資料可視化方面,推薦看這篇文章:0704:matplotlib: 資料可視化
前面提到了逆傅裡葉變換,那怎麼做呢?
② 逆傅裡葉變換函數:np.abs(i_img)
功能:設定值範圍
圖5 設定值範圍
實驗2:
import
圖6 原圖像與逆變換圖像
2. 高通濾波
① 低頻、高頻
低頻對應圖像内變化較為緩慢的灰階分量. 例如:在一幅廣袤的綠色大草原上,一大片綠色就代表着低頻(沒什麼變化).
高頻對應圖像内變化較快的灰階分量,是由灰階的尖銳過度造成的,例如:如果這個大草原上,有一隻雄獅,獅子的邊緣就代表着高頻.
② 濾波
接受(通過)或拒絕一定頻率的分量,就稱為為濾波.
通過低頻的濾波器,稱為低通濾波器.
通過高頻的濾波器,稱為高能濾波器.
③ 頻域濾波
Q2:前面,我們已經說過傅裡葉變換,逆傅裡葉變換,現在我們該怎麼在頻域的基礎上,對圖像進行處理呢?
A2:對圖像進行傅裡葉變換,修改頻譜圖像,然後IDFT傳回到圖像域.
特殊目的:圖像增強、圖像去噪、邊緣檢測、特征提取、壓縮、加密等等.
衰減高頻而通過低頻,低通濾波器,将模糊一幅圖像.
衰減低頻而通過高頻,高通濾波器,将增強尖銳的邊緣,但是會導緻圖像的對比度下降(丢失了低頻細節資訊).
★ 高通濾波
頻譜圖像中,中間較亮的部分是低頻資訊(像素值比較大),我們可以通過設定低頻部分的像素值來減弱低頻,如圖7所示:
圖7 高通濾波
圖8 頻譜腌膜圖像
實驗3:
import
圖9 高通濾波效果
3.OpenCV① 傅裡葉變換
函數2:cv2.dft()
圖10 dft函數
函數2:
圖11 fftshift函數
函數3:
cv2.magnitude(參數1,參數2)
其實這個函數的作用與numpy數組:np.abs(fshift)是一回事,np.abs(fshift)是求複數數組fshift中每個複數的大小(注:fshift是一個 一維 的複數數組),而cv2.dft()傳回的是一個 二維 數組(一維是複數的實部,一個是複數的虛部).
圖12 magnitude函數
實驗4:
import
圖13 效果圖
② 逆傅裡葉變換
函數1:cv2.idft()
圖14 idft函數
函數2:numpy.fft.ifftshift()
圖15 ifftshift函數
實驗5:
import
圖16 逆傅裡葉變換
4.低通濾波
低通濾波器:去掉高頻,保留低頻
圖17 低通濾波器
實驗6:
import
圖18 低通濾波