1.均值滤波器
均值滤波器:均值滤波器是一种最简单的滤波器,也是一种线性滤波器。该滤波器的原理是用某个像素周围的相邻像素的平均值替代该像素的值,从而实现去噪的效果。均值滤波器容易实现,但会使图像失去一些细节和边缘等信息。
close all;
clear all;
clc;
I=imread('lena.bmp');
I=rgb2gray(I);
g=imnoise(I,'salt & pepper',0.25);
g=double(g)/255;
m=3;n=3;
%算术均值滤波器
w1=fspecial('average',[5 5]);
J1=imfilter(g,w1);
%几何均值滤波器
J2=exp(imfilter(log(g),ones(m,n),'replicate') ).^(1/m/n); %几何均值滤波
%谐波均值滤波器
J3=m*n./imfilter(1./(g+eps),ones(m,n),'replicate'); %谐波均值滤波
%逆谐波均值滤波器
q=3/2;
J4=imfilter(g.^(q+1),ones(m,n),'replicate');
J4=J4./(imfilter(g.^q,ones(m,n),'replicate')+eps); % 逆谐波均值滤波
figure;
subplot(231),imshow(I);
subplot(232),imshow(g),title('加椒盐噪声');
subplot(233),imshow(J1),title('算术均值滤波');
subplot(234),imshow(J2),title('几何均值滤波');
subplot(235),imshow(J3),title('谐波均值滤波');
subplot(236),imshow(J4),title('逆谐波均值滤波');
2.顺序统计滤波器
顺序统计滤波器:顺序统计滤波器是指对某个像素周围的相邻像素按照一定顺序进行排序,并选择其中某个位置的像素值作为该像素的值。例如,中值滤波器就是一种常见的顺序统计滤波器。与均值滤波器不同,顺序统计滤波器可以保留图像细节和边缘信息,同时有效去除图像噪声。
close all;
clear all;
clc;
I=imread('lena.bmp');
I=rgb2gray(I);
g=imnoise(I,'salt & pepper',0.2);
g1=double(g)/255;
J1=medfilt2(g1,'symmetric');%中值滤波
J2=ordfilt2(g1,median(1:3*3),ones(3,3),'symmetric');%中点滤波
J3=ordfilt2(g1,1,ones(3,3));%最小值滤波
J4=ordfilt2(g1,9,ones(3,3));%最大值滤波
figure;
subplot(231),imshow(I);
subplot(232),imshow(g),title('加椒盐噪声');
subplot(233),imshow(J1),title('中值滤波');
subplot(234),imshow(J2),title('中点滤波');
subplot(235),imshow(J3),title('最小值滤波');
subplot(236),imshow(J4),title('最大值滤波');
3.自适应空间滤波器
自适应空间域滤波器:自适应空间域滤波器是指根据局部像素的统计特征,自适应地选择滤波器模板的大小和权值,并计算该像素的值。例如,自适应中值滤波器就是一种常见的自适应空间域滤波器,它能够根据局部像素的方差和中值等信息,自适应地选择滤波器模板的大小和性质,从而更好地处理图像中的噪声。
close all;
clear all;
clc;
I=imread('lena.bmp');
I=rgb2gray(I);
g=imnoise(I,'salt & pepper',0.25);
J1=medfilt2(g,[5 5],'symmetric');
J2=adpmedian(g,5);
figure;
subplot(221),imshow(I);
subplot(222),imshow(g),title('加椒盐噪声');
subplot(223),imshow(J1),title('中值滤波');
subplot(224),imshow(J2),title('自适应滤波');
%--------------------------------------------------------------------------%
function f=adpmedian(g,Smax)
if(Smax<=1)||(Smax/2 == round(Smax/2))||(Smax~=round(Smax))
error('SMAX must be an odd integer > 1.');
end
f = g;
f(:) = 0;
alreadyProcessed = false(size(g));
for k= 3:2:Smax
zmin = ordfilt2(g,1,ones(k,k),'symmetric');
zmax = ordfilt2(g,k*k,ones(k,k),'symmetric');
zmed = medfilt2(g,[k k],'symmetric');
processUsingLevelB = (zmed>zmin) & (zmax > zmed) & ...
~alreadyProcessed;
zB=(g>zmin) & (zmax>g);
outputZxy = processUsingLevelB & zB;
outputZmed = processUsingLevelB & ~zB;
f(outputZxy) = g(outputZxy);
f(outputZmed) = zmed(outputZmed);
alreadyProcessed = alreadyProcessed | processUsingLevelB;
if all(alreadyProcessed(:))
break;
end
end
f(~alreadyProcessed) = zmed(~alreadyProcessed);
end