使用python的傅里叶变换对全矩阵进行高斯滤波
时间: 2023-11-27 16:53:14 浏览: 74
可以使用以下步骤对全矩阵进行高斯滤波:
1. 导入必要的库
```python
import numpy as np
import cv2
from matplotlib import pyplot as plt
```
2. 读取图像并将其转换为灰度图像
```python
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
```
3. 对图像进行傅里叶变换
```python
f = np.fft.fft2(gray)
fshift = np.fft.fftshift(f)
```
4. 构建高斯滤波器
```python
rows, cols = gray.shape
crow, ccol = int(rows / 2), int(cols / 2)
# 构建高斯滤波器
d = 30 # 高斯滤波器大小
sigma = 10 # 高斯滤波器标准差
gaussian = np.zeros((rows, cols))
for i in range(rows):
for j in range(cols):
gaussian[i, j] = np.exp(-((i - crow) ** 2 + (j - ccol) ** 2) / (2 * sigma ** 2))
# 将高斯滤波器应用于频域图像
filtered_fshift = fshift * gaussian
```
5. 对滤波后的频域图像进行傅里叶逆变换
```python
filtered_f = np.fft.ifftshift(filtered_fshift)
img_back = np.real(np.fft.ifft2(filtered_f))
```
6. 显示原始图像和滤波后的图像
```python
plt.subplot(121), plt.imshow(gray, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Gaussian Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
完整的代码如下:
```python
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 读取图像并将其转换为灰度图像
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 对图像进行傅里叶变换
f = np.fft.fft2(gray)
fshift = np.fft.fftshift(f)
# 构建高斯滤波器
rows, cols = gray.shape
crow, ccol = int(rows / 2), int(cols / 2)
d = 30 # 高斯滤波器大小
sigma = 10 # 高斯滤波器标准差
gaussian = np.zeros((rows, cols))
for i in range(rows):
for j in range(cols):
gaussian[i, j] = np.exp(-((i - crow) ** 2 + (j - ccol) ** 2) / (2 * sigma ** 2))
# 将高斯滤波器应用于频域图像
filtered_fshift = fshift * gaussian
# 对滤波后的频域图像进行傅里叶逆变换
filtered_f = np.fft.ifftshift(filtered_fshift)
img_back = np.real(np.fft.ifft2(filtered_f))
# 显示原始图像和滤波后的图像
plt.subplot(121), plt.imshow(gray, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_back, cmap='gray')
plt.title('Gaussian Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
注意,这里的高斯滤波器是在频域中应用的,因此不需要使用cv2.GaussianBlur()函数。
阅读全文