您的位置:首页 > 其它

自适应阈值中值滤波去除大密度椒盐噪声

2018-04-02 14:15 585 查看
   这篇也是老师留的一个小作业,如何滤除椒盐噪声。首先椒盐噪声是很简单的一种噪声,椒噪声(黑点)灰度为0,盐噪声(白点)灰度为255,去除椒盐噪声比较有效的方法是采用中值滤波,但是,在噪声密度较大时,标准中值滤波(SMF)的效果就不太好了,因为SMF采用3*3模板,当噪声密度较大时,所得的中值很可能还为噪声,因此,有很多改进的中值滤波方法被提出。
  本文所实现之功能基于以下思想:
1.对于非边缘部分,采取自适应中值滤波方法,即先判断当前像素点灰度值是否为0/255,如果不是,则不进行处理,如果是,则进行SMF,取得中值,再进行判断中值是否为0/255,如果是,则增大模板,直至中值不为0/255;
2.对于边缘部分,采取局部均值的方法。
参考文献:刘杨。基于改进型中值滤波的高密度椒盐噪声图像去噪算法研究 [ J ].微型机与应用,2016,35(19):47-49.
—————————————————转载请注明出处———————————————
matlab程序如下:%*******************************************
%———自适应中值滤波法去除大密度椒盐噪声———
% 主要思想
% 判断当前像素是否为噪声点
% 1) NO ->不处理
% 2) YES->自适应中值滤波
% 3) 边缘处理
% 04/01/2018
%******************************************
close all;clc;
%读取图像
I=imread('lena.jpg');
%变为灰度图
I=rgb2gray(I);
%加椒盐噪声
In=imnoise(I,'salt & pepper',0.7);
%求图像最大最小值
max=max(max(In));
min=min(min(In));
%创建一幅图像
size=size(In);
J=zeros(size);
%自适应中值滤波
for i=2:size(1)-1
for j=2:size(2)-1
if(In(i,j)<max||In(i,j)>min)
J(i,j)=I(i,j);
else
for k=1
A=In(i-k:i+k,j-k:j+k);
B=median(median(A));
if(B<max||B>min)
J(i,j)=B;
break;
end
end
end
end
end
%边缘处理
%第一行
for i=2:size(2)-1
a=round((In(1,i-1)+In(1,i)+In(1,i+1))/3);
J(1,i)=a;
end
%最后一行
for i=2:size(2)-1
a=round((In(size(1),i-1)+In(size(1),i)+In(size(1),i+1))/3);
J(size(1),i)=a;
end
%第一列
for i=2:size(1)-1
a=round((In(i-1,1)+In(i,1)+In(i+1,1))/3);
J(i,1)=a;
end
%最后一列
for i=2:size(1)-1
a=round((In(i-1,size(2))+In(i,size(2))+In(i+1,size(2)))/3);
J(i,size(2))=a;
end
%左上角
J(1,1)=round((J(1,2)+J(2,1))/2);
%左下角
J(size(1),1)=round((J(size(1),2)+J(size(1)-1,1))/2);
%右上角
J(1,size(2))=round((J(1,size(2)-1)+J(2,size(2)))/2);
%右下角
J(size(1),size(2))=round((J(size(1),size(2)-1)+J(size(1)-1,size(2)))/2);
J=uint8(J);
%figure,imshow(I);
%用评价函数评价SMF处理结果
K=medfilt2(In);
snr_1=SNR(I,K);
%用评价函数评价本算法处理结果
snr_2=SNR(I,J);
%显示处理结果
subplot(121),imshow(In);
subplot(122),imshow(J);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息