椒盐噪声、高斯噪声及关于滤波的MATLAB实现
目录
- 1、相关知识回顾
- 2、matlab自带函数实现
- 3、自编写程序实现均值滤波、中值滤波
- 1)均值滤波
- 2)中值滤波
1、相关知识回顾
常见的图像噪声有 椒盐噪声
和 高斯噪声
- 椒盐噪声的特征:出现位置是随机的,但噪声的幅值是基本相同的。
- 高斯噪声的特征:出现位置是一定的(每一点上),但噪声的幅值是随机的。
图像噪声抑制滤波器有三类:①均值滤波器 ②中值滤波器 ③边界保持类滤波器
- 均值滤波器原理
在图像上,对待处理的像素给定一个模板,该模板包括了其周围的邻近像素。将模板中 的全体像素的均值来替代原来的像素值的方法。 - 中值滤波器原理
在某个模板中,对像素进行由小到大排列的重新排列,取模板中排在中间位置上的像素的灰度值替代待处理像素的值的方法。
2、matlab自带函数实现
代码实现:
im = imread('img\lena.jpg');
% 1)生成含有高斯噪声、椒盐噪声的图像
% imnoise 是表示添加噪声污染一幅图像,叫做噪声污染图像函数
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒盐噪声
im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪声
% 显示加入噪声后的图像
% figure,imshow(im_noise_salt);title('加入椒盐噪声后的图像');
% figure,imshow(im_noise_gaussian);title('加入高斯噪声后的图像');
figure;
subplot(131),imshow(im);title('原图');
subplot(132),imshow(im_noise_salt);title('加入椒盐噪声后的图像');
subplot(133),imshow(im_noise_gaussian);title('加入高斯噪声后的图像');
% 2)使用均值滤波分别对高斯噪声、椒盐噪声的图像进行滤波
% fspecial函数 用来生成滤波器(也叫算子)的函数
% h = fspecial(type) h = fspecial(type,para)
% 使用type参数来指定滤波器的种类,使用para来对具体的滤波器种类添加额外的参数信息。h就是生成的滤波器。
n=1; m=2*n+1;
A = fspecial('average',m); % 生成系统自带3×3滤波器
% filter2 - 二维数字滤波器
% Y = filter2(H,X) 根据矩阵 H 中的系数,对数据矩阵 X 应用有限脉冲响应滤波器。
% 进行滤波并显示图像
im_filtered1 = filter2(A,im_noise_salt);
im_filtered2 = filter2(A,im_noise_gaussian);
figure;
subplot(321),imshow(im_noise_salt);title('加入椒盐噪声后的图像');
subplot(322),imshow(im_noise_gaussian);title('加入高斯噪声后的图像');
subplot(323),imshow(uint8(im_filtered1));title('椒盐噪声图像进行均值滤波后的图像');
subplot(324),imshow(uint8(im_filtered2));title('高斯噪声图像进行均值滤波后的图像');
% 3)使用中值滤波分别对高斯噪声、椒盐噪声的图像进行滤波
% 定义邻域尺寸
n1 = 2; m1 = 2*n1+1;
n2 = 2; m2 = 2*n2+1;
% medfilt2函数用于执行二维中值滤波,使用方法如下:
% B = medfilt2(A, [m n]) B = medfilt2(A)
% 其中[m n]表示邻域块的大小,默认值为[3 3]。 b=medfilt2(a,[m,n]);
% b是中值滤波后的图象矩阵,a是原图矩阵,m和n是处理模版大小,默认3×3。
im_filtered11 = medfilt2(im_noise_salt,[m1,m2]);
im_filtered22 = medfilt2(im_noise_gaussian,[m1,m2]);
subplot(325),imshow(im_filtered11);title('椒盐噪声图像进行中值滤波后的图像');
subplot(326),imshow(im_filtered22);title('高斯噪声图像进行中值滤波后的图像');
代码执行结果:
3、自编写程序实现均值滤波、中值滤波
1)均值滤波
代码实现:
% 自编写均值滤波函数
im = imread('img\lena.jpg');
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒盐噪声
% im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪声
n=1; m=2*n+1;
H = ones(m,m)/(m*m); % 3×3矩阵 n=2:5×5
[h,l,c] = size(im_noise_salt); % [h,l,c] = size(im_noise_gaussian);
x1 = double(im_noise_salt); % x1 = double(im_noise_gaussian);
x2 = x1;
for i=n+1:h-n
for j=n+1:l-n
% 去除x1中从(i,j)开始的n行n列元素与模板相乘
c = x1(i-n:i+n,j-n:j+n).*H;
s = sum(c(:));
x2(i,j) = s;
end
end
im_filtered2 = uint8(x2);
subplot(2,2,[1,2]),imshow(im);title('原图');
subplot(223),imshow(im_noise_salt);title('加入椒盐噪声后的图像');
subplot(224),imshow(im_filtered2);title('椒盐噪声图像进行均值滤波后的图像');
代码执行结果:
2)中值滤波
代码实现:
% 自编写中值滤波函数
im = imread('img\lena.jpg');
im_noise_salt = imnoise(im,'salt & pepper'); % 加入椒盐噪声
% im_noise_gaussian = imnoise(im,'gaussian'); % 加入高斯噪声
% % 定义邻域尺寸
n1 = 2; m1 = 2*n1+1;
n2 = 2; m2 = 2*n2+1;
k = floor(m1*m2/2)+1;
[h,l,c] = size(im_noise_salt); % [h,l,c] = size(im_noise_gaussian);
H = zeros(h,l);
t = zeros(n1,n2);
for i=n1+1:h-n1
for j=n2+1:l-n2
Neiborhood = im_noise_salt(i-n1:i+n1,j-n2:j+n2); % 得到3×3邻域
t = Neiborhood(:);
s = sort(t);
H(i,j) = s(k);
end
end
im_filtered2 = uint8(H);
subplot(2,2,[1,2]),imshow(im);title('原图');
subplot(223),imshow(im_noise_salt);title('加入椒盐噪声后的图像');
subplot(224),imshow(im_filtered2);title('椒盐噪声图像进行中值滤波后的图像');
代码执行结果: