欢迎访问宙启技术站
智能推送

Python中的fft2()函数在图像分析中的应用案例

发布时间:2023-12-28 14:44:30

在图像分析中,fft2()函数通常用于图像的频域分析和滤波。频域分析可以帮助我们了解图像中不同频率成分的贡献以及不同频率成分之间的相互关系。下面是一个使用fft2()函数进行频域分析的简单示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并将其转换为灰度图像
image = cv2.imread('image.jpg', 0)

# 对图像进行傅里叶变换
fft_image = np.fft.fft2(image)

# 将零频率分量移到频谱中心
fft_image_shifted = np.fft.fftshift(fft_image)

# 计算频谱的幅度谱
magnitude_spectrum = np.log(np.abs(fft_image_shifted))

# 显示原始图像和频谱
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.show()

上述代码中,我们首先读取一张图像,并将其转换为灰度图像。然后,我们对灰度图像进行傅里叶变换,得到频域表示的复数数组。为了将频谱中的零频率成分移到频谱中心,我们使用了fftshift()函数。接下来,我们计算了频谱的幅度谱,即频域图像的幅度的对数。最后,我们使用Matplotlib库将原始图像和频谱进行显示。

通过上述代码,我们可以观察到频谱中的亮点代表不同的频率成分。较亮的点表示较大的幅度,即在图像中存在较强的该频率成分。这可以帮助我们了解图像中不同频率成分的贡献以及不同频率成分之间的相互关系。

除了频域分析,fft2()函数还可以用于图像的滤波。通过将不感兴趣的频率成分设置为零,我们可以实现对图像的频率域滤波。下面是一个简单的频率域低通滤波示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像并将其转换为灰度图像
image = cv2.imread('image.jpg', 0)

# 对图像进行傅里叶变换
fft_image = np.fft.fft2(image)

# 将零频率分量移到频谱中心
fft_image_shifted = np.fft.fftshift(fft_image)

# 设置低通滤波器的大小
rows, cols = image.shape
crow, ccol = int(rows / 2), int(cols / 2)
mask = np.zeros((rows, cols), np.uint8)
mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1

# 应用滤波器
fft_image_shifted_filtered = fft_image_shifted * mask

# 反向移动零频率分量
fft_image_filtered = np.fft.ifftshift(fft_image_shifted_filtered)

# 对滤波后的频域图像进行反傅里叶变换
filtered_image = np.abs(np.fft.ifft2(fft_image_filtered))

# 显示原始图像和滤波后的图像
plt.subplot(121), plt.imshow(image, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(filtered_image, cmap='gray')
plt.title('Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()

上述代码中,我们首先读取一张图像,并将其转换为灰度图像。然后,我们对灰度图像进行傅里叶变换,并将零频率分量移到频谱中心。接下来,我们创建一个大小为60x60的矩形低通滤波器。将滤波器应用于频谱图像,并反向移动零频率分量。最后,我们对滤波后的频域图像进行反傅里叶变换,得到滤波后的图像。

通过上述代码,我们可以观察到滤波后的图像中高频成分被抑制,只留下低频成分。这样的滤波操作可以用于去除图像中的噪声或细节,从而实现图像的平滑处理。