构造函数addSaltNoise.m
,接受参数snr
为图像信噪比,为实验用图test.tif
增加椒盐噪声
% addSaltNoise.m
function [sImg] = addSaltNoise(snr)
img=imread('test.tif');
[imgH,imgW]=size(img);
sImg=img;
% 根据图像信噪比产生噪声点数量
sp=imgH*imgW;
np=sp*(1-snr);
% 随机行列,给图像添加噪声
for i=1:np
x=uint32(rand()*imgH);
y=uint32(rand()*imgW);
if x && y
r=rand()>0.5;
if r
sImg(x,y)=0;
else
sImg(x,y)=255;
end
end
end
subplot(1,2,1);
imshow(img),title('原始图像');
subplot(1,2,2);
imshow(sImg),title('信噪比为0.5的椒盐噪声图像');
end
信噪比为0.5时的椒盐噪声图像,如下图所示:
构造函数addGaussianNoise.m
,接受参数avg为均值,std为标准差,为实验用图test.tif
增加高斯噪声
% addGaussianNoise.m
function [gImg] = addGaussianNoise(avg,std)
img=imread('test.tif');
[imgH,imgW]=size(img);
% 产生和图像维度相同的噪声,叠加到图像上
gImg=uint8((double(img)/255+avg+std*randn(imgH,imgW))*255);
% subplot(1,2,1);
% imshow(img),title('原始图像');
%
% subplot(1,2,2);
% imshow(gImg),title('均值为'+string(avg)+'标准差为'+string(std)+'的高斯噪声图像');
产生的高斯噪声效果如下图
算术均值滤波器
编写函数meanValueFilter.m
,参数fsize
为滤波器大小
% meanValueFilter.m
function []=meanValueFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sNewImg(i,j)=sum(sTemp(:))/numel(sTemp);
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gNewImg(i,j)=sum(gTemp(:))/numel(gTemp);
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('均值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('均值滤波器处理后图像');
end
大小为3x3的算术均值滤波器处理椒盐噪声结果
大小为3x3的算术均值滤波器处理高斯噪声结果
几何均值滤波器
编写函数geometricMeanFilter.m
,参数fsize
为滤波器大小
function []=geometricMeanFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sNewImg(i,j)=prod(prod(sTemp(:)))^(1/numel(sTemp));
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gNewImg(i,j)=prod(prod(gTemp(:)))^(1/numel(gTemp));
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('几何均值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('几何均值滤波器处理后图像');
end
大小为3x3的几何均值滤波器处理椒盐噪声结果
大小为3x3的几何均值滤波器处理高斯噪声结果
谐波均值滤波器
编写函数harmonicMeanFilter.m
,参数fsize
为滤波器大小
function []=harmonicMeanFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sTemp=1./sTemp;
sNewImg(i,j)=numel(sTemp)/sum(sTemp(:));
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gTemp=1./gTemp;
gNewImg(i,j)=numel(gTemp)/sum(gTemp(:));
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('谐波均值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('谐波均值滤波器处理后图像');
end
大小为3x3的谐波均值滤波器处理椒盐噪声结果
大小为3x3的谐波均值滤波器处理高斯噪声结果
逆谐波均值滤波器
编写函数inverseHarmonicMeanFilter.m
,参数fsize
为滤波器大小,q为阶数
function []=inverseHarmonicMeanFilter(fsize,q)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = double (sImg(i-flength:i+flength,j-flength:j+flength));
sNewImg(i,j)=sum(sTemp(:).^(q+1))/sum(sTemp(:).^(q));
gTemp = double (gImg(i-flength:i+flength,j-flength:j+flength));
gNewImg(i,j)=sum(gTemp(:).^(q+1))/sum(gTemp(:).^(q));
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('逆谐波均值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('逆谐波均值滤波器处理后图像');
end
大小为3x3,阶数为1.5的逆谐波均值滤波器处理椒盐噪声结果
大小为3x3,阶数为1.5的逆谐波均值滤波器处理高斯噪声结果
中值滤波器
编写函数middleFilter.m
,参数fsize
为滤波器大小
function []=middleFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sTemp = sort(sTemp(:));
sNewImg(i,j)=sTemp((numel(sTemp)-1)/2);
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gTemp = sort(gTemp(:));
gNewImg(i,j)=gTemp((numel(gTemp)-1)/2);
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('中值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('中值滤波器处理后图像');
end
大小为3x3的中值滤波器处理椒盐噪声结果
大小为3x3的中值滤波器处理高斯噪声结果
最大值和最小值滤波器
最大值滤波器
编写函数maxFilter.m
,参数fsize
为滤波器大小
function []=maxFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sNewImg(i,j)= max(sTemp(:));
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gNewImg(i,j)=max(gTemp(:));
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('最大值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('最大值滤波器处理后图像');
end
大小为3x3的最大值滤波器处理椒盐噪声结果
大小为3x3的最大值滤波器处理高斯噪声结果
最小值滤波器
编写函数minFilter.m
,参数fsize
为滤波器大小
function []=minFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sNewImg(i,j) = min(sTemp(:));
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gNewImg(i,j) = min(gTemp(:));
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('最小值滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('最小值滤波器处理后图像');
end
大小为3x3的最小值滤波器处理椒盐噪声结果
大小为3x3的最小值滤波器处理高斯噪声结果
中点滤波器
编写函数mPointFilter.m
,参数fsize
为滤波器大小
function []=mPointFilter(fsize)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sNewImg(i,j) = (min(sTemp(:))+max(sTemp(:)))/2;
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gNewImg(i,j) = (min(gTemp(:))+max(gTemp(:)))/2;
end
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('中点滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('中点滤波器处理后图像');
end
大小为3x3的中点滤波器处理椒盐噪声结果
大小为3x3的中点滤波器处理高斯噪声结果
修正后的阿尔法均值滤波器
编写函数alphaFilter.m
,参数fsize
为滤波器大小,d为0-fsize^2之间的数字
function []=alphaFilter(fsize,d)
% 获取信噪比为0.5的椒盐噪声图像
sImg = addSaltNoise(0.5);
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = addGaussianNoise(0,0.1);
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
if d0
sTemp = sImg(i-flength:i+flength,j-flength:j+flength);
sTemp = sort(sTemp(:));
sTemp=sTemp(d:numel(sTemp)-1);
sNewImg(i,j)=sum(sTemp())/numel(sTemp);
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
gTemp = sort(gTemp(:));
gTemp=gTemp(d:numel(gTemp)-1);
gNewImg(i,j)=sum(gTemp())/numel(gTemp);
end
end
end
else
fprintf("d请传入0-fsize^2之间的数!");
end
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('修正后的阿尔法滤波器处理后图像');
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('修正后的阿尔法滤波器处理后图像');
end
大小为3x3的修正后的阿尔法均值滤波器(d=1)处理椒盐噪声结果
大小为3x3的修正后的阿尔法均值滤波器(d=1)处理高斯噪声结果
自适应滤波器
编写函数alphaFilter.m
,参数fsize
为滤波器大小
function []=adaptFilter(fsize)
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = double(addGaussianNoise(0,0.1));
[imgH,imgW]=size(gImg);
gNewImg = gImg;
% 根据滤波器尺寸计算半长
if mod(fsize,2)
flength = (fsize-1)/2;
else
flength = fsize/2;
end
% 处理图像,结果保存在gNewImg
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
gTemp = gImg(i-flength:i+flength,j-flength:j+flength);
avg = mean(gTemp(:));
v = var(gTemp(:));
gNewImg(i,j)=gImg(i,j)-255*255*0.01/v*(gImg(i,j)-avg);
end
end
gImg = uint8(gImg);
gNewImg=uint8(gNewImg);
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('自适应滤波器处理后图像');
end
大小为7x7的自适应滤波器处理,方差为6502.5的高斯噪声结果
自适应中值滤波器
编写函数alphaFilter.m
,参数fmax
为滤波器最大尺寸
function []=adaptMiddleFilter(fmax)
% 获取信噪比为0.5的椒盐噪声图像
sImg = double(addSaltNoise(0.5));
% 获取均值为0,标准差为0.1的高斯噪声图像
gImg = double(addGaussianNoise(0,0.1));
[imgH,imgW]=size(sImg);
sNewImg=sImg;
gNewImg=gImg;
% 计算滤波器最大半长
if mod(fmax,2)
flength = (fmax-1)/2;
else
flength = fmax/2;
end
% 处理图像,结果分别保存在sNewImg和gNewImg
% zmax为s区域中的灰度最大值
% zmin为s区域中的灰度最小值
% zmed为s区域中的灰度中间值
for i=1+flength:imgH-flength
for j=1+flength:imgW-flength
len = 1;
while len<=flength
sTemp = sImg(i-len:i+len,j-len:j+len);
sTemp=sort(sTemp(:));
zsmed=sTemp((numel(sTemp)-1)/2);
zsmin=min(sTemp);
zsmax=max(sTemp);
ag1 = zsmed-zsmin;
ag2 = zsmed-zsmax;
if ag1>0 && ag2<0
break;
else
len=len+1;
end
end
if len==flength+1
sNewImg(i,j)=sImg(i,j);
else
bs1=sImg(i,j)-zsmin;
bs2=sImg(i,j)-zsmax;
if bs1>0 && bs2<0
sNewImg(i,j)=sImg(i,j);
else
sNewImg(i,j)=zsmed;
end
end
len = 1;
while len<=flength
gTemp = gImg(i-len:i+len,j-len:j+len);
gTemp=sort(gTemp(:));
zgmed=gTemp((numel(gTemp)-1)/2);
zgmin=min(gTemp);
zgmax=max(gTemp);
ag1 = zgmed-zgmin;
ag2 = zgmed-zgmax;
if ag1>0 && ag2<0
break;
else
len=len+1;
end
end
if len==flength+1
gNewImg(i,j)=gImg(i,j);
else
bg1=gImg(i,j)-zgmin;
bg2=gImg(i,j)-zgmax;
if bg1>0 && bg2<0
gNewImg(i,j)=gImg(i,j);
else
gNewImg(i,j)=zgmed;
end
end
end
end
% 处理完后转化为uint8
sImg=uint8(sImg);
sNewImg=uint8(sNewImg);
subplot(1,2,1);
imshow(sImg),title('椒盐噪声图像');
subplot(1,2,2);
imshow(sNewImg),title('自适应中值滤波器处理后图像');
gImg=uint8(gImg);
gNewImg=uint8(gNewImg);
figure();
subplot(1,2,1);
imshow(gImg),title('高斯噪声图像');
subplot(1,2,2);
imshow(gNewImg),title('自适应中值滤波器处理后图像');
end
最大尺寸为7x7的自适应滤波器处理椒盐噪声结果
最大尺寸为7x7的自适应滤波器处理高斯噪声结果