均值滤波与中值滤波csdn
时间: 2023-10-21 19:31:51 浏览: 82
均值滤波和中值滤波都是常用的图像处理方法,用于去除图像中的噪声。
均值滤波是一种线性平滑滤波技术,它将像素的值替换为周围像素的平均值。这种方法的优点是简单快速,但缺点是会使图像失去一些细节信息,因为它会平滑掉图像中的细节部分。
中值滤波是一种非线性平滑滤波技术,它将像素的值替换为周围像素的中位数。这种方法的优点是可以保留图像中的细节信息,因为它不会像均值滤波那样平滑掉图像中的细节部分。缺点是它的计算量较大,因为需要对像素进行排序,而且在处理边缘部分时可能会出现失真。
一般来说,如果图像中的噪声比较小且不是很明显,可以使用均值滤波。如果图像中的噪声比较大或者需要保留图像中的细节信息,则可以使用中值滤波。
相关问题
对一幅图像依次添加高斯噪声、椒盐噪声,分别运用算术均值滤波、几何均值滤波、中值滤波、修正的阿尔法均值滤波进行图像恢复,显示并比较分析结果
首先,我们需要了解一下几种滤波器的原理和应用场景。
1. 算术均值滤波器:对于每个像素点,将其周围的像素点取平均值作为该像素点的值。适用于轻度噪声。
2. 几何均值滤波器:对于每个像素点,将其周围的像素点取几何平均值作为该像素点的值。适用于轻度噪声。
3. 中值滤波器:对于每个像素点,将其周围的像素点排序,取中间值作为该像素点的值。适用于椒盐噪声。
4. 修正的阿尔法均值滤波器:对于每个像素点,将其周围的像素点按照权重进行加权平均,其中离该像素点较远的像素点权重较小。适用于高斯噪声。
接下来,我们先生成一张测试图像:
```
import cv2
import numpy as np
# 生成测试图像
img = np.zeros((300, 300), np.uint8)
cv2.rectangle(img, (50, 50), (250, 250), (255, 255, 255), -1)
cv2.circle(img, (150, 150), 50, (0, 0, 0), -1)
cv2.imwrite('test.png', img)
```
生成的测试图像如下:
![test.png](https://img-blog.csdn.net/2018050217504843)
我们先对该图像添加高斯噪声和椒盐噪声:
```
import random
# 添加高斯噪声
def add_gaussian_noise(img):
h, w = img.shape
img_noise = np.zeros((h, w), np.uint8)
mean = 0
var = 100
sigma = var ** 0.5
for i in range(h):
for j in range(w):
rdn = random.random()
if rdn < 0.5:
img_noise[i, j] = img[i, j] + int(sigma * np.random.randn())
else:
img_noise[i, j] = img[i, j]
return img_noise
# 添加椒盐噪声
def add_salt_pepper_noise(img):
h, w = img.shape
img_noise = np.zeros((h, w), np.uint8)
threshold = 0.1
for i in range(h):
for j in range(w):
rdn = random.random()
if rdn < threshold:
img_noise[i, j] = 0
elif rdn > 1 - threshold:
img_noise[i, j] = 255
else:
img_noise[i, j] = img[i, j]
return img_noise
# 加载测试图像
img = cv2.imread('test.png', cv2.IMREAD_GRAYSCALE)
# 添加高斯噪声
img_gaussian_noise = add_gaussian_noise(img)
# 添加椒盐噪声
img_salt_pepper_noise = add_salt_pepper_noise(img)
```
添加高斯噪声后的图像:
![gaussian_noise.png](https://img-blog.csdn.net/20180502175053126)
添加椒盐噪声后的图像:
![salt_pepper_noise.png](https://img-blog.csdn.net/20180502175102856)
接下来,我们分别使用算术均值滤波器、几何均值滤波器、中值滤波器、修正的阿尔法均值滤波器对图像进行恢复:
```
# 算术均值滤波器
def arithmetic_mean_filter(img, kernel_size):
h, w = img.shape
img_filtered = np.zeros((h, w), np.uint8)
pad_size = kernel_size // 2
for i in range(pad_size, h - pad_size):
for j in range(pad_size, w - pad_size):
img_filtered[i, j] = np.mean(img[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1])
return img_filtered
# 几何均值滤波器
def geometric_mean_filter(img, kernel_size):
h, w = img.shape
img_filtered = np.zeros((h, w), np.uint8)
pad_size = kernel_size // 2
for i in range(pad_size, h - pad_size):
for j in range(pad_size, w - pad_size):
img_filtered[i, j] = np.power(np.prod(img[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1]), 1.0 / (kernel_size * kernel_size))
return img_filtered
# 中值滤波器
def median_filter(img, kernel_size):
h, w = img.shape
img_filtered = np.zeros((h, w), np.uint8)
pad_size = kernel_size // 2
for i in range(pad_size, h - pad_size):
for j in range(pad_size, w - pad_size):
img_filtered[i, j] = np.median(img[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1])
return img_filtered
# 修正的阿尔法均值滤波器
def alpha_trimmed_mean_filter(img, kernel_size, d):
h, w = img.shape
img_filtered = np.zeros((h, w), np.uint8)
pad_size = kernel_size // 2
for i in range(pad_size, h - pad_size):
for j in range(pad_size, w - pad_size):
img_patch = img[i - pad_size:i + pad_size + 1, j - pad_size:j + pad_size + 1]
img_patch = np.sort(img_patch.flatten())
img_patch = img_patch[d // 2:-d // 2]
img_filtered[i, j] = np.mean(img_patch)
return img_filtered
# 恢复图像
img_arithmetic_mean_filtered = arithmetic_mean_filter(img_gaussian_noise, 3)
img_geometric_mean_filtered = geometric_mean_filter(img_gaussian_noise, 3)
img_median_filtered = median_filter(img_salt_pepper_noise, 3)
img_alpha_trimmed_mean_filtered = alpha_trimmed_mean_filter(img_gaussian_noise, 3, 3)
```
使用算术均值滤波器恢复高斯噪声图像后的结果:
![arithmetic_mean_filtered.png](https://img-blog.csdn.net/2018050217512044)
使用几何均值滤波器恢复高斯噪声图像后的结果:
![geometric_mean_filtered.png](https://img-blog.csdn.net/20180502175127459)
使用中值滤波器恢复椒盐噪声图像后的结果:
![median_filtered.png](https://img-blog.csdn.net/20180502175135662)
使用修正的阿尔法均值滤波器恢复高斯噪声图像后的结果:
![alpha_trimmed_mean_filtered.png](https://img-blog.csdn.net/20180502175142489)
从以上结果可以看出,对于不同类型的噪声,选择不同的滤波器可以得到更好的恢复效果。算术均值滤波器和几何均值滤波器适用于轻度噪声,中值滤波器适用于椒盐噪声,修正的阿尔法均值滤波器适用于高斯噪声。同时,不同的滤波器也有各自的优缺点,需要根据具体情况进行选择。
在MATLAB中实现DnCNN模型和传统算法(均值滤波、中值滤波、非局部均值滤波、BM3D)去噪的步骤是什么?如何比较它们的性能指标PSNR和SSIM?
在MATLAB中实现DnCNN模型和传统算法去噪并比较性能,首先需要准备噪声图像数据集,并熟悉每种算法的去噪原理。以高斯白噪声为例,可以按照以下步骤进行:
参考资源链接:[MATLAB实现图像去噪:传统算法与DnCNN模型对比分析](https://wenku.csdn.net/doc/6di2dcfkz5?spm=1055.2569.3001.10343)
1. 数据集处理:首先需要准备包含噪声的图像数据集,通常使用MATLAB中的imread函数读取图像,然后使用imnoise函数添加高斯白噪声。
2. 传统去噪算法实现:
- 均值滤波:调用MATLAB内置函数imfilter,使用均值滤波器核进行卷积。
- 中值滤波:使用MATLAB内置函数medfilt2,选择合适的滤波器大小。
- 非局部均值滤波(NLM):依据算法原理,使用自定义函数或从资源库中获取现成的NLM代码。
- 三维块匹配滤波(BM3D):运行BM3D项目中的main.m文件,并根据文档说明调用去噪函数。
3. DnCNN模型实现:根据《MATLAB实现图像去噪:传统算法与DnCNN模型对比分析》资源中的说明,可以获取DnCNN模型代码并进行适当的修改,以适应具体的数据集和问题场景。
4. 性能评估:
- 使用MATLAB内置函数计算PSNR和SSIM,评估去噪效果。
- 对每种算法的去噪结果,计算并比较PSNR和SSIM值。
5. 代码运行:进入相应算法的目录,运行对应的.m文件。对于DnCNN,确保正确设置模型参数,并加载预训练权重(如果有的话)。
6. 结果分析:通过比较不同算法的PSNR和SSIM值,分析每种算法的去噪效果和适用场景。
以上步骤需要在MATLAB环境中操作,确保算法实现正确并能够根据需要调整参数。通过实践比较不同算法的性能,你可以更好地理解各种去噪方法的优缺点,为后续的图像处理工作打下坚实基础。
在完成本项目后,若希望进一步深入了解图像去噪算法,包括更多高级处理技术或不同类型的噪声处理,可以继续查阅《MATLAB实现图像去噪:传统算法与DnCNN模型对比分析》,该资源提供了全面的算法实现和项目说明,是深入研究的宝贵资源。
参考资源链接:[MATLAB实现图像去噪:传统算法与DnCNN模型对比分析](https://wenku.csdn.net/doc/6di2dcfkz5?spm=1055.2569.3001.10343)
阅读全文