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,[ ]); %
执行结果如下:
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);
执行结果为:第一张是原图,显然第三张的滤波效果比第二张好
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()进行中值滤波之后的图,第四张是为了消除第三张中边缘部分的黑边而加上'symmetric'之后的效果图。
最后总括一下:1.均值滤波可以去掉突然变化的点噪声,从而滤除一定的噪声,但是会有一定程度的模糊。
中值滤波容易去除一些孤立的点、线噪声,同时保持图像的边缘。
中值滤波的公式为:
2.假设一副数字图像上带有随机加性噪声,请设计一个方案用例判断噪声模型:在图像的平坦区域取一小块图像做直方图,与已有的噪声模型作对比。