參考博客:
https://blog.csdn.net/on2way/article/details/46981825
https://www.cnblogs.com/ranjiewen/p/6241913.html
參考書籍:
《數字圖像處理第三版》(岡薩雷斯)
《信號與系統第二版》(奧本海姆)
本博客不會講述過多的公式與證明(我不會說在博客輸入公式好麻煩)。
傅里葉提出,任何週期函數可以表示爲不同頻率的正弦和/或餘弦和的形式。無論函數多複雜,只要它是週期的,並且滿足某些適度的數學條件,都可以用這樣的和表示。甚至非週期函數(但該曲線下的面積是有限的)也可以用正弦和/或餘弦和乘以加權函數的積分來表示。用傅里葉級數或者變換表示的函數特徵完全可以通過傅里葉反變換來重建,而不會丟失任何信息。這是這種表示方法的最重要特徵之一:不丟失任何信息。
而數字圖像,尤其是計算機所能識別的圖像可以說都是離散信號,並且以二維居多。
連續信號傅里葉變換: (1)
連續傅里葉反變換: (2)
公式(1)與公式(2)合稱爲傅里葉變換對。
而二維連續傅里葉變換對:
(3)
和: (4)
而二維離散傅里葉變換(DFT):
二維離散傅里葉反變換(IDFT):
而通常二維DFt一般式複函數,故可用極座標系表示爲:
其中,幅值(也稱頻譜):
相角:
功率譜:
- 傅里葉變換
那麼對一張圖做傅里葉變換後會怎樣的?變換前:
變換後:
代碼如下:`
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread(‘D:/codes/shan.jpg’,0) #直接讀爲灰度圖像
f = np.fft.fft2(img)#二維傅里葉變換
fshift = np.fft.fftshift(f)#將頻譜對稱軸從左上角移至中心
plt.subplot(121),plt.imshow(f,‘gray’),plt.title(‘original’)
plt.subplot(122),plt.imshow(fshift,‘gray’),plt.title(‘center’)
plt.savefig(“examples.jpg”)
`
爲什麼會用到fftshift(),將頻譜從左上角移至中心?傅里葉變換將低頻信號放在了邊緣,高頻信號放在了中間,然而一副圖像,很明顯的低頻信號多而明顯,所以講低頻信號移至中心。我們將傅里葉變換後的數據稱爲頻域,變換前稱爲空域。
那麼相位圖呢?
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('flower.jpg',0) #直接讀爲灰度圖像
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
#取絕對值:將複數變化成實數
#取對數的目的爲了將數據變化到較小的範圍(比如0-255)
ph_f = np.angle(f)#前面傅里葉變換的結果是複數,可以直接用angle函數求角度
ph_fshift = np.angle(fshift)
plt.subplot(121),plt.imshow(ph_f,'gray'),plt.title('original')
plt.subplot(122),plt.imshow(ph_fshift,'gray'),plt.title('center')
- 傅里葉逆變換
代碼如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('D:/codes/shan.jpg',0) #直接讀爲灰度圖像
f = np.fft.fft2(img)#二維傅里葉變換
fshift = np.fft.fftshift(f)#將頻譜對稱軸從左上角移至中心
#取絕對值:將複數變化成實數
#取對數的目的爲了將數據變化到較小的範圍(比如0-255)
s1 = np.log(np.abs(f))
s2 = np.log(np.abs(fshift))
#ph_f=np.angle(f)
#ph_fshift = np.angle(fshift)
plt.subplot(131),plt.imshow(img,'gray'),plt.title('original')
plt.subplot(132),plt.imshow(s2,'gray'),plt.title('center')
# 逆變換
f1shift = np.fft.ifftshift(fshift)
img_back = np.fft.ifft2(f1shift)
#出來的是複數,無法顯示
img_back = np.abs(img_back)
plt.subplot(133),plt.imshow(img_back,'gray'),plt.title('img back')
plt.savefig("examples.jpg")
可以看到恢復的一樣