对一幅添加了噪声的图像,用高斯滤波器在频率域分别实现一 个平滑和锐化的操作。使用Python代码实现
时间: 2024-05-03 20:17:14 浏览: 160
首先需要导入必要的库,包括numpy、cv2、matplotlib.pyplot等。然后读入一张图片,并在其上添加高斯噪声,代码如下:
```python
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image.jpg', 0)
noise = np.random.normal(0, 25, img.shape)
img_with_noise = img + noise.astype(np.uint8)
```
其中,np.random.normal()函数用于生成均值为0,标准差为25的高斯噪声。
接下来,需要对图像进行傅里叶变换,并将其转换为频率域表示,代码如下:
```python
f = np.fft.fft2(img_with_noise)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20*np.log(np.abs(fshift))
```
其中,np.fft.fft2()函数用于进行二维傅里叶变换,np.fft.fftshift()函数用于将频域零频分量移到频谱中心,np.abs()函数用于计算复数的模,20*np.log()函数用于将幅度谱转换为对数刻度。
接下来,分别构造平滑和锐化的滤波器,并将其应用于频域图像,代码如下:
```python
# 构造平滑滤波器
rows, cols = img_with_noise.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_smooth = fshift * mask
magnitude_spectrum_smooth = 20*np.log(np.abs(fshift_smooth))
# 构造锐化滤波器
mask = np.ones((rows, cols), np.float32)
mask[crow-5:crow+5, ccol-5:ccol+5] = 0
mask = mask - 1
# 应用锐化滤波器
fshift_sharp = fshift * mask
magnitude_spectrum_sharp = 20*np.log(np.abs(fshift_sharp))
```
其中,平滑滤波器为一个半径为30的圆形掩膜,锐化滤波器为一个半径为5的圆形掩膜减去一个全1的掩膜。最后,需要将处理后的频率域图像进行傅里叶逆变换,代码如下:
```python
# 傅里叶逆变换
img_smooth = np.fft.ifft2(np.fft.ifftshift(fshift_smooth)).real.astype(np.uint8)
img_sharp = np.fft.ifft2(np.fft.ifftshift(fshift_sharp)).real.astype(np.uint8)
```
其中,np.fft.ifft2()函数用于进行二维傅里叶逆变换,real属性用于取实部,astype()函数用于将数据类型转换为uint8。最后,将处理前后的图像进行对比,代码如下:
```python
plt.subplot(221), plt.imshow(img_with_noise, cmap='gray')
plt.title('Input Image with Noise'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_smooth, cmap='gray')
plt.title('Smoothed Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_sharp, cmap='gray')
plt.title('Sharpened Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
其中,plt.subplot()函数用于将多个图像排列在一起展示,plt.imshow()函数用于显示图像,plt.title()函数用于设置图像标题,plt.xticks()和plt.yticks()函数用于设置坐标轴刻度。最终的处理结果如下图所示:

阅读全文
相关推荐
















