中值滤波器(Median Filter)
中值滤波的思想就是比较一定领域内的像素值的大小,取出其中值作为这个领域的中心像素新的值。假设对一定领域内的所有像素从小到大进行排序,如果存在孤立的噪声点,比如椒盐噪声(椒噪声——较小的灰度值,呈现的效果是小黑点;盐噪声——较大的灰度值,呈现的效果是小白点),那么从小到大排序的这个数组中,那些孤立的噪声一定会分布在两边(要么很小,要么很大),这样子取出的中值点可以很好地保留像素信息,而滤除了噪声点的影响。中值滤波器受滤波窗口大小影响较大,用于消除噪声和保护图像细节,两者会存在冲突。如果窗口较小,则能较好地保护图像中的一些细节信息,但对噪声的过滤效果就会打折扣;反之,如果窗口尺寸较大则会有较好的噪声过滤效果,但也会对图像造成一定的模糊效果,从而丢失一部分细节信息。另外,如果在滤波窗口内的噪声点的个数大于整个窗口内像素的个数,则中值滤波就不能很好的过滤掉噪声。
自适应中值滤波器(Adaptive Median Filter)
在噪声密度不是很大的情况下(根据经验,噪声的出现的概率小于0.2),使用中值滤波的效果不错。但是当噪声出现的概率比较高时,原来的中值滤波算法就不是很有效了。只有增大滤波器窗口尺寸,尽管会使图像变得模糊。
使用自适应中值滤波器的目的就是,根据预设好的条件,动态地改变中值滤波器的窗口尺寸,以同时兼顾去噪声作用和保护细节的效果。
下面是自适应中值滤波器算法的详细描述:
预先定义好以下符号:
SxySxy:滤波器的作用区域,滤波器窗口所覆盖的区域,该区域中心点为图像中第y行第x列个像素点;
ZminZmin:SxySxy中最小的灰度值;
ZmaxZmax:SxySxy中最大的灰度值;
ZmedZmed:SxySxy中所有灰度值的中值;
ZxyZxy:表示图像中第y行第x列个像素点的灰度值;
SmaxSmax:SxySxy所允许的最大窗口尺寸;
自适应中值滤波器分为以下两个过程,A和B:
A:
1. A1 = ZmedZmed - ZminZmin
2. A2 = ZmedZmed - ZmaxZmax
3. 如果A1>0A1>0 且 A2<0A2<0,则跳转到B
4. 否则,增大窗口的尺寸
5. 如果增大后的尺寸≤≤SmaxSmax,则重复A
6. 否则,直接输出ZmedZmed
B:
1. B1 = ZxyZxy - ZminZmin
2. B2 = ZxyZxy - ZmaxZmax
3. 如果B1>0B1>0 且 B2<0B2<0,则输出ZxyZxy
4. 否则输出ZmedZmed
直观解释
在自适应中值滤波算法中,A步骤里面会先判断是否满足Zmin
接下来考虑跳转到B之后的情况:判断中心点的像素值是否是噪声点,判断条件为Zmin
%*******************************************%———自适应中值滤波法去除大密度椒盐噪声———% 主要思想% 判断当前像素是否为噪声点% 1) NO ->不处理% 2) YES->自适应中值滤波 % 3) 边缘处理% 04/01/2018%******************************************close all;clc;clear allset(0,'defaultfigurecolor','w')%读取图像I=imread('rice.png');%变为灰度图% 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)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(Bmin) J(i,j)=B; break; end end end endend%边缘处理%第一行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);