要使用傅里叶滤波在 OpenCV 中处理图像,你需要遵循以下步骤:
- 将图像转换为灰度图(如果是彩色的)。
- 应用傅里叶变换将图像转换到频率域。
- 创建一个滤波器掩码。
- 将滤波器掩码应用到频率域图像上。
- 应用逆傅里叶变换将图像转换回空间域。
- 显示结果。
以下是使用低通和高通滤波器处理图像的示例代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 加载图像
image = cv2.imread('path_to_image', 0) # 0 表示以灰度模式读取
# 应用傅里叶变换
dft = cv2.dft(np.float32(image), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = cv2.fftshift(dft) # 将零频分量移动到频谱中心
# 创建低通滤波器
dft_rows, dft_cols = dft_shift.shape
low_pass_filter = np.zeros((dft_rows, dft_cols), np.uint8)
cv2.circle(low_pass_filter, (dft_rows//2, dft_cols//2), dft_rows//4, (255), -1)
# 应用低通滤波器
low_pass = cv2.multiply(dft_shift, low_pass_filter)
low_pass_shift = cv2.idft(cv2.fftshift(low_pass))
low_pass_shift = cv2.magnitude(low_pass_shift[:, :, 0], low_pass_shift[:, :, 1])
# 创建高通滤波器
high_pass_filter = cv2.bitwise_not(low_pass_filter)
high_pass = cv2.multiply(dft_shift, high_pass_filter)
high_pass_shift = cv2.idft(cv2.fftshift(high_pass))
high_pass_shift = cv2.magnitude(high_pass_shift[:, :, 0], high_pass_shift[:, :, 1])
# 显示结果
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_GRAY2BGR))
plt.title('Original Image')
plt.subplot(2, 2, 2)
plt.imshow(cv2.cvtColor(low_pass_shift, cv2.COLOR_GRAY2BGR))
plt.title('Low-pass Filtered')
plt.subplot(2, 2, 3)
plt.imshow(cv2.cvtColor(high_pass_shift, cv2.COLOR_GRAY2BGR))
plt.title('High-pass Filtered')
plt.show()
这段代码首先将图像转换为灰度图,然后计算其傅里叶变换并将其移动到频谱中心。接着,创建一个低通滤波器,它是一个圆形区域,其余部分为黑色(即零)。将这个掩码应用到 DFT 变换后的图像上,然后进行逆傅里叶变换以获得低通滤波后的图像。
对于高通滤波器,使用低通滤波器的反掩码(即 cv2.bitwise_not 操作)。同样应用这个掩码,然后进行逆傅里叶变换以获得高通滤波后的图像。
最后,使用 matplotlib
库显示原始图像、低通滤波后的图像和高通滤波后的图像。你会看到低通滤波器使得图像模糊,而高通滤波器则增强了图像的边缘和细节。