滤波是图像处理很重要的一部分,主要分为空间滤波和频域滤波,此节主要说明空间滤波。空间滤波可以分为线性空间滤波和非线性空间滤波。所用函数包括:imfliter, colfit, padarray, fspecial, ordfilt2, medfilt2。
线性空间滤波是对区域的像素做先行处理,将领域内的每个像素与对应的系数相乘。其中所用到的矩阵,是滤波器或者说是掩模。线性空间滤波主要有两种方式,一是相关,另一个是卷积。二者的区别是滤波器是否发生反转,介绍可以参阅信号。
g = imfilter(f,w,filtering_mode,boundary _options,size _options)
img1 = imread('key2.jpg');
imshow(img1);
img2 = rgb2gray(img1);
imshow(img2);
w = [0 1 0;1 -4 1;0 1 0];
%默认的边界选项,滤波
gd = imfilter(img2,w);
figure,imshow(gd,[ ]);
%通过复制边界进行填充
gr = imfilter(img2,w,'replicate');
figure,imshow(gr,[]);
%通过边界对称填充
gs = imfilter(img2,w,'symmetric');
figure,imshow(gs,[ ]);
%包括循环边界...
%注意图像类型
线性空间滤波是基于计算像素的乘积之和,是一个线性运算。而非线性空间滤波,是对像素做函数运算。两个常用的非线性滤波函数是colfilt和nlfilter。由于colfilt执行起来比nlfilter快得多,所以我们多采用colfilt。
g = colfilt(f, [m n], 'sliding', @fun, parameters);
colfiltu不同于imfilter,填充方式没有确定,进行滤波之前,我们需要自行对图像进行填充,这里我们使用padarray函数。
除此之外此函数很重要的一部分是定义所用到的函数,首先要定义非线性函数。
fp = padarray(f, [ r c ], method, direction);
MATLAB的图像工具箱可以自动生成一些规定的滤波器。
该函数可以生成工具箱预定义的二维线性空间滤波器。
w = fspecial('type', parameters);
‘type’为滤波器类型,‘parameters’为定义参数,详细情况如下:
经典的一个滤波器是拉普拉斯滤波器,定义算子和通用的近似数字表达式,可查阅信号课本。
1.对图像做卷积操作可实现此变换,掩模如下所示:
2.另一种定义考虑对角线元素,掩模是:
3. fspecial实现一个更为常见的拉普拉斯算子掩模:
fspecial仅仅是为了生成一个滤波器,滤波器同样可以手动设置。我们在使用拉普拉斯算子处理后,可以用原图减去操作后的结果,还原失去的灰度的色调。通过变换后我们可以得到更清晰的图像。
img1 = imread('night.jpg');
%定义两个不同的滤波方法
w4 = fspecial('laplacian',0);
w8 = [1 1 1;1 -8 1;1 1 1];
%进行类型转换,保证显示图像更好
img1 = im2double(img1);
%拉普拉斯滤波后的图像
img_f1 = imfilter(img1,w4,'replicate');
img_f2 = imfilter(img1,w8,'replicate');
%进行图像相减
img_out1 = img1 - img_f1;
img_out2 = img1 - img_f2;
imshow(img1);
figure,imshow(img_out1);
figure,imshow(img_out2);
用于生成非线性空间滤波的一个工具是函数ordfilt2,可以生成统计排序的滤波器,而这些都是非线性滤波器。
g = ordfilt2(f, order, domain);
g = ordfilt2(f,1,ones(m, n));
g = ordfilt2(f,m*n,ones(m,n));
g = ordfilt2(f,median(1:m*n),ones(m,n));
v = median(A,dim);
g = medfilt2(f,[m n],padopt);