Matlab数字图像 空间滤波

来源:互联网 发布:襄阳云计算idc机房 编辑:程序博客网 时间:2024/05/01 22:38
摘自《数字图像处理》 冈萨雷斯
3.4 空间滤波
3.4.1 线性空间滤波
本节所关注的线性运算包括将邻域中每个像素与相应的系数相乘,然后将结果进行累加,从而得到点(x, y)处的响应。若邻域的大小为m*n,则总共需要mn个系数。这些系数排列为一个矩阵 ,我们称其为滤波器、掩模、滤波掩模、核、模板或窗口,前三种术语最为通用。
工具箱使用函数imfilter来实现线性空间滤波,该函数的语法为
g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中,f是输入图像,w为滤波掩模,g为 滤波结果,其他参数总结在表3.2中。filtering_mode用于指定在滤波过程中是使用相关('corr')还是卷积('conv')。boundary_options用于处理边界边界问题的充零问题,边界的大小有滤波器的大小确定。size_options可以是'same'或'full'。
函数imfilter的通用语法为
g = imfilter(f, w, 'replicate')
在实现IPT标准线性空间滤波时,会使用到该语法。
[转载]Matlab数字图像 <wbr>空间滤波
在使用余弦旋转的滤波器或对称的滤波器时,我们希望执行卷积计算,因而就有了两种方法。方法之一是使用语法
g = imfilter(f, w, 'conv', 'replicate')
方法之二是使用函数rot90(w, 2)将w旋转180度,然后使用imfilter(f, w, 'replicate')。当然,这两部可以合并为一条语句。前一个语法的图像g的大小与输入图像的大小相同(即计算中的默认 模式为前面提到的'same')。
滤波后的图像的每个元素使用双精度浮点算术进行计算。然而,imfilter会将输出图像转换为与输入图像相同的类。
3.4.2 非线性空间滤波
工具箱中提供了两个执行常规非线性滤波的函数,即函数nlfilter和函数colfilt。函数nlfilter直接执行二维操作,而函数colfilt则以列的形式组织数据。
函数colfilt的语法为
g = colfilt(f, [m n], 'sliding', @fun, parameters)
在使用colfilt时,在进行滤波之前,输入图像必须经过了填充。为此,我们可以使用函数padarray,对于二维函数,它的语法为
fp = padarray(f, [r, c], method, direction)
其中,f为输入图像,fp为填充后的图像 ,[r, c]用于给出填充f的行数和列数,method和direction的意义间表3.3.例如,若f = [1 2; 3 4],则命令
fp = padarray(f, [3 2], 'replicate', 'post')
将产生结果
fp =
 
     1     2     2     2
     3     4     4     4
     3     4     4     4
     3     4     4     4
     3     4     4     4
若参量中不包括direction,则默认值为'both'。若参量中不包含method,则默认用零来填充。
[转载]Matlab数字图像 <wbr>空间滤波
[转载]Matlab数字图像 <wbr>空间滤波
[转载]Matlab数字图像 <wbr>空间滤波
3.5 图像处理工具箱的标准空间滤波器
3.5.1 线性空间滤波器
工具箱支持一些预定义的二维线性空间 滤波器,这些空间滤波器可以通过使用函数fspecial来实现。
w = fspecial('type', parameters)
[转载]Matlab数字图像 <wbr>空间滤波
例3.9
目标是对图像进行锐化,并尽可能的保留其灰度色调。
>> f = imread('Fig0316(a)(moon).tif');
>> figure(1), imshow(f)
>> w = fspecial('laplacian', 0)
 
w =
 
     0     1     0
     1    -4     1
     0     1     0
 
>> g1 = imfilter(f, w, 'replicate');
>> figure(2), imshow(g1)
[转载]Matlab数字图像 <wbr>空间滤波
这个结果看起来很合理但是存在一个问题:即所有的象素都是正的。由于滤波器的中心系数为负,所以通常我们希望得到一个带负值的laplace图像。然而在这种情况下f是uint8类图像,使用imfilter滤波后的输出图像与输入图像是同类图像,所以负值被截掉。我们可以通过滤波前将f转换为double类图像来解决这一问题。
>> f2 = im2double(f);
>> g2 = imfilter(f2, w, 'replicate');
>> figure(3), imshow(g2)
[转载]Matlab数字图像 <wbr>空间滤波[转载]Matlab数字图像 <wbr>空间滤波
最后,我们从原图像中减去用laplace算子处理过的结果,以还原失去的灰度色调
>> g = f2 - g2;
>> figure(4), imshow(g)
例3.10 手工指定滤波器和增强技术的比较
>> f = imread('Fig0316(a)(moon).tif');
>> w4 = fspecial('laplacian', 0);
>> w8 = [1 1 1; 1 -8 1; 1 1 1];
>> f = im2double(f);
>> g4 = f - imfilter(f, w4, 'replicate');
>> g8 = f - imfilter(f, w8, 'replicate');
>> imshow(f)
>> figure, imshow(g4)
>> figure, imshow(g8)
[转载]Matlab数字图像 <wbr>空间滤波
3.5.2 非线性空间滤波器
IPT中常用于生成非线性空间滤波的一个工具是函数ordfilt2,它可以生成统计排序滤波器。它们都是非线性空间滤波器,其响应基于对图像邻域中所包含的象素进行排序,然后使用排序结果确定的值来代替邻域中的中心象素的值。
g = ordfilt2(f, order, domain)
该函数生成输出图像g的方式如下:使用邻域的一组排序元素中的第order个元素来替代f中的每个元素,而该邻域则有domain中的非零元素指定。这里,domain是有0和1组成的m*n矩阵,该矩阵指定了将在计算中使用的邻域中的象素位置。在这种情况下,domain的作用类似与掩模。计算中不适用对应于矩阵domain中的0的邻域中的象素。例如,要实现大小为m*n的最小滤波器,可使用语法
g = ordfilt2(f, 1, ones(m, n))
在该语句中,1表示mn个样本中的第一个样本,ones(m, n)创建了一个元素值为1、大小为m*n的矩阵,表明邻域内的所有样本都将用于计算。
在统计学术语中,最小滤波器(一组排序元素中的第一个样本值)称为第0个百分位。同样,第一百个百分位就是一组排序元素中的最后一个样本值,即第mn个样本。相应的,还有最大滤波器,他可以使用下面语法实现:
g = ordfilt2(f, m*n, ones(m, n))
数字图像处理中最著名的统计排序滤波器是终止滤波器,它对应的第50个百分位。我们可以使用Matlab函数ordfilt2来创建一个终止滤波器:
g = ordfilt2(f, median(1:m*n), ones(m, n))
其中median(1:m*n)简单地计算排序序列1, 2, ..., mn的中值。函数median的通用语法为
v = median(A, dim)
介于实际应用中的重要性,工具箱提供了一个二维中值滤波器
g = medfilt2(f, [m n], padopt)
数组[m n]定义了一个大小为m*n的邻域,终止就在该邻域上计算,而padopt指定了三个可能的边界填充选项之一。
g = medfilt2(f)
它使用一个大小为3*3的邻域来计算中值,并用0来填充输入图像的边界。
0 0