一、原理_中值滤波
中值滤波的基本思想是将图像中每个像素的灰度值用其邻域内像素灰度的中值代替,它是一种非线性平滑滤波算法。
设加噪图像为 f(x,y) ,经中值滤波处理后的图像为g(x,y) ,则:
式中,S是(x,y)像素点的邻域。本实验分别选用3×3、5×5、7×7的中值滤波窗口对图像进行处理。
需要注意的是,当模板滑动到图像边缘时,模板的部分行或列就会处于图像之外,本实验可采用下面的任一种方法处理这种问题:
①先在图像边缘以外补上一行和一列灰度为零的像素点,再对原图像中的每个像素点进行模板处理。
②保留图像的边缘像素,对其它像素进行模板处理。
二、步骤
(1)读入原图像lena.bmp并显示;
(2)对原图像分别添加高斯噪声和椒盐噪声,并显示加噪图像;
(3)采用中值滤波进行去噪处理,并显示去噪图像;
三、实验图像
四、框图
五、代码
%------------------------------------------------------------------------
% File name: second_2
% Last modified Date: 2021年6月10日20点09分
% Author: Jasmine
% Descriptions: 函数second_2(),中值滤波
%------------------------------------------------------------------------
%清空工作区
clc,clear,close all;
%读入原图像
lena = imread('D:\lena.bmp');
%显示原图像
subplot(3,3,1);imshow(lena);title('原图');
%添加高斯噪声并显示
guassian_lena = imnoise(lena, 'gaussian', 0, 0.02);
subplot(3,3,2);imshow(guassian_lena);title('加入 均值:0 方差:0.02 的高斯噪声');
%添加椒盐噪声并显示
salt_lena=imnoise(lena,'salt & pepper',0.02);
subplot(3,3,3),imshow(salt_lena),title('加入噪声密度:0.02的椒盐噪声');
%高斯噪声 中值滤波
guassian_lena=rgb2gray(guassian_lena);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%手动中值滤波
n=3; %模板大小
[height, width]=size(guassian_lena); %获取图像的尺寸(n小于图片的宽高)
x1=double(guassian_lena); %数据类型转换
x2 = x1; %转换后的数据赋给x2
for i=1:height-n+1
for j=1:width-n+1
c=x1(i:i+(n-1),j:j+(n-1)); %在x1中从头取模板大小的块赋给c
e=c(1,:); %e中存放是c矩阵的第一行
for u=2:n %将c中的其他行元素取出来接在e后使e为一个行矩阵
e=[e,c(u,:)];
end
med=median(e); %取一行的中值
x2(i+(n-1)/2,j+(n-1)/2)=med; %将模板各元素的均值赋给模板中心位置的元素
end
end
result=uint8(x2); %转换格式
subplot(3,3,4);imshow(result);title('高斯噪声 3*3中值滤波');
%5*5
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%借助MATLAB中值滤波函数中值滤波(以下皆是)
gua_k2=medfilt2(guassian_lena,[5,5]);
subplot(3,3,5);imshow(gua_k2);title('高斯噪声 5*5中值滤波');
%7*7
gua_k3=medfilt2(guassian_lena,[7,7]);
subplot(3,3,6);imshow(gua_k3);title('高斯噪声 7*7中值滤波');
%椒盐噪声 中值滤波
salt_lena=rgb2gray(salt_lena);
%3*3
salt_k1=medfilt2(salt_lena);
subplot(3,3,7);imshow(salt_k1);title('椒盐噪声 3*3中值滤波');
%5*5
salt_k2=medfilt2(salt_lena,[5,5]);
subplot(3,3,8);imshow(salt_k2);title('椒盐噪声 5*5中值滤波');
%7*7
salt_k3=medfilt2(salt_lena,[7,7]);
subplot(3,3,9);imshow(salt_k3);title('椒盐噪声 7*7中值滤波');