自适应阈值中值滤波去除大密度椒盐噪声
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);
本文所实现之功能基于以下思想:
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);
相关文章推荐
- python 图像处理 用中值滤波去除椒盐噪声
- 严重椒盐噪声去除算法
- OpenCV2 图像处理与计算机视觉(一)—— 去除一幅二值化图像中的椒盐噪声
- 去除椒盐噪声(简答的matlab代码实践,PSNR评价)
- 图形图像——中值滤波去除椒盐噪声
- 作业1(高斯模糊,椒盐噪声,中值滤波去噪)
- 实验六---数字图像的噪声去除(MATLAB实现)
- 给YUV视频加入椒盐噪声
- 使用递推最小二乘法(RLS算法)进行自适应噪声对消
- 代数加法运算去除高斯噪声及matlab实现
- SIFT检测特征点之去除边缘不稳定噪声点
- 计算机视觉-椒盐噪声输出
- 噪声添加(高斯噪声、椒盐噪声)
- 图像去噪——椒盐噪声与高斯噪声
- 给图像加高斯噪声和椒盐噪声(不使用自带函数)matlab实现
- 图像处理之噪声---椒盐,白噪声,高斯噪声三种不同噪声的区别
- opencv加椒盐噪声
- 中值滤波与椒盐噪声
- 去除数据中的噪声点
- C++批量对图片进行水平镜像、切片、旋转、添加椒盐噪声(小样本学习中图像扩充)