对一幅图像依次添加高斯噪声、椒盐噪声,分别运用算术均值滤波、几何均值滤波、中值滤波、修正的阿尔法均值滤波进行图像恢复,显示并比较分析结果
时间: 2023-11-17 20:08:48 浏览: 116
图像高斯、椒盐噪声处理
首先,我们需要了解一下几种滤波器的原理和应用场景。
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)
从以上结果可以看出,对于不同类型的噪声,选择不同的滤波器可以得到更好的恢复效果。算术均值滤波器和几何均值滤波器适用于轻度噪声,中值滤波器适用于椒盐噪声,修正的阿尔法均值滤波器适用于高斯噪声。同时,不同的滤波器也有各自的优缺点,需要根据具体情况进行选择。
阅读全文