实现自适应均值滤波,并和算术均值滤波的结果做对比
Posted My heart will go ~~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现自适应均值滤波,并和算术均值滤波的结果做对比相关的知识,希望对你有一定的参考价值。
直接看代码
%% 导入原图像,并添加高斯噪声
image=imread('aft.jpg');
imagen=rgb2gray(image);
[width,height]=size(imagen);
r1=rand(width,height);%用于产生高斯噪声
r2=rand(width,height);
x=0.1*sqrt(-2*log(r1)).*cos(2*pi*r2); %产生了噪声
imagen=x+double(imagen)/255;%为了加上高斯噪声,需要将图像变为double型
imagen=uint8(255*imagen); %再转回图像的格式
subplot(1,3,1);
imshow(imagen);
title('原图像');
%先进行均值滤波,看效果
imagen=double(imagen);
k1=3;%k1阶均值滤波
imagedd=imagen;
a=ones(k1,k1);
for i=1:width-k1+1
for j=1:height-k1+1
pattern=imagen(i:i+k1-1,j:j+k1-1).*a;
means=sum(sum(pattern));
imagedd(i+(k1-1)/2,j+(k1-1)/2)=means/(k1*k1);
end
end
subplot(1,3,2)
imshow(uint8(imagedd))
title('均值滤波')
%% 再进行自适应均值滤波,进行对比
imagenn=double(imagen);
iamgee=double(rgb2gray(image)); %取未加噪声的原图像的灰度
imagedd=imagenn;
imagemean=imagenn;
imagevar=imagenn;
n=7;%滤波器阶数为7
sigma=(imagenn-iamgee).^2; %噪声方差
for i=1:width-n+1
for j=1:height-n+1
pattern=imagenn(i:i+n-1,j:j+n-1);
patterns=reshape(pattern,1,length(pattern(:)));
means=mean(patterns);%求均值
imagemean(i+(n-1)/2,j+(n-1)/2)=means;
vars=var(patterns,1);%求方差
imagevar(i+(n-1)/2,j+(n-1)/2)=vars;
end
end
da=(sigma<1);%噪声方差接近于0时不处理
dc=~da&(abs(sigma-imagevar)<=100); %噪声方差与局部方差接近时,均值滤波
db=~dc; %略有调整
imagedd(da)=imagenn(da);
imagedd(db)=imagemean(db);
imagedd(dc)=imagenn(dc)-(sigma(dc)./imagevar(dc).*(imagenn(dc)-imagemean(dc)));
imagedd=uint8(imagedd);
subplot(1,3,3);
imshow(imagedd);
title('自适应均值滤波');
以上是关于实现自适应均值滤波,并和算术均值滤波的结果做对比的主要内容,如果未能解决你的问题,请参考以下文章