空间滤波

1.线性空间滤波

 1 clear,clc;
 2 close all;
 3 f = imread('test.tif'); %读入原图像
 4 subplot(321),imshow(f); %显示原图像
 5 
 6 w = ones(31);
 7 gd = imfilter(f,w);
 8 subplot(322),imshow(gd,[ ]);        %
 9 
10 gr = imfilter(f,w,'replicate');
11 subplot(323), imshow(gr,[ ])        %
12 
13 gs = imfilter(f,w,'symmetric');
14 subplot(324),imshow(gs,[ ])         %
15 
16 gc = imfilter(f,w,'circular');
17 subplot(325),imshow(gc,[ ]);        %
18 
19 f8 = im2uint8(f);
20 g8r = imfilter(f8,w,'replicate');
21 subplot(326),imshow(g8r,[ ]);       %
View Code

执行结果如下:

     

2.非线性空间滤波

{

colfilt()函数:

 功能:以列方法进行邻域处理,也可执行常规非线性滤波。
用法:B = colfilt(A,[m n],block_type,fun)
   该函数生成了一幅图像A,在A中,每一列对应于其中心位于图像内某个位置的邻域所包围的像素。然后将函数应用于该矩阵中。[m n]表示大小为m行n列的邻域。block_type表示了一个字符串,包括'distinct','sliding'两种,其中'sliding'是在输入图像中逐个像素地滑动该m乘n的区域。fun表示引用了一个函数进行处理,函数返回值的大小必须和原图像大小相同。
举例:I = imread('tire.tif');
           imshow(I)
           I2 = uint8(colfilt(I,[5 5],'sliding',@mean));     %额,这里要说明一点:@mean,有的MATLAB需要加@,有的就不需要加了
           figure, imshow(I2)

}

eg:

1 clear,clc;
2 close all;
3 f = imread('test.tif'); %读入原图像
4 subplot(121),imshow(f); %显示原图像
5 
6 gmean = @(A)prod(A,1).^1/size(A,1);      %定义好非线性滤波器函数
7 gf = padarray(f,[5,5],'replicate');      %用replicate填充输入图像
8 g = colfilt(gf,[5,5],'sliding', gmean ); %对每个像素都执行这样的滤波操作
9 subplot(122),imshow(g);
非线性滤波

执行结果为:    (显然也看不出什么结果,不过确实有这种方法)

3.线性空间滤波器

工具箱支持许多预定义的二维线性空间滤波器,这些滤波器可通过fspecial得到。该函数的模板为w = fspecial('type', parameters );  type用来指示滤波器的类型,parameters用来进一步规定滤波器。

这里只显示用这个函数实现“拉普拉斯滤波器”的效果:

 1 clear;clc;
 2 close all;
 3 f = imread('test.tif');
 4 figure(1),imshow(f);
 5 w = fspecial('laplacian',0 );     %0是拉普拉斯滤波器的“阿尔法”值,取值区间[0,1],默认值是0.2
 6 res = imfilter(f,w,'replicate');  
 7 figure(2),imshow(res,[]);      %显示用w滤波器的滤波结果
 8 
 9 f2 = im2double(f);                %将f中的整数数值转化为浮点数
10 g2 = imfilter(f2,w,'replicate');  
11 figure(3),imshow(g2,[]);       %同样用w滤波器进行滤波
12 
13 g = f2 - g2;
14 figure(4),imshow(g);
拉普拉斯滤波器

执行结果如下:

手工指定的滤波器有时候会出现好效果:

eg:

 1 clear;clc;
 2 close all;
 3 f = imread('test.tif');
 4 w4 = fspecial('laplacian',0 ); 
 5 w8 = [1,1,1;1,-8,1;1,1,1];
 6 f = im2double(f);
 7 g4 = f - imfilter(f,w4,'replicate');
 8 g8 = f - imfilter(f,w8,'replicate');
 9 imshow(f)
10 figure,imshow(g4);
11 figure,imshow(g8);
View Code

执行结果为:第一张是原图,显然第三张的滤波效果比第二张好

4.非线性空间滤波器

medfilt2()函数课用来进行中值滤波:

 1 clear;clc;
 2 close all;
 3 f = imread('test.tif');
 4 figure,imshow(f);
 5 fn = imnoise(f,'salt & pepper',0.2 );
 6 figure,imshow(fn);
 7 
 8 gm = medfilt2(fn);
 9 figure,imshow(gm);
10 
11 gms = medfilt2(fn,'symmetric');
12 figure,imshow(gms);
medfilt2函数中值滤波

执行结果为:   第一张为原图,第二张是加上盐椒噪声之后的图,第三张是使用medfilt2()进行中值滤波之后的图,第四张是为了消除第三张中边缘部分的黑边而加上'symmetric'之后的效果图。

最后总括一下:1.均值滤波可以去掉突然变化的点噪声,从而滤除一定的噪声,但是会有一定程度的模糊。

       中值滤波容易去除一些孤立的点、线噪声,同时保持图像的边缘。

          中值滤波的公式为:

 2.假设一副数字图像上带有随机加性噪声,请设计一个方案用例判断噪声模型:在图像的平坦区域取一小块图像做直方图,与已有的噪声模型作对比。

原文地址:https://www.cnblogs.com/liugl7/p/5294864.html