\Fourier變換在圖像處理中意義重大。先將這幾天學習的圖像Fourier變換總結如下:
一:基礎原理
- 什麼是Fourier變換:
在數學和物理中,或者更準確一點,數學物理方法中,把一個任意函數進行fourier變換的意義等價於把一個函數進行以平面波爲基的展開。這和3維下把一個矢量按照x,y,z基展開是一樣的,這一點陳先生已經說明了。不但可以按平面波展開,還可以按照球面波展開。只要保證你選取的基是完全且正交的即可(應該屬於泛函分析的範疇,要考慮你函數空間的性質,定義norm等)
作者:曾博
鏈接:https://www.zhihu.com/question/19714540/answer/16020416
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
這是引用自勃勃的知乎上的一段解釋。
將圖像信號從空間域轉換到複頻域 —— 二維離散Fourier變換:
F(u,v)=∑x=0M−1∑y=0N−1f(x,y)∗e−j2π(uxM+vyN)
其中:F(0,0)=∑M−1x=0∑N−1y=0f(x,y) ,也就是說,對於一幅灰度圖像而言,F(0,0)指代的是圖像空間域的平均灰度。將信號從複頻域轉換到空間域 —— 二維離散Fourier反變換:
f(x,y)=1MN∑u=0M−1∑v=0N−1f(u,v)∗ej2π(uxM+vyN)
這兩個公式是圖像從空間域變換到頻域的理論基礎。隨着FFT技術的發現,圖像處理的運算量由O(
3.Python與openCV實現圖像信號的Fourier變換:
import cv2 #導入cv2包
import numpy as np #導入numpy包
import matplotlib.pyplot as plt
img = cv2.imread('E:\\python_opencv\\img_source\\lena.jpg',0) #直接讀爲灰度圖像
img_fourier = np.fft.fft2(img) #Fourier變換
fshift = np.fft.fftshift(img_fourier) #將佔據信號大多數的低頻信號移到圖像中間
img_fourier_mag = np.log(np.abs(fshift)) #取幅度值,並降低結果對比度(以e爲底取對數)
img_fourier_back = np.fft.ifftshift(fshift)#將佔據信號大多數的低頻信號轉移回到圖像邊緣
img_back = np.fft.ifft2(img_fourier_back)#Fourier反變換
img_back = np.abs(img_back)
figure = plt.figure()
#原圖像
fig1 = figure.add_subplot(131)
fig1.imshow(img,'gray')
plt.title('original')
#Fourier變換後的頻域
fig2 = figure.add_subplot(132)
fig2.imshow(img_fourier_mag, 'gray')
plt.title('Fourier_space')
#Fourier反變換後的圖像
part3 = figure.add_subplot(133)
part3.imshow(img_back,'gray')
plt.title('img_back')
plt.show()
顯示結果爲:
由頻域轉換結果可知,對於細節不是非常多的圖像(例如上面的lena圖像),低頻信號纔是最主要的。高頻信號只是少數。
4.圖像轉換到頻域到後,相位有什麼作用?
import cv2 #導入cv2包
import numpy as np #導入numpy包
import matplotlib.pyplot as plt
img = cv2.imread('E:\python_opencv\img_source\lena.jpg',0) #直接讀爲灰度圖像
img_fourier = np.fft.fft2(img) #Fourier變換
fshift = np.fft.fftshift(img_fourier) #將佔據信號大多數的低頻信號移到圖像中間
img_fourier_mag = np.log(np.abs(fshift)) #取幅度值,並降低結果對比度(以e爲底取對數)
figure = plt.figure()
f2shift = np.fft.ifftshift(np.angle(fshift))
img_phase_back = np.fft.ifft2(f2shift)
#出來的是複數,無法顯示
img_phase_back = np.abs(img_phase_back)
np.savetxt('b.txt', img_phase_back)
#調整大小範圍便於顯示
img_phase_back = (img_phase_back-np.amin(img_phase_back))/(np.amax(img_phase_back)-np.amin(img_phase_back)) #歸一化,防止對比度太低時顯示效果不好
np.savetxt('c.txt', img_phase_back)
figure = plt.figure()
fig1 = figure.add_subplot(111)
fig1.imshow(img_phase_back,'gray')
plt.title('phase')
plt.show()
顯示結果爲:
從圖像可以明顯看出來,從相位還原出來的圖像可以大致得到圖像的輪廓。