备注
转到末尾 以下载完整示例代码。或者通过 Binder 在浏览器中运行此示例。
使用窗口函数处理图像#
快速傅里叶变换(FFT)假设被变换的数据代表一个周期信号的一个周期。因此,要变换的信号的端点在FFT的上下文中可能表现为不连续。这些不连续性扭曲了FFT的输出,导致“真实”频率分量的能量泄漏到更宽的频率中。
可以通过将信号与窗函数相乘来减少频谱泄漏的影响。窗函数在信号到达边缘时平滑地降低其幅度,消除了由FFT引起的人工不连续性的影响。
在这个例子中,我们看到典型图像的FFT在x轴和y轴上显示出强烈的频谱泄漏(见图中的垂直和水平线)。应用二维Hann窗口大大减少了频谱泄漏,使得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 分钟 0.223 秒)