python用cv2图像频域低通滤波
时间: 2023-12-17 17:04:38 浏览: 91
图像频域低通滤波是通过移除高频部分来平滑图像的一种技术。在Python中,我们可以使用OpenCV库中的函数进行频域低通滤波。以下是一个简单的代码示例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread('image.png', 0)
# 获取图像的傅里叶变换
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
# 构建低通滤波器
rows, cols = img.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
# 应用滤波器并进行逆傅里叶变换
fshift = fshift*mask
ishift = np.fft.ifftshift(fshift)
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
# 显示结果
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(iimg, cmap='gray')
plt.title('Low Pass Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
在这个例子中,我们首先读取了一张灰度图像,然后使用`np.fft.fft2()`函数计算了图像的傅里叶变换。接下来,我们使用`np.fft.fftshift()`函数将零频率移到图像中心。然后,我们创建了一个低通滤波器,它是一个二维矩阵,其中心为1,其余部分为0。我们可以使用`cv2.circle()`函数或者简单的切片操作来创建这个矩阵。我们将滤波器应用于傅里叶变换,并使用`np.fft.ifftshift()`函数将零频率移回到左上角。最后,我们使用`np.fft.ifft2()`函数计算逆傅里叶变换,并使用`np.abs()`函数获取实数部分。最后,我们将原始图像和低通滤波后的图像显示在同一个窗口中,以便比较它们的效果。
阅读全文