当我们使用傅里叶变换对图像进行频谱分析后,可以在频域中进行滤波操作,从而实现对图像的处理。低通滤波器可以用来去除高频信号,从而平滑图像。下面我们将使用Python和OpenCV来实现低通滤波。
首先,我们导入必要的库和加载一张图片。
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 加载图片
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
接下来,我们对图片进行傅里叶变换,并将频谱中心化,以便于我们进行滤波。
# 进行傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 将频谱中心化
magnitude_spectrum = 20*np.log(np.abs(fshift))
然后,我们定义一个低通滤波器的掩模,用于过滤高频信号。
# 定义低通滤波器掩模
rows, cols = img.shape
crow, ccol = rows//2, cols//2
mask = np.zeros((rows, cols), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
在本例中,我们将以图片中心为中心,设置一个大小为60x60的掩模,将该掩模区域内的所有像素设置为1,其余区域的像素为0。这将过滤掉高频信号。
接着,我们将掩模应用到频谱中。
# 将掩模应用到频谱中
fshift_masked = fshift * mask
magnitude_spectrum_filtered = 20*np.log(np.abs(fshift_masked))
最后,我们对经过滤波后的频谱进行傅里叶逆变换,将其转换为图像。
# 将频谱反变换为图像
f_ishift = np.fft.ifftshift(fshift_masked)
img_back = np.fft.ifft2(f_ishift)
img_back = np.abs(img_back)
完整代码如下:
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 加载图片
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# 进行傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 将频谱中心化
magnitude_spectrum = 20*np.log(np.abs(fshift))
# 定义低通滤波器掩模
rows, cols = img.shape
crow, ccol = rows//2, cols//2
mask = np.zeros((rows, cols), np.uint8)
mask[crow-30:crow+30, ccol-30:ccol+30] = 1
# 将掩模应用到频谱中
fshift_masked = fshift * mask
magnitude_spectrum_filtered = 20*np