FFT 滤波python
时间: 2023-06-23 20:59:08 浏览: 109
FFT 滤波(Fast Fourier Transform Filtering)是一种基于频域的图像滤波方法,可以通过对图像进行 Fourier 变换,然后在频域上进行滤波,最后再进行反 Fourier 变换得到处理后的图像。在 Python 中可以使用 OpenCV 库提供的函数 `cv2.dft()` 和 `cv2.idft()` 来实现 FFT 滤波。
函数原型如下:
```python
cv2.dft(src[, dst[, flags[, nonzeroRows]]]) → dst
cv2.idft(src[, dst[, flags[, nonzeroRows]]]) → dst
```
其中,参数含义如下:
- `src`:输入图像,必须为浮点型;
- `dst`:输出数组,与输入数组具有相同的大小和类型;
- `flags`:变换的标志,可以是以下值之一:
- `cv2.DFT_COMPLEX_OUTPUT`:输出为双通道复数数组;
- `cv2.DFT_REAL_OUTPUT`:输出为单通道实数数组;
- `cv2.DFT_INVERSE`:进行反 Fourier 变换;
- `cv2.DFT_SCALE`:对结果进行缩放;
- `cv2.DFT_ROWS`:对每一行独立进行变换;
- `cv2.DFT_COMPLEX_INPUT`:输入为双通道复数数组;
- `cv2.DFT_COMPLEX_OUTPUT`:输出为双通道复数数组;
- `cv2.DFT_REAL_INPUT`:输入为单通道实数数组;
- `cv2.DFT_INVERSE_SCALE`:对结果进行反缩放;
- `nonzeroRows`:当输入数组的行数大于零时,可以指定需要变换的行数。
下面是一个简单的例子,使用 FFT 滤波对图像进行高通滤波:
```python
import cv2
import numpy as np
img = cv2.imread('image.jpg', 0)
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
# 创建一个掩膜,中心为 0,其余为 1
mask = np.ones((rows, cols), np.uint8)
mask[crow - 30: crow + 30, ccol - 30: ccol + 30] = 0
# 进行 Fourier 变换,得到频域图像
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
# 对频域图像进行滤波
dft_shift *= mask
# 进行反 Fourier 变换,得到处理后的图像
idft_shift = np.fft.ifftshift(dft_shift)
idft = cv2.idft(idft_shift)
img_filtered = cv2.magnitude(idft[:, :, 0], idft[:, :, 1])
cv2.imshow('Original Image', img)
cv2.imshow('Filtered Image', img_filtered)
cv2.waitKey(0)
```
其中,`image.jpg` 是待处理的图像文件名,首先创建一个掩膜,中心为 0,其余为 1,然后对输入图像进行 Fourier 变换,得到频域图像。对频域图像进行滤波后,再进行反 Fourier 变换,得到处理后的图像。
运行代码后,会弹出一个名为 `Original Image` 的窗口,显示原始图像,和一个名为 `Filtered Image` 的窗口,显示处理后的图像。
阅读全文