注意
转到末尾下载完整的示例代码。或在您的浏览器中通过 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.832 秒)