注意
移至結尾以下載完整的範例程式碼。或透過 Binder 在您的瀏覽器中執行此範例
將視窗函數應用於影像#
快速傅立葉變換 (FFT) 假設正在轉換的資料代表週期訊號的一個週期。因此,在 FFT 的上下文中,要轉換的訊號的端點可能會表現為不連續性。這些不連續性會扭曲 FFT 的輸出,導致來自「真實」頻率成分的能量洩漏到更寬的頻率中。
可以透過將訊號乘以視窗函數來減少頻譜洩漏的影響。視窗化會平滑地減少訊號在到達邊緣時的振幅,從而消除 FFT 產生的人為不連續性的影響。
在此範例中,我們可以看到典型影像的 FFT 會沿著 x 和 y 軸顯示強烈的頻譜洩漏 (請參閱圖中的垂直和水平線)。應用二維漢恩視窗可以大大減少頻譜洩漏,使「真實」頻率資訊在 FFT 頻率成分的繪圖中更加可見。

import matplotlib.pyplot as plt
import numpy as np
from scipy.fft import fft2, fftshift
from skimage import img_as_float
from skimage.color import rgb2gray
from skimage.data import astronaut
from skimage.filters import window
image = img_as_float(rgb2gray(astronaut()))
wimage = image * window('hann', image.shape)
image_f = np.abs(fftshift(fft2(image)))
wimage_f = np.abs(fftshift(fft2(wimage)))
fig, axes = plt.subplots(2, 2, figsize=(8, 8))
ax = axes.ravel()
ax[0].set_title("Original image")
ax[0].imshow(image, cmap='gray')
ax[1].set_title("Windowed image")
ax[1].imshow(wimage, cmap='gray')
ax[2].set_title("Original FFT (frequency)")
ax[2].imshow(np.log(image_f), cmap='magma')
ax[3].set_title("Window + FFT (frequency)")
ax[3].imshow(np.log(wimage_f), cmap='magma')
plt.show()
腳本的總執行時間:(0 分鐘 1.101 秒)