注:本文程序参考董继扬等人的论文《严重椒盐噪声污染图像的非线性滤波算法》2003.12
思想是根据局部统计信息,将像素点分为信息点和正负噪声点,然后对这3种不同的情况进行分别处理,达到保留图像细节的目的。经过几次迭代实验效果很好。
废话少说,上代码:
clc
clear all;
Image=imread('lena512.bmp');
[hei,len]=size(Image);
Image=imnoise(Image,'salt & pepper',0.5);
Image1=Image;
N=zeros(hei,len);
d1=2;
d2=1;
T=5;
TT=30;
% for ik=1:3
for i=1:hei
for j=1:len
[ii,jj]=getinds(i,j,d1,hei,len);
le=length(ii);
for k=1:le
ik=ii(k);
jk=jj(k);
tmp(k)=Image(ik,jk);
end
max=0; min=255;
for iii=1:length(tmp)
if tmp(iii)>max
max=tmp(iii);
end
if tmp(iii)<min
min=tmp(iii);
end
end
if Image(i,j)<=min+T
N(i,j)=-1;
end
if Image(i,j)>=max-T
N(i,j)=1;
end
end
end
for i=1:hei
for j=1:len
if N(i,j)~=0
[ii,jj]=getinds(i,j,d2,hei,len);
le=length(ii);
kk=1;
for k=1:le
ik=ii(k);
jk=jj(k);
W(k)=Image(ik,jk);
WW(k)=N(ik,jk);
if N(ik,jk)==0
X(kk)=Image(ik,jk);
kk=kk+1;
end
end
Mij=median(W);
sum1=0;
XX=X;
XX=double(XX);
if length(XX)~=0
for iii=1:length(XX)
sum1=sum1+XX(iii);
end
end
Aij=sum1/length(X);
if length(X)~=0
if abs(Image1(i,j)-Aij)>TT
Image1(i,j)=Aij;
end
else
Z=0;F=0
for i1=1:length(W)
if(WW(i1)==1)
Z=Z+1;
elseif (WW(i1)==-1)
F=F+1;
end
end
Pij=Z-F;
if abs(Pij)>floor((length(W)-length(X))/3)&&Pij*N(i,j)>0%
Image1(i,j)=Image(i,j);
else
Image1(i,j)=Mij;
end
end
end
end
end
% end
实验效果图如下:
图1:滤波前的加噪图
图2:滤波后的图像