1.了解和掌握图像中噪声的类型,使用MATLAB函数及编程实现多种类型噪声。
2.了解和掌握图像空间域滤波方法,使用MATLAB函数及编程实现多种类型的空间滤波。
3.分析各种空间滤波算法的滤波效果,分析各种算法的特点及其应用场合,培养处理实际图像的能力。
1.实验课前需要写预习实验报告,内容为本次实验要求中的所有程序清单。
2.实验课对预习报告中的编程代码进行上机调试,完成实验指导书中全部实验要求内容。
3.实验课后写出实验报告。报告要求有实验目的,实验内容与步骤,调试完成的准确编程代码,实验小结,回答问题。
1.噪声生成
(1)利用imnoise()函数在图像electric.tif 上加入高斯噪声,高斯噪声均值为0,方差分别为0.2,0.5,0.8,在同一个图形窗口显示原图像和加入不同方差噪声图像,比较加入不同方差的高斯噪声对图像的影响;
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\electric.tif ");
figure(1);
subplot(2,2,1);
imshow(I);
title("原图");
subplot(2,2,2);
I1 = imnoise(I,'gaussian',0,0.2);
imshow(I1);
title("均值为0,方差0.2的高斯噪声");
subplot(2,2,3);
I2 = imnoise(I,'gaussian',0,0.5);
imshow(I2);
title("均值为0,方差0.5的高斯噪声");
subplot(2,2,4);
I3 = imnoise(I,'gaussian',0,0.8);
imshow(I3);
title("均值为0,方差0.8的高斯噪声");
(2)利用imnoise()函数在图像electric.tif 上加入椒盐噪声,概率分别为0.2,0.5,0.8,在同一个图形窗口显示原图像和加入不同概率噪声的图像,比较加入不同概率的椒盐噪声对图像的影响。
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\electric.tif ");
figure(1);
subplot(2,2,1);
imshow(I);
title("原图");
subplot(2,2,2);
I1 = imnoise(I,'salt & pepper',0.2);
imshow(I1);
title("概率0.2的椒盐噪声");
subplot(2,2,3);
I2 = imnoise(I,'salt & pepper',0.5);
imshow(I2);
title("概率0.5的椒盐噪声");
subplot(2,2,4);
I3 = imnoise(I,'salt & pepper',0.8);
imshow(I3);
title("概率0.8的椒盐噪声");
2.空间滤波去除噪声
(1)利用medfilt2() 函数对实验1(2)中加了椒盐噪声的图像electric.tif 进行模板为3✕3的中值滤波(参数选择:default),比较同一大小模板的中值滤波对不同程度噪声的滤波效果;
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\electric.tif ");
figure(1);
subplot(2,2,1);
imshow(I);
title("原图");
subplot(2,2,2);
I1 = imnoise(I,'salt & pepper',0.2);
imshow(I1);
title("概率0.2的椒盐噪声");
subplot(2,2,3);
I2 = imnoise(I,'salt & pepper',0.5);
imshow(I2);
title("概率0.5的椒盐噪声");
subplot(2,2,4);
I3 = imnoise(I,'salt & pepper',0.8);
imshow(I3);
title("概率0.8的椒盐噪声");
figure(2);
subplot(1,3,1)
J = medfilt2(I1);
imshow(J);
subplot(1,3,2)
J1 = medfilt2(I2);
imshow(J1);
subplot(1,3,3)
J2 = medfilt2(I3);
imshow(J2);
(3)利用medfilt2() 函数对实验1(2)中加了同一种程度椒盐噪声(概率为0.5)的图像electric.tif 进行模板为3✕3、5✕5、9✕9的中值滤波,比较不同大小模板对同一种程度噪声的滤波效果;
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\electric.tif ");
figure(1);
subplot(2,2,1);
I1 = imnoise(I,'salt & pepper',0.5);
imshow(I1);
title("概率0.5的椒盐噪声");
subplot(2,2,2);
J = medfilt2(I1);
imshow(J);
title("使用模板为3X3的中值滤波")
subplot(2,2,3);
J1 = medfilt2(I1,[5 5]);
imshow(J1);
title("使用模板为5X5的中值滤波")
subplot(2,2,4);
J2 = medfilt2(I1,[9 9]);
imshow(J2);
title("使用模板为9X9的中值滤波")
(4)利用imnoise()函数在图像electric.tif 上加入高斯噪声(均值为0,方差为0.2)和椒盐噪声(概率为0.2),利用medfilt2() 函数对加了高斯和椒盐噪声的图像分别进行均值滤波和中值滤波处理,模板为3✕3,比较中值滤波和均值滤波的效果。
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\electric.tif ");
figure(1);
subplot(1,3,1)
I1 = imnoise(I,'gaussian',0,0.2);
J1 = imnoise(I1,'salt & pepper',0.2);
imshow(J1)
title("加入高斯噪声和椒盐噪声的图像")
subplot(1,3,2)
J2 = medfilt2(J1);
imshow(J2);
title("使用模板为3X3的中值滤波")
subplot(1,3,3)
J3=filter2(fspecial('average',3),J1)/255;
imshow(J3);
title("使用模板为3X3的均值滤波")
3.图像的锐化滤波
(1)利用函数fspecial()和filter2()实现对图像(building.tif)的’laplacian’滤波器的锐化滤波增强;
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\building.tif ");
figure(1);
subplot(1,3,1);
imshow(I)
title("原图")
subplot(1,2,2);
I=im2double(I); %因为原图是一幅uint8类图像,输出结果仍为uint8类,所有像素均为正值,而拉普拉斯滤波模板中存在负值,变换结果中的所有负值被截掉了。
w = fspecial('laplacian',0); %建立预定义滤波算子
I2 = imfilter(I, w,'replicate');
subplot(1,3,2)
imshow(I2)
subplot(1,3,3)
t3=I-I2; %此图像即含有负值的滤波结果,相比于原图,丢失了一些灰度色调,故还需用原图减去此滤波结果(以还原失去的灰度色调)
imshow(t3)
title("laplacian滤波器的锐化滤波增强")
(2)利用函数fspecial()和filter2()实现对图像(building.tif)的均值滤波;
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\building.tif ");
figure(1);
subplot(1,2,1);
imshow(I)
title("原图")
subplot(1,2,2);
w = fspecial('average',[3 3]); %建立预定义滤波算子
I2 = imfilter(I, w);
imshow(I2)
title("均值滤波")
(3)将原图像和两种滤波的图像在一个图形窗口显示,并比较两种滤波器滤波的效果。
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\building.tif ");
figure(1);
subplot(1,3,1);
imshow(I)
title("原图")
subplot(1,3,2);
w = fspecial('laplacian',0); %建立预定义滤波算子
I2 = imfilter(I, w,'replicate');
imshow(I-I2)
title("laplacian滤波器的锐化滤波增强")
subplot(1,3,3);
w1 = fspecial('average',[3 3]); %建立预定义滤波算子
I21 = imfilter(I, w1);
imshow(I21);
title("均值滤波");
4.滤波器去噪效果评价
设计一个滤波实验,对数字图像中的高斯噪声和均值噪声进行去除。要求自己编写中值滤波器和均值滤波器(不能调用MATLAB中fspecial()函数和filter2()函数)程序,并能够定性评价:
(1)中值滤波器和均值滤波对数字图像中的高斯噪声和均值噪声的去噪效果;
代码:
clc;
clf;
I = imread("C:\Users\25023\Desktop\图像识别文件\实验三用到的图像\electric.tif ");
figure(1);
subplot(2,4,1);
imshow(I);
title("原图");
subplot(2,4,2);
I1 = imnoise(I,'gaussian',0,0.2);
imshow(I1);
title("均值为0,方差0.2的高斯噪声");
subplot(2,4,3);
I2 = imnoise(I,'salt & pepper',0.5);
imshow(I2);
title("概率0.5的椒盐噪声");
%自编程实现中值滤波
subplot(2,4,4);
FilterMid = mid(I2,5);
imshow(FilterMid),title('椒盐中值滤波后的结果');
%自编程实现中值滤波
subplot(2,4,5);
FilterMid = mid(I1,9);
imshow(FilterMid),title('高斯中值滤波后的结果');
subplot(2,4,6);
x2 = avg(I1,5);
g = uint8(x2);
imshow(g);
title("高斯均值滤波后的结果");
subplot(2,4,7);
x2 = avg(I2,9);
g = uint8(x2);
imshow(g);
title("椒盐均值滤波后的结果");
function result = mid(I2,n)
[height, width] = size(I2); %获取图像尺寸
FilterMid = I2;
for row = (n+1)/2:height-(n-1)/2
for col = (n+1)/2:width-(n-1)/2
temp = double(I2(row-((n-1)/2):row+((n-1)/2),...
col-((n-1)/2):col+((n-1)/2))); %获取模板区域
%中值滤波
template2 = sort(temp(:)); %对模板区域内像素值进行排序
FilterMid(row, col) = template2((n*n+1)/2); %更新模板中心像素值
end
end
result = FilterMid;
end
function result = avg(I2,n)
template = ones(n);
[height, width] = size(I2);
x1 = double(I2);
x2 = x1;
for i = 1:height-n+1
for j = 1:width-n+1
c = x1(i:i+n-1,j:j+n-1).*template;
s = sum(sum(c));
x2(i+(n-1)/2,j+(n-1)/2) = s/(n*n);
end
end
result = x2;
end
截图: