对图像使用窗口函数

快速傅立叶变换(FFT)假定被变换的数据代表周期信号的一个周期。因此,在FFT的上下文中,要变换的信号的端点可以表现为不连续。这些不连续会扭曲FFT的输出,导致来自“真实”频率分量的能量泄漏到更宽的频率。

频谱泄漏的影响可以通过将信号与窗函数相乘来减小。当信号到达边缘时,窗口平滑地降低信号的幅度,消除由FFT导致的人为中断的影响。

在本例中,我们可以看到典型图像的FFT可以显示沿x轴和y轴的强烈光谱泄漏(参见图中的垂直线和水平线)。二维Hann窗的应用大大减少了频谱泄漏,使得在FFT的频率分量的曲线图中更明显地看到了“真实”的频率信息。

Original image, Windowed image, Original FFT (frequency), Window + FFT (frequency)
import matplotlib.pyplot as plt
import numpy as np
from scipy.fftpack 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分0.354秒)

Gallery generated by Sphinx-Gallery