OpenCV Python - 傅立葉變換



傅立葉變換用於將影像從空間域轉換到頻域,方法是將其分解為正弦和餘弦分量。

對於數字影像,基本的灰度影像值通常在0到255之間。因此,傅立葉變換也需要是**離散傅立葉變換 (DFT)**。它用於查詢頻域。

數學上,二維影像的傅立葉變換表示如下:

$$\mathrm{F(k,l)=\displaystyle\sum\limits_{i=0}^{N-1}\: \displaystyle\sum\limits_{j=0}^{N-1} f(i,j)\:e^{-i2\pi (\frac{ki}{N},\frac{lj}{N})}}$$

如果幅度在短時間內變化很快,可以說它是高頻訊號。如果變化緩慢,則為低頻訊號。

對於影像,幅度在邊緣點或噪點處劇烈變化。因此,邊緣和噪點是影像中的高頻成分。如果幅度變化不大,則為低頻成分。

OpenCV 提供了**cv.dft()** 和 **cv.idft()** 函式來實現此目的。

cv.dft() 執行一維或二維浮點陣列的離散傅立葉變換。其命令如下:

cv.dft(src, dst, flags)

這裡:

  • src - 可以是實數或複數的輸入陣列。
  • dst - 輸出陣列,其大小和型別取決於標誌。
  • flags - 變換標誌,表示 DftFlags 的組合。

cv.idft() 計算一維或二維陣列的逆離散傅立葉變換。其命令如下:

cv.idft(src, dst, flags)

為了獲得離散傅立葉變換,輸入影像被轉換為 np.float32 資料型別。然後使用獲得的變換將零頻率分量移到頻譜的中心,從中計算幅度譜。

示例

以下是使用 Matplotlib 的程式,我們繪製原始影像和幅度譜:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('lena.jpg',0)
dft = cv.dft(np.float32(img),flags = cv.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img, cmap = 'gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap = 'gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

輸出

Fourier Transform
廣告
© . All rights reserved.