自适应中值滤波器matlab实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

将下面代码直接贴入matlab中,并将读入图像修改成自己机子上的,就可以运行了。可以按照“%%”顺序分步来运行

%% function 自适应中值滤波器

%%%%%%%%%%%%%%%

%实现两个功能:

%1.对高密度的椒盐噪声有好的滤除效果;

%2.滤波时减少对图像的模糊;

%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%

%原理:

%1.椒盐噪声概率越大,滤波器窗口需越大。故若滤波器窗口随噪声概率自适应变化,才能有好的滤除效果

%2.为减少对图像的模糊,需在得出原图像值并非椒盐噪声点时,保留原图像值不变;

%3.椒盐噪声点的特点:该点的值为该点领域上的最大或最小;%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%

%步骤(得到图像中某点(x,y)(即窗口中心点)的值的步骤):

%1.设定一个起始窗口,以及窗口的最大尺寸;

%2.(此步用于确定窗口大小)对窗口内像素排序,判断中值是否是噪声点,若不是,继续第3步,若是,转到第5步;

%3.判断中心点是否是噪声点,若不是,则输出该点的值(即图像中该点的原值不变);若是,则输出中值;

%4.窗口尺寸增大,若新窗口尺寸小于设定好的最大值,重复第2步,若大于,则滤波器输出前一个窗口的中值;

%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%

%参数说明:

%被噪声污染的图像(即退化图像也即待处理图像):Inoise

%滤波器输出图像:Imf

%起始窗口尺寸:nmin*nmin(只取奇数),窗口尺寸最大值:nmax*nmax %图像大小:Im*In

%窗口内图像的最大值Smax,中值Smed,最小值Smin

%%%%%%%%%%%%%%%%%%%%

%%

clear

clf

%% 读入图像I

I=imread('e:/photo/cat.jpg');

%转化为灰度图Ig

Ig=rgb2gray(I);

%被密度为0.2的椒盐噪声污染的图像Inoise

Inoise=imnoise(Ig,'salt & pepper',0.2);

%或者是被方差为0.2的高斯噪声污染的图像Inoise

%Inoise=imnoise(Ig,'gaussian',0.2);

%显示原图的灰度图Ig和噪声图像Inoise

subplot(2,2,1),imshow(Ig);xlabel('a.原始灰度图像');

subplot(2,2,2),imshow(Inoise);xlabel('b.被噪声污染的图像');

%% 定义参数

%获取图像尺寸:Im,In

[Im,In]=size(Inoise);

%起始窗口尺寸:nmin*nmin(窗口尺寸始终取奇数)

nmin=3;

%最大窗口尺寸:nmax*nmax

nmax=9;

%定义复原后的图像Imf

Imf=Inoise;

%为了处理到图像的边界点,需将图像扩充

%因为窗口尺寸是弹性的,所以将Inoise固定扩充到最大:I_ex[(Im+(nmax-1))*(In+(nmax-1))]

I_ex=[zeros((nmax-1)/2,In+(nmax-1));zeros(Im,(nmax-

1)/2),Inoise,zeros(Im,(nmax-1)/2);zeros((nmax-1)/2,In+(nmax-1))];

%% 自适应滤波过程

%遍历图像Inoise中的每一点

for x=1:Im

for y=1:In

for n=nmin:2:nmax

%图像Inoise中的某点(x,y)的领域Sxy,对应在I_ex中为(x+[(nmax-1)/2-(n-1)/2]:x+[(nmax-1)/2-(n-1)/2]+(n-1),y+(nmax-1)/2-(n-

1)/2:y+[(nmax-1)/2-(n-1)/2]+(n-1))

Sxy=I_ex(x+(nmax-1)/2-(n-1)/2:x+(nmax-1)/2+(n-1)/2,y+(nmax-1)/2-(n-1)/2:y+(nmax-1)/2+(n-1)/2);

Smax=max(max(Sxy));%求出窗口内像素的最大值

Smin=min(min(Sxy));%求出窗口内像素的最小值

Smed=median(median(Sxy));%求出窗口内像素的中值

%判断中值是否是噪声点

if Smed>Smin && Smed

%若中值既大于最小值又小于最大值,则不是

%是,则退出该if语句,增大窗口尺寸,再次判断

%不是,则判断该点的原值是不是噪声点

if Imf(x,y)<=Smin || Imf(x,y)>=Smax

%若该点的原值既大于最小值又小于最大值,则不是

%不是,则输出原值,即不作处理

%是,则输出中值

Imf(x,y)=Smed;

end

break

%有输出则不再进行循环判断

end

end

%当n=max时,输出中值

Imf(x,y)=Smed;

end

end

subplot(2,2,3),imshow(Imf);xlabel('d.最大尺寸为9的自适应中值滤波器的滤波效果');

%% 与普通中值滤波器的对比

Imf1=medfilt2(Inoise,[3,3]);

Imf2=medfilt2(Imf1,[3,3]);

subplot(2,2,4),imshow(Imf2);xlabel('e.尺寸为3的普通中值滤波器两次滤波效果'); 下面是运行结果:

相关文档
最新文档