设计自适应中值滤波器,加入高斯噪声 椒盐噪声 生成带噪图像的原理
时间: 2024-04-07 14:32:50 浏览: 23
自适应中值滤波器是一种能够有效去除图像噪声的滤波器。它的原理是:对于每个像素点,选择一个合适的滤波器窗口大小,计算窗口中像素点的中值,并用中值替代当前像素点的灰度值。自适应中值滤波器的窗口大小可以根据图像的噪声强度来自适应地调整,这样可以更好地保留图像的细节信息。
加入高斯噪声和椒盐噪声的原理是,在原始图像的每个像素点上添加一个随机值。高斯噪声是指在每个像素点上加入符合高斯分布的随机值,其特点是噪声强度均衡分布。椒盐噪声是指在每个像素点上加入黑白两种颜色的随机值,其特点是噪声点出现随机但数量较少。
生成带噪图像的原理是,将原始图像的每个像素点的灰度值加上一定的噪声值,从而生成一幅带噪图像。噪声值可以根据高斯分布或均匀分布来生成。添加噪声后,可以使用自适应中值滤波器等滤波器来去除噪声,从而恢复原始图像。
相关问题
设计自适应中值滤波器,通过添加高斯、盐和胡椒噪声生成噪声图像,使用所设计的自适应中值滤波器对图像进行去噪,的代码
好的,以下是使用Matlab设计自适应中值滤波器进行去噪的代码:
```matlab
% 读入图像并显示
I = imread('lena.png');
figure,imshow(I);
% 添加高斯、盐和胡椒噪声
J1 = imnoise(I,'gaussian',0,0.01);
J2 = imnoise(I,'salt & pepper',0.1);
J3 = imnoise(I,'speckle',0.04);
figure,imshow(J1),title('高斯噪声');
figure,imshow(J2),title('盐和胡椒噪声');
figure,imshow(J3),title('乘性噪声');
% 自适应中值滤波器
K1 = J1;
K2 = J2;
K3 = J3;
[m,n] = size(I);
for i = 1:m
for j = 1:n
% 对每个像素点进行处理
window = J1(max(1,i-2):min(m,i+2),max(1,j-2):min(n,j+2));
Zmin = min(window(:));
Zmax = max(window(:));
Zmed = median(window(:));
A1 = Zmed - Zmin;
A2 = Zmed - Zmax;
if A1 > 0 && A2 < 0
B1 = J1(i,j) - Zmin;
B2 = J1(i,j) - Zmax;
if B1 > 0 && B2 < 0
K1(i,j) = J1(i,j);
else
K1(i,j) = Zmed;
end
else
K1(i,j) = Zmed;
end
window = J2(max(1,i-2):min(m,i+2),max(1,j-2):min(n,j+2));
Zmin = min(window(:));
Zmax = max(window(:));
Zmed = median(window(:));
A1 = Zmed - Zmin;
A2 = Zmed - Zmax;
if A1 > 0 && A2 < 0
B1 = J2(i,j) - Zmin;
B2 = J2(i,j) - Zmax;
if B1 > 0 && B2 < 0
K2(i,j) = J2(i,j);
else
K2(i,j) = Zmed;
end
else
K2(i,j) = Zmed;
end
window = J3(max(1,i-2):min(m,i+2),max(1,j-2):min(n,j+2));
Zmin = min(window(:));
Zmax = max(window(:));
Zmed = median(window(:));
A1 = Zmed - Zmin;
A2 = Zmed - Zmax;
if A1 > 0 && A2 < 0
B1 = J3(i,j) - Zmin;
B2 = J3(i,j) - Zmax;
if B1 > 0 && B2 < 0
K3(i,j) = J3(i,j);
else
K3(i,j) = Zmed;
end
else
K3(i,j) = Zmed;
end
end
end
% 显示去噪后的图像
figure,imshow(K1),title('高斯噪声去噪后');
figure,imshow(K2),title('盐和胡椒噪声去噪后');
figure,imshow(K3),title('乘性噪声去噪后');
```
其中,自适应中值滤波器的实现是按照算法步骤逐个像素点进行处理,判断窗口内的像素是否需要进行中值滤波。最终得到去噪后的图像,可以与添加噪声前的原始图像进行对比。
设计自适应中值滤波器, 通过添加高斯、盐和胡椒噪声生成噪声图像具有不同的参数,如标准差、极性概率和等等。 使用所设计的自适应中值滤波器对图像进行去噪,在相同的滤波器大小下并使用PSNR和SSIM度量,自适应中值滤波器与传统中值滤波器的去噪性能比较标准中值滤波器。的代码
以下是 Python 代码示例,实现了自适应中值滤波器及其与传统中值滤波器的比:
```python
import cv2
import numpy as np
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.metrics import structural_similarity as ssim
def adaptive_median_filter(img, window_size, max_window_size):
height, width = img.shape
out_img = np.zeros((height, width), dtype=np.uint8)
for i in range(height):
for j in range(width):
window = img[max(i-window_size,0):min(i+window_size+1,height), max(j-window_size,0):min(j+window_size+1,width)]
window_min = np.min(window)
window_max = np.max(window)
window_median = np.median(window)
if window_min < window_median < window_max:
out_img[i,j] = img[i,j]
else:
window_size += 1
if window_size <= max_window_size:
adaptive_median_filter(img, window_size, max_window_size)
else:
out_img[i,j] = window_median
window_size = 3
return out_img
def main():
img = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (512, 512))
# Add Gaussian noise
gaussian_img = img + np.random.normal(0, 20, img.shape)
gaussian_img = np.clip(gaussian_img, 0, 255).astype(np.uint8)
# Add salt and pepper noise
sp_img = img.copy()
prob = 0.1
sp_img[np.random.rand(*img.shape) < prob/2] = 0
sp_img[np.random.rand(*img.shape) < prob/2] = 255
# Apply median filter
median_gaussian = cv2.medianBlur(gaussian_img, 3)
median_sp = cv2.medianBlur(sp_img, 3)
# Apply adaptive median filter
adaptive_median_gaussian = adaptive_median_filter(gaussian_img, 3, 7)
adaptive_median_sp = adaptive_median_filter(sp_img, 3, 7)
# Calculate PSNR and SSIM
psnr_median_gaussian = psnr(img, median_gaussian)
psnr_median_sp = psnr(img, median_sp)
psnr_adaptive_median_gaussian = psnr(img, adaptive_median_gaussian)
psnr_adaptive_median_sp = psnr(img, adaptive_median_sp)
ssim_median_gaussian = ssim(img, median_gaussian)
ssim_median_sp = ssim(img, median_sp)
ssim_adaptive_median_gaussian = ssim(img, adaptive_median_gaussian)
ssim_adaptive_median_sp = ssim(img, adaptive_median_sp)
# Show results
cv2.imshow('Original', img)
cv2.imshow('Gaussian noise', gaussian_img)
cv2.imshow('Salt and pepper noise', sp_img)
cv2.imshow('Median filter (Gaussian noise)', median_gaussian)
cv2.imshow('Median filter (Salt and pepper noise)', median_sp)
cv2.imshow('Adaptive median filter (Gaussian noise)', adaptive_median_gaussian)
cv2.imshow('Adaptive median filter (Salt and pepper noise)', adaptive_median_sp)
print('PSNR (Median filter, Gaussian noise):', psnr_median_gaussian)
print('PSNR (Median filter, Salt and pepper noise):', psnr_median_sp)
print('PSNR (Adaptive median filter, Gaussian noise):', psnr_adaptive_median_gaussian)
print('PSNR (Adaptive median filter, Salt and pepper noise):', psnr_adaptive_median_sp)
print('SSIM (Median filter, Gaussian noise):', ssim_median_gaussian)
print('SSIM (Median filter, Salt and pepper noise):', ssim_median_sp)
print('SSIM (Adaptive median filter, Gaussian noise):', ssim_adaptive_median_gaussian)
print('SSIM (Adaptive median filter, Salt and pepper noise):', ssim_adaptive_median_sp)
cv2.waitKey(0)
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
```
其中 `adaptive_median_filter` 函数实现了自适应中值滤波器,`main` 函数生成了带有高斯和盐和胡椒噪声的图像,分别使用传统中值滤波器和自适应中值滤波器进行去噪,并计算了 PSNR 和 SSIM 评估指标以进行比较。