数字图像处理 学习笔记——空间滤波

2.4空间滤波
邻域处理有以下几个步骤:(1)选取中心点(x,y);(2)仅对预先定义的关于点(x,y)的邻域内的像素执行操作;(3)令运算结果为该点处的响应;(4)对图像中的每一点重复该处理。
中心点移动的过程会产生新的邻域,每个邻域对应输入图像上的一个像素。用来标识该处理的两个主要术语是邻域处理和空间滤波,其中后者更为通用。若对邻域中像素执行的计算为线性的,则称该操作为线性空间滤波(也用术语空间卷积);否则称为非线性空间滤波。

2.4.1 线性空间滤波
本章,直接对图像中的像素执行滤波运算,我们使用术语线性空间滤波来区分这种类型的处理与频域滤波。
本章感兴趣的线性操作包括邻域中的每个像素乘以相应的系数,将结果求和,从而得到点(x,y)处的响应。若领域的大小为m*n,则需要mn个系数。这些系数被排列为一个矩阵,称为滤波器、模板、滤波模板、核、掩模或窗口,也用卷积滤波、卷积模板或卷积核等术语。
相关、卷积公式
imfilter的最常见语法是:
g=imfilter(f,w,’replicate’)
当在工具箱中实现标准的线性空间滤波时,使用这一语法。
使用一个旋转后的滤波器执行相关操作与使用该原始滤波器执行卷积操作是相同的。如果该滤波器关于其中心对称,则两种操作产生相同的结果。

例2.8 函数imfilter的应用。
f=imread(‘Fig0216(a).tif’);
imshow(f)
w=ones(31);
gd=imfilter(f,w);
imshow(gd,[ ])
gr=imfilter(f,w,’replicate’);
figure,imshow(gr,[ ])
gs=imfilter(f,w,’symmetric’);
figure,imshow(gs,[ ])
gc=imfilter(f,w,’circular’);
figure,imshow(gc,[ ])
f8=im2uint8(f);
g8r=imfilter(f8,w,’replicate’);
figure,imshow(g8r,[ ])
图2.16a
图2.16b
图2.16e
图2.16f

2.4.2 非线性空间滤波
工具箱提供了两个函数来执行常见的非线性滤波:nlfilter和colfilt,前者直接执行二维操作,而colfilt按列的形式组织数据。尽管colfilt需要占用更多的内存,但执行起来要比nlfilter快得多。在大多数图像处理应用中,速度是最重要因素,因此在实现非线性空间滤波时,更多地采用colfilt而不采用nlfilt。
函数colfilt的语法为:
g=colfilt(f, [m n], ‘sliding’, fun)
其中,m和n表示滤波区域的维数,‘sliding’表明处理过程是m*n区域在输入图像f中逐像素地滑动,fun是一个函数句柄。
使用colfilt时,滤波前必须显式地填充输入图像,为此,使用二维函数padarray,其语法为:
fp=padarray(f,[r c],method,direction)
其中,f为输入图像,fp为填充后的图像,[r c]表示用于填充f的行和列数。

2.5 图像处理工具箱的标准空间滤波器
2.5.1线性空间滤波器
工具箱支持许多预定义的二维线性空间滤波器,这些滤波器可通过函数fspecial得到,该函数生成一个滤波模板w,语法为:
w=fspecial(‘type’,parameters)
其中,‘type’指定滤波器的类型,parameters进一步定义规定的滤波器。

例2.10 使用函数imfilter实现拉普拉斯滤波器
应用拉普拉斯算子来增强图2.17a所示图像,这是一幅略显模糊的月球北极图像。此时,对图像的增强操作是锐化图像,同时尽可能地保留其灰度层次。首先,生成并显示该拉普拉斯滤波器:
w=fspecial(‘laplacian’,0)
w =

 0     1     0
 1    -4     1
 0     1     0

注意,该滤波器是double类的,其alpha=0的形状是前面讨论过的拉普拉斯滤波器。我们可以很容易地认为规定其形状为
w=[0 1 0;1 -4, 1;0 1 0];
下面对输入输入图像。图2.17a应用w,图像f是uint8类图像:
g1=imfilter(f,w,’replicate’);
imshow(g1,[ ])
图2.17b显示了结果图像。其结果看似合理,但存在一个问题:所有的像素都是正的。由于滤波器中心系数为负,因此我们通常希望得到的是一个带有正值和负值的拉普拉斯图像。但此时,f是uint8类的,如前节所述,imfilter给出了与输入图像类相同的输出,所以负值被截掉了。在对图像滤波前,通过将其转换为浮点数可解决这一问题:
f2=tofloat(f);
g2=imfilter(f2,w,’replicate’);
imshow(g2,[ ])
图2.17c显示的结果是拉普拉斯图像的典型外观。最后,从原始图像中减去(因为中心系数为负值)拉普拉斯图像,以恢复失去的灰度层次:
g=f2-g2;
imshow(g);
图示2.17d的结果比原图像更要清晰。
图2.17a
图2.17a月球北极图像
图2.17b
图2.17b使用uint8格式经拉普拉斯滤波后的图像(因为uint8是无符号型,输出中的负值被裁减为0);
图2.17c
图2.17c使用浮点格式获得的经拉普拉斯滤波后的图像
图2.17d
从图a中减去图c所得到得到的增强后的结果

例2.11 手工指定滤波器及增强技术的比较
增强问题常常需要工具箱之外的滤波器。拉普拉斯滤波器就是一个很好的例子。工具箱支持一个中心系数为-4的3*3拉普拉斯滤波器。通常,使用中心系数为-8、周围值均为1的3*3拉普拉斯滤波器,可得到更为清晰的图像。本例手工实现这个滤波器,并比较使用这两种拉普拉斯方式得到的结果。命令如下:
f=imread(‘Fig0217(a).tif’);
w4=fspecial(‘laplacian’,0);%Same as w in Example 2.10.
w8=[1 1 1;1 -8 1;1 1 1];
f=tofloat(f);
g4=f-imfilter(f,w4,’replicate’);
g8=f-imfilter(f,w8,’replicate’);
imshow(f)
figure,imshow(g4)
figure,imshow(g8)
图2.18a
图2.18a 月球北极图像
图2.18b
图2.18b使用中心系数为-4的拉普拉斯滤波器‘laplacian’增强后的图像。
图2.18c
图2.18c 使用中心系数为-8的拉普拉斯滤波器增强后的图像。

2.5.2 非线性空间滤波器
本节关注由ordfilt2生成的非线性滤波器
函数ordfilt2的语法为:
g=ordfilt2(f, order, domain)
该函数通过使用邻域的排序集合中的order个元素去替代f中的每个元素,来生成输出图像g,其中邻域由domain内的非零元素指定。这里,domain是一个由0和1组成的大小为m*n矩阵,该矩阵规定了在计算中所用的邻域中的像素位置。其作用类似于一个逻辑模板。
数字图像处理中最知名的统计排序滤波器是中值滤波器,它对应着第50个百分位:
g=ordfilt2(f, (m*n+1)/2, ones(m,n))
其中m和n为奇数,工具箱提供了该二维中值滤波器的一个专用实现:
g=medfilt2(f, [m n], padopt)
其中。数组[m n] 定义一个大小为m*n的邻域(在该邻域上计算中值),padopt指定三个可能的边界填充选项之一:‘zeros’(默认值),‘symmetric’指出f按照镜像反射方式对称地沿边界扩展,‘indexed’表示若f是double类的则用1填充,否则用0填充。默认形式:
g=medfilt2(f)
使用一个大小为3*3的邻域并用0填充边界来计算中值。

例2.12 利用函数medfilt2进行中值滤波。
中值滤波是降低图像中椒盐噪声的一种有用工具。
图2.19a是一块工业电路板在自动检测期间所拍摄的X射线图像f。图2.19b是被椒盐噪声污染的同一幅图像,图像中黑点和白点出现的概率为0.2.这幅图像是利用函数imnoise生成的:
fn=imnoise(f,’salt & pepper’, 0.2);
图2.19是对该带噪图像进行中值滤波处理后的结果,使用语句:
gm=medfilt2(fn);
考虑图b中的噪音水平,中值滤波采用默认设置很好地实现了降噪。但要注意围绕图像边界的黑色污点,这些黑色污点是由围绕图像的黑点引起的(回忆可知默认使用0来对边界进行填充)。使用‘symmetric’选项可降低这种效应:
gms=medfilt2(fn,’symmetric’);
图d结果与图b所示结果相近,但黑色边框效应已不再那么明显。
图2.19a
图2.19a X射线图像
图2.19b
图2.19b被椒盐噪声污染的图像
图2.19c
图2.19c使用函数medfilt2的默认设置进行中值滤波处理后的结果
图2.19d
图2.19d 使用选项‘symmetric’进行中值滤波后的结果。

猜你喜欢

转载自blog.csdn.net/daodanxiansheng/article/details/82284420