1.原理
自适应局部降噪滤波器函数代码
function [f] = adpfilter(g, nhood ,noiseVar)
g = im2double(g);
%局部均值 u=(1/mn)*∑g(x,y) 模板滤波,重叠区相*然后相加
localMean = filter2(ones(nhood), g) / prod(nhood);
%局部方差 σ^2=(1/mn)*∑g^2(x,y)-u^2
localVar = filter2(ones(nhood), g.^2) / prod(nhood) - localMean.^2;
f = g - localMean; % g(x,y)-u
g = localVar - noiseVar; %局部方差 - 噪声方差
g = max(g, 0);
f = localMean + ((f ./ max(localVar, noiseVar)) .* g); % 公式
end
%例5.4自适应局部降低噪声滤波
g=imread('Fig0508.tif');
H1=imnoise(g,'gaussian',0,10^3/255^2);
subplot(221),imshow(H1, []), title('(a)被均值为0方差为1000的加性高斯噪声污染的图像');
H2=fspecial('average',[7,7]);%7*7均值滤波
H2=imfilter(H1,H2);
subplot(222),imshow(H2, []), title('(b)算数均值滤波的结果');
H3=exp(imfilter(log(double(H1)),fspecial('average',[7,7])));%7*7算数均值滤波
subplot(223),imshow(H3, []), title('(c)几何均值滤波结果');
H4 = adpfilter(H1,[7,7],1000);%使用自定义函数
subplot(224),imshow(H4, []), title('(d)自适应滤波器');
二.自适应中值滤波器
1.原理
中值滤波器,只要脉冲噪声的空间密度不大,性能就会很好(根据经验,Pa和Pb小于 0.2)。自适应中值滤波可以处理具有更大概率的脉冲噪声。自适应中值滤波器的另一个优点是平滑非脉冲噪声时试图保留细节,这是传统中值滤波器所做不到的。自适应中值滤波器也工作于矩形窗口区域Sxy内。不同的是自适应中值滤波器在进行滤波处理时会根据某些条件而改变(或增大)Sxy的尺寸。
在模板窗口Sxy定义的滤波器区域内定义如下变量:
进程A:
A1=Zmed-Zmin
A2=Zmed-Zmax
如果A1>0且A2<0,则转至进程B
否则增大窗口尺寸
如果窗口尺寸<=Smax,则重复进程A
否则输出Zmed
进程B:
B1=Zxy-Zmin
B2=Zxy-Zmax
如果B1>0且B2<0,则输出Zxy
否则输出Zmed
%自适应中值滤波函数
function II=adpmedianfilter(I,Smax)
%Smax约束,噪声密度越大,Smax应当设置越高
if (Smax<=1)||(Smax/2==round(Smax/2))||(Smax~=round(Smax))
error('Smax must be an odd integer >1');
end
%初始化
II=I;
II(:)=0;
%创建大小为I的0矩阵 表示已经处理的点,1表示已经处理
alreadyProcessed=false(size(I));
%迭代
% 步长为2 循环增大窗口的尺寸 如果窗口尺寸《= Smax
for k=3:2:Smax
%最小灰度 二维顺序统计量滤波函数 对称拓展边界
zmin=ordfilt2(I,1,ones(k,k),'symmetric');
%最大灰度
zmax=ordfilt2(I,k*k,ones(k,k),'symmetric');
%中值滤波 中值灰度
zmed=medfilt2(I,[k k],'symmetric');
%进程A 需要转到B步骤的像素
processUsingLevelB=(zmed>zmin)&(zmax>zmed)&(~alreadyProcessed);
zB=(I>zmin)&(zmax>I);
%满足步骤A,B的输出原值 对应的像素位置
outputZxy=processUsingLevelB&zB;
%满足A,不满足B的输出中值 对应的像素位置
outputZmed=processUsingLevelB&~zB;
II(outputZxy)=I(outputZxy);
II(outputZmed)=zmed(outputZmed);
%处理过的像素
alreadyProcessed=alreadyProcessed|processUsingLevelB;
if all(alreadyProcessed(:))
break;
end
end
%超过窗口大小没被处理的像素位置 输出原值
II(~alreadyProcessed)=I(~alreadyProcessed);
%例5.5自适应中值滤波的说明
g=imread('Fig0508.tif');
subplot(221),imshow(g, []), title('原图');
H1 = imnoise(g,'salt & pepper', .25); %添加椒盐噪声(脉冲噪声)
subplot(222),imshow(H1, []), title('被密度为0.25的椒盐噪声污染的图像');
H3=adpmedian(H1,7);%自适应中值过滤器
subplot(224),imshow(H3, []), title('使用S=7的自适应中值滤波得到的结果');
H2=medfilt2(H1,[7 7], 'symmetric');%中值滤波
subplot(223),imshow(H2, []), title('使用大小为7*7的中值滤波器得到的结果');
运行结果