有效去除图像中脉冲噪声的新型滤波算法(曲延锋等)

%imfledfilt.m
%有效去除图像中脉冲噪声的新型滤波算法
%检测窗口5*5,滤波窗口3*3
function [R] = imfledfilt(x,Noiserate)
[e,f]=size(x);
Nmax=2; %确定最大的滤波半径,那么滤波窗口或者检测窗口最大为5
%下面是边界扩展,图像上下左右各增加Nmax像素
z=zeros(e+2*Nmax,f+2*Nmax);%引入一个新矩阵,用以贴上图片
z(Nmax+1:e+Nmax,Nmax+1:f+Nmax)=x;%将图片贴在新矩阵的中心位置

%扩展图像边界
z(1:Nmax,Nmax+1:f+Nmax)=x(1:Nmax,1:f);                 %扩展上边界
z(1:e+Nmax,f+Nmax+1:f+2*Nmax)=z(1:e+Nmax,f:f+Nmax-1);  %扩展右边界
z(e+Nmax+1:e+2*Nmax,Nmax+1:f+2*Nmax)=z(e:e+Nmax-1,Nmax+1:f+2*Nmax); %扩展下边界
z(1:e+2*Nmax,1:Nmax)=z(1:e+2*Nmax,Nmax+1:2*Nmax);       %扩展左边界
%z即为一个扩展后的图像
y=z;%y复制z,y为最后输出的图像

F=zeros(e+2*Nmax,f+2*Nmax);%判断每个像素点是否是噪声的二值化矩阵.F(i,j)=0为信号点,F(i,j)=1为噪声点,开始时默认所有点为信号点(毕竟噪声点很少)

%%%第一步,检测每个像素是否为噪声点
for i=Nmax+1:e+Nmax
  for j=Nmax+1:f+Nmax
    %检测窗口开始用5*5
    z0=z(i-2:i+2,j-2:j+2);
    z1=z0(1:end);
    %if  z(i,j) == max(z1) | z(i,j) == min(z1)%疑似噪声点,需要进一步判断
    if  z(i,j) == 0 | z(i,j) == 255 %疑似噪声点,需要进一步判断
      F(i,j) = 1;
    end
 end
end

%由文献条件
if Noiserate < 0.6
  Wf = 3;
else
  Wf = 5;
end
%%%第二步,噪声滤波
%while F ~= zeros(e+2*Nmax,f+2*Nmax)%当去噪未彻底,那需要反复滤波去噪
%H = 3;
%while H ~= 0
  for i=Nmax+1:e+Nmax
    for j=Nmax+1:f+Nmax
      if F(i,j) == 1%若像素为噪声点
         M = sum(sum( F(i-( (Wf-1)/2 ):i+( (Wf-1)/2 ),j-( (Wf-1)/2 ):j+( (Wf-1)/2 )) == 0 ));%窗口内信号点的个数
         if M >0
           z1 =zeros(1,M);
           for i1=i-( (Wf-1)/2 ):i+( (Wf-1)/2 )
            for j1=j-( (Wf-1)/2 ):j+( (Wf-1)/2 )
              if F(i1,j1) == 0%寻找到信号点
                z1(1,M) = y(i1,j1);
                M = M -1;
              end
            end
           end
          y(i,j) = median(z1);%求取信号点的中值
          F(i,j) = 0;%噪声点处理后标记为信号点
         end
      end 
    end
  end
%  z = y;
% H = H -1;
%end

R(1:e,1:f) = y( Nmax+1:e+Nmax,Nmax+1:f+Nmax );%拷出滤波后的图像
I=imread('3.png');
I=rgb2gray(I);
[e,f]=size(I);

Noiserate = 0.9;
J=imnoise(I,'salt & pepper',Noiserate);
R=imfledfilt(J,Noiserate);

subplot(1,2,1),imshow( uint8(I) ),title('原图像');
subplot(1,2,2),imshow( uint8(R) ),title('新算法滤波后的图像');
% 计算三种算法的峰值信噪比
B=8;                %编码一个像素用多少二进制位
MAX=2^B-1;          %图像有多少灰度级

I=double(I);
R=double(R);


%%%%%% psnr1=
MES=sum(sum((I-R).^2))/(e*f);     %自适应中值去噪的均方差
PSNR=20*log10(MAX/sqrt(MES));           %自适应中值算法去噪的峰值信噪比

MES1 = sum(sum((I-R).^2));
MES2 = sum(sum(I.^2));
SNR = 10*log10(MES2/MES1);
tic;R=imfledfilt(J,Noiserate );toc;


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值