数字图像处理:实验四

  1. 采用邻域平均法对被椒盐噪声和高斯噪声分别污染(噪声强度均设定为0.05)的图像进行滤波,要求分别采用下列3种不同的掩模处理,并分别进行比较说明;

在这里插入图片描述

  1. Matlab程序:(2016a版本)
1.	clc;  
2.	clear;  
3.	close all;  
4.	img=imread('hua.jpg');   
5.	img1=imnoise(img,'salt & pepper',0.05);% 0.05的椒盐噪声
6.	img2 = imnoise(img,'gaussian',0.05);% 0.05的高斯噪声  
7.	H1=[0,1,0;1,1,1;0,1,0]/4;%定义H1掩模  
8.	H2=ones(3,3)/9;%定义H2掩模  
9.	H3=[1,2,1;2,4,2;1,2,1]/16;%定义H3掩模  
10.	
11.	M1=imfilter(img1,H1);%采用H1掩模处理椒盐噪声  
12.	M2=imfilter(img1,H2);%采用H2掩模处理椒盐噪声  
13.	M3=imfilter(img1,H3);%采用H3掩模处理椒盐噪声  
14.	M4=imfilter(img2,H1);%采用H1掩模处理高斯噪声  
15.	M5=imfilter(img2,H2);%采用H2掩模处理高斯噪声  
16.	M6=imfilter(img2,H1);%采用H3掩模处理高斯噪声  
17.	  
18.	subplot(3,3,1),imshow(img); title('原图');   
19.	subplot(3,3,2),imshow(img1); title('加入椒盐噪声(密度:0.05)后效果');   
20.	subplot(3,3,3),imshow(img2); title('加入高斯噪声(密度:0.05)后效果');  
21.	subplot(3,3,4),imshow(M1); title('采用H1掩模处理椒盐噪声图像效果');  
22.	subplot(3,3,5),imshow(M2); title('采用H2掩模处理椒盐噪声图像效果');  
23.	subplot(3,3,6),imshow(M3); title('采用H3掩模处理椒盐噪声图像效果');  
24.	subplot(3,3,7),imshow(M4); title('采用H1掩模处理高斯噪声图像效果');  
25.	subplot(3,3,8),imshow(M5); title('采用H2掩模处理高斯噪声图像效果');  
26.	subplot(3,3,9),imshow(M6); title('采用H3掩模处理高斯噪声图像效果');  

  1. 原始图像、处理后的图像:
    在这里插入图片描述

  2. 处理的过程和结果的说明:
    上述程序分别通过定义H1,H2,H3三种邻域平均模板处理被椒盐噪声和高斯噪声污染的图像,从仿真结果可以看出:邻域平均法实现起来很方便,适用于消除图像中的颗粒噪声,但这种方法既平滑了图像信号,同时使图像的细节部分变得模糊。由以上处理后的图像可以看到:如图所示,H2,H3掩模对椒盐噪声的抑制是比较好的,椒盐噪声较之于H1去除很多。对于高斯噪声来说H1和H3掩模对噪声的抑制效果不如H2掩模,其中H3的高斯盐噪声仍然存在,只不过被削弱了,而H1掩模出现了边缘模糊的现象,因此整体来看H2掩模对于两种噪声的处理效果都是较好的。

(选做)采用超限邻域平均法(阈值法)对被高斯噪声污染的图像(噪声强度均设定为0.05)进行滤波,可使用高斯掩模进行邻域平均(如下所示)。
Matlab程序:(2016a版本)
脚本:test2.m:


1.	% 超限邻域滤波  
2.	clc,clear,close all % 清理命令区、清理工作区、关闭显示图形  
3.	feature jit off % 加速代码运行  
4.	img = imread('hua.jpg');  
5.	img1 = imnoise(img,'gaussian',0.05);%加入噪声密度:0.05的高斯噪声  
6.	img2=rgb2gray(img1);  
7.	img3 = threddmean_filter( img2,5, 5/255 ); % 应用超限邻域滤波  
8.	figure('color',[1,1,1])  
9.	  
10.	subplot(221),imshow(img,[]),title('original image')  
11.	subplot(222),imshow(img1,[]),title('gaussian image')  
12.	subplot(223),imshow(img2,[]),title('灰度图')  
13.	subplot(224),imshow(img3,[]),title('超限邻域滤波效果图')  
可选:效果优化
1.	colormap(jet) % 颜色  
2.	shading interp % 消隐  

函数:threddmean_filter.m:


1.	function Z = threddmean_filter(X,n,thred)  
2.	% 函数对输人图像进行超限邻域平均法滤波  
3.	% 函数输入  
4.	% X:输人二维图像矩阵  
5.	% n:掩膜尺寸  
6.	% thred:阈值  
7.	% 函数输出  
8.	% Z:输出图像矩阵,数据类型与输人相同  
9.	if size(X,3)~=1  
10.	error('图像应该为2维矩阵')  
11.	end  
12.	if ~isa(X,'double')  
13.	X = double(X)/255; % 数据类型  
14.	end  
15.	H = fspecial('average',n); % 均值模板  
16.	Y = imfilter(X, H);  
17.	thre = abs(X-Y)>thred; % 判断哪些是门限  
18.	Z = X; % 赋值  
19.	Z(thre)=Y(thre);  
20.	Z = im2uint8(Z); % 类型转换  
21.	end  
  1. 原始图像、处理后的图像;
    未加颜色效果展示:
    在这里插入图片描述

加颜色效果展示:
在这里插入图片描述

  1. 处理的过程和结果的说明:
    参考资源:网页链接
    查阅资料:该程序主要参考于csdn网站,不过在第一次运行的时候出现错误,提示超限邻域滤波函数输入的图像不是二维矩阵,错误分析为没有进行图像灰度处理,使用数据与rgb2gray函数对图像处理后再将结果图输入超限邻域滤波函数即可。
    编程逻辑:
    与前面一个处理方法类似,先对图像进行预处理,编程核心是超限邻域法,通过一个超限邻域滤波函数来完成超限邻域滤波器的功能;

超限滤波函数思路:

  1. 超限滤波函数有三个输入值图像、掩模、滤波阈值(阈值范围是0-255)
  2. 判断输入图像格式是否正确
  3. 输入图像格式正确后,设定均值模板H
  4. 使用imfilter函数获取输入图像X的像素平均值赋值给Y
  5. 通过abs(X-Y)找出图像中大于阈值thred的点
  6. 将这些点用邻域像素均值替换掉
    邻域平均法的思想是用像素及其指定邻域内像素的平均值或加权平均值作为该像素的新值,以便去除突变的像素点,从而滤除一定的噪声。为了解决邻域平均法造成的图像模糊问题,采用阈值法(又叫做超限邻域平均法,如果某个像素的灰度值大于其邻域像素的平均值,且达到一定水平,判断该像素为噪声,继而用邻域像素的均值取代这一像素值;否则,认为该像素不是噪声点,不予取代。
    分析:当阈值不同时,效果也不同,总是小的噪声先被过滤掉,而大的噪声点需要的阈值减小;当阈值调高时,噪声过滤效果很好,但是同时也损失了原图的部分细节。

2.采用中值滤波法对下图所示的图像分别进行滤波处理, 中值滤波模板不限,可自行选用,以效果最佳为宜。
在这里插入图片描述

  1. Matlab程序:(2016a版本)
1.	clc;  
2.	clear;  
3.	close all;  
4.	%初始化  
5.	img=imread('tupian.png');   
6.	img1 = imnoise(img,'gaussian',0.05);%加入噪声密度:0.05的高斯噪声  
7.	img2 = imnoise(img,'salt & pepper',0.05);%加入噪声密度:0.05的椒盐噪声 
8.	
9.	img3=rgb2gray(img1);%灰度处理,灰度处理后的图像是二维矩阵  
10.	img4=rgb2gray(img2);%灰度处理,灰度处理后的图像是二维矩阵  
11.	%降噪处理  
12.	M1=medfilt2(img3,[5 5]);%对有高斯噪声图像进行3x3中值滤波  
13.	M2=medfilt2(img3,[9 9]);  
14.	M3=medfilt2(img3,[16 16]);  
15.	M4=medfilt2(img4,[5 5]);%对有椒盐噪声图像进行3x3中值滤波  
16.	M5=medfilt2(img4,[9 9]);  
17.	M6=medfilt2(img4,[16 16]);  
18.	%显示图像  
19.	subplot(3,3,1),imshow(img); title('原图');   
20.	subplot(3,3,2),imshow(img1); title('加入高斯噪声(密度:0.05)后效果');   
21.	subplot(3,3,3),imshow(img2); title('加入椒盐噪声(密度:0.05)后效果');   
22.	subplot(3,3,4),imshow(M1); title('对有高斯噪声图像进行5x5中值滤波');  
23.	subplot(3,3,5),imshow(M2); title('对有高斯噪声图像进行9x9中值滤波');  
24.	subplot(3,3,6),imshow(M3); title('对有高斯噪声图像进行16x16中值滤波');  
25.	subplot(3,3,7),imshow(M4); title('对有椒盐噪声图像进行5x5中值滤波');  
26.	subplot(3,3,8),imshow(M5); title('对有椒盐噪声图像进行9x9中值滤波');  
27.	subplot(3,3,9),imshow(M6); title('对有jiaoyan噪声图像进行16x16中值滤波');  
  1. 原始图像、处理后的图像;
    在这里插入图片描述

  2. 处理的过程和结果的说明;
    用中值滤波法对含有高斯噪声图像进行去噪。因为查阅资料中值滤波是常用的非线性滤波方法,也是图像处理技术中最常用的预处理技术。它可以克服线性滤波器给图像带来的模糊,在有效清除颗粒噪声的同时,又能保持良好的边缘特性,从而获得较满意的滤波效果,特别适合于去除图像的椒盐噪声,所以加入椒盐噪声,对比其对于高斯噪声和椒盐噪声滤波的不同效果。
    编程思路:
    首先读取并对图像做处理,获取加入不同噪声的灰度图像,接着使用matlab工具箱中的medfilt2函数分别使用3x3,5x5,7x7,9x9,16x16的模板进行中值滤波处理,经过实验发现其中5x5.9x9.16x16三种模板效果较之明显,因此最后选用这三种模板作为滤波模板。
    实验分析:
    从仿真结果可以看出:中值滤波法运算简单,易于实现,而且能较好地保护边界,但有时会失掉图像中的细线和小块区域。从实验结果图第三行处理效果可以看出椒盐噪声的斑点几乎全部被滤去,它对滤除图像的椒盐噪声非常有效。因此对图像加入椒盐噪声后,应用中值滤波,而对于高斯噪声来说,如结果图第二行所示,虽然也有一些去噪效果,但效果不佳。并且使用中值滤波的时候采用窗口的大小会直接影响滤波效果,二者成正比关系,即窗口越大,图像去噪效果越好,但代价却是图片模糊的程度越大。因此我们选择中值滤波的时候应该综合考虑。

    扫描二维码关注公众号,回复: 16186057 查看本文章

猜你喜欢

转载自blog.csdn.net/TianHW103/article/details/127956530