matplotlib 频域高斯噪声
时间: 2023-09-10 22:06:29 浏览: 108
要保存 matplotlib 绘制的图形,你可以使用 `savefig` 函数。这个函数允许你将当前的图形保存为不同的文件格式,如 PNG、JPEG、PDF 等等。下面是一个简单的示例,展示了如何使用 `savefig` 函数保存图形:
```python
import matplotlib.pyplot as plt
# 在这里绘制你的图形
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.title('示例图')
# 使用 savefig 函数保存图形
plt.savefig('my_plot.png') # 文件名可以根据需要自行修改
```
在这个示例中,我们首先使用 `plot` 函数绘制了一个简单的曲线图,并添加了一些标签和标题。然后,我们使用 `savefig` 函数将当前的图形保存为一个名为 "my_plot.png" 的 PNG 文件。你可以根据需要修改文件名和路径,以保存图形到指定的位置。
请注意,在调用 `savefig` 函数之后,你可能还需要调用 `plt.show()` 函数来显示图形,这样可以确保图形在保存之前被正确地绘制出来。另外,你还可以通过在 `savefig` 函数中指定一些参数来调整保存的图形的属性,比如分辨率、透明度等等。具体的用法可以参考 Matplotlib 官方文档。
相关问题
编程实现,给图像添加高斯噪声,设计两种不同范围频域的巴特沃斯高通滤波器,显示并分析滤波效果
下面是Python代码实现:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加载图像
img = cv2.imread('lena.png', 0)
# 添加高斯噪声
mean = 0
variance = 100
sigma = np.sqrt(variance)
noise = np.random.normal(mean, sigma, img.shape)
img_noisy = img + noise.astype(np.uint8)
# 显示原始图像和带噪声的图像
plt.subplot(121), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(122), plt.imshow(img_noisy, cmap='gray')
plt.title('Noisy'), plt.xticks([]), plt.yticks([])
plt.show()
# 设计巴特沃斯高通滤波器
def butterworth_highpass_filter(img, cutoff, n):
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
mask = np.zeros((rows, cols), np.float32)
for i in range(rows):
for j in range(cols):
d = np.sqrt((i - crow) ** 2 + (j - ccol) ** 2)
if d != 0:
mask[i, j] = 1 / (1 + (cutoff / d) ** (2 * n))
return mask
# 应用巴特沃斯高通滤波器
cutoff1 = 10
cutoff2 = 50
n = 2
mask1 = butterworth_highpass_filter(img_noisy, cutoff1, n)
mask2 = butterworth_highpass_filter(img_noisy, cutoff2, n)
img_filtered1 = np.fft.ifft2(np.fft.fft2(img_noisy) * mask1).real
img_filtered2 = np.fft.ifft2(np.fft.fft2(img_noisy) * mask2).real
# 显示滤波后的图像
plt.subplot(131), plt.imshow(img_noisy, cmap='gray')
plt.title('Noisy'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(img_filtered1, cmap='gray')
plt.title('Highpass filter (cutoff={} n={})'.format(cutoff1, n)), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_filtered2, cmap='gray')
plt.title('Highpass filter (cutoff={} n={})'.format(cutoff2, n)), plt.xticks([]), plt.yticks([])
plt.show()
```
运行结果如下:
![image-20210930091235392](https://i.loli.net/2021/09/30/6UeX9MzSfrjKx7D.png)
从滤波后的图像可以看出,较小的cutoff值会保留更多的高频信息,但也会保留一些噪声;而较大的cutoff值会滤除更多的噪声,但也可能会滤除一些有用的高频信息。因此,应根据具体情况选择合适的cutoff值。此外,增大n值可以使滤波器更加陡峭,但也会导致更多的振铃效应。
请简单描述频域滤波的主要步骤,并举例写出一个巴特沃斯低通滤波器去除图像中高斯噪声的程序实例。
频域滤波的主要步骤如下:
1. 将原始图像进行傅里叶变换,得到其频域表示;
2. 在频域中选择一个滤波器函数,并将其应用到频域图像中,以滤除不需要的频率成分;
3. 对滤波后的频域图像进行反傅里叶变换,将其转换回空域。
巴特沃斯低通滤波器是一种常用的滤波器,可以用来去除图像中的高频噪声。下面是一个巴特沃斯低通滤波器去除图像中高斯噪声的程序实例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读入原始图像并加入高斯噪声
img = cv2.imread('input.jpg', 0)
noise = np.random.normal(0, 20, img.shape)
img_noise = np.uint8(np.clip(np.float32(img) + noise, 0, 255))
# 进行傅里叶变换
f = np.fft.fft2(img_noise)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
# 设计巴特沃斯低通滤波器
rows, cols = img_noise.shape
crow, ccol = rows // 2, cols // 2
D = 30 # 截止频率
n = 2 # 阶数
b, a = cv2.butter(n, D / (ccol * 2)) # 设计滤波器
# 将滤波器应用到频域图像中
fshift[crow - 10:crow + 10, ccol - 10:ccol + 10] = 0 # 去除高频噪声
fshift_filtered = np.zeros_like(fshift)
for i in range(rows):
fshift_filtered[i, :] = np.convolve(fshift[i, :], b, mode='same')
for j in range(cols):
fshift_filtered[:, j] = np.convolve(fshift_filtered[:, j], b, mode='same')
# 进行反傅里叶变换
f_filtered = np.fft.ifftshift(fshift_filtered)
img_filtered = np.abs(np.fft.ifft2(f_filtered))
# 显示结果
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(img_noise, cmap='gray')
plt.title('Image with Gaussian Noise'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_filtered, cmap='gray')
plt.title('Filtered Image'), plt.xticks([]), plt.yticks([])
plt.show()
```
其中,`cv2.butter(n, Wn)` 函数用于设计一个巴特沃斯滤波器,其中 `n` 是滤波器的阶数,`Wn` 是截止频率。`np.convolve(a, b, mode='same')` 函数用于将滤波器应用到频域图像中。最终,程序会显示原始图像、加入高斯噪声后的图像、频谱图以及滤波后的图像。
阅读全文