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