opencv學習一: Fourier變換

\Fourier變換在圖像處理中意義重大。先將這幾天學習的圖像Fourier變換總結如下:

一:基礎原理

  1. 什麼是Fourier變換:

在數學和物理中,或者更準確一點,數學物理方法中,把一個任意函數進行fourier變換的意義等價於把一個函數進行以平面波爲基的展開。這和3維下把一個矢量按照x,y,z基展開是一樣的,這一點陳先生已經說明了。不但可以按平面波展開,還可以按照球面波展開。只要保證你選取的基是完全且正交的即可(應該屬於泛函分析的範疇,要考慮你函數空間的性質,定義norm等)

作者:曾博
鏈接:https://www.zhihu.com/question/19714540/answer/16020416
來源:知乎
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

這是引用自勃勃的知乎上的一段解釋。
  1. 將圖像信號從空間域轉換到複頻域 —— 二維離散Fourier變換:

    F(u,v)=x=0M1y=0N1f(x,y)ej2π(uxM+vyN)

    其中:F(0,0)=M1x=0N1y=0f(x,y) ,也就是說,對於一幅灰度圖像而言,F(0,0)指代的是圖像空間域的平均灰度。

    將信號從複頻域轉換到空間域 —— 二維離散Fourier反變換:

    f(x,y)=1MNu=0M1v=0N1f(u,v)ej2π(uxM+vyN)

這兩個公式是圖像從空間域變換到頻域的理論基礎。隨着FFT技術的發現,圖像處理的運算量由O(n2 )轉變爲O(nlogn )(其中n*n爲圖像的空間維度)。因此可知,圖像處理的運算量被大大減小了。

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()

顯示結果爲:
這裏寫圖片描述

從圖像可以明顯看出來,從相位還原出來的圖像可以大致得到圖像的輪廓。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章