matlab滤波器的总结

一.线性滤波

数字图像处理中,通常用滤波的方法去除图像噪声,提高图像质量,突出图像特征。
线性滤波就是通过输入图像像素领域的加权平均得到输出图像的像素值。

1.创建预定义滤波器命令fspecial()
调用格式:h=fspecial(type);
                 h=fspecial(type,parameters);

fspecial()函数用于生成预定义滤波器,并返回计算模块到矩阵h中。
其中,type为过滤器类型,parameters为可选参数。

type为字符串,制定了掩膜类型。如'average'表示均值掩膜。H为返回的掩膜矩阵,数据类型为double.

type的取值可以为以下值:
'average':均值滤波器;
'disk':圆均值滤波器;
'gaussian':高斯低通滤波器;
'laplacian':2-D拉普拉斯算子;
'log':用于高斯滤波器的拉普拉斯算子;
'motion':运动滤波器;
'prewitt':Prewitt水平边缘检测滤波器;
'sobel':Sobel水平边缘检测滤波器;
'unsharp':unsharp对比增强滤波器;
通过parameters参数可以根据不同滤波器类型设置各个滤波器相应的属性,如h矩阵的大小等。

正方形均值掩膜,h=fspecial('average',n),n为掩膜大小,n*n,默认值是3.
高斯低通掩膜,h=fspecial('gaussian',n,sigma),n为掩膜大小n*n,默认为3.sigma为高斯分布方差。
二维拉普拉斯掩膜'laplacian',h=fspecial('laplacian',alpha),alpha控制掩膜形状,范围是[0 1],默认值0.2,
反锐化掩膜'unsharp',h=fspecial('unsharp',alpha)alpha控制掩膜形状,范围是[0 1],默认值0.2
水平锐化掩膜'prewit',h=fspecial('prewit'),如果想用垂直锐化,则用h'
sobel水平锐化,h=fspecial('sobel'),如果想用垂直锐化,则用h'

2.二维线性滤波函数filter2()
调用格式:Y=filter2(h,X);
                 Y=filter2(h,X,'shape');
其中,h为预定义滤波器生成的计算模块,X为原始图像数据矩阵,返回结果存储在矩阵Y中。
参数'shape',可以为以下3种:
'same':输出矩阵Y与X维数相同;
'valid':只输出相关部分,Y的维数小于X的维数;
'full':完整输出,Y的维数大于X的维数。
参数shape的默认值为same。
3.多维图像滤波函数imfilter()
调用格式:B=imfilter(A,h);
                 B=imfilter(A,h,OPTION1,OPTION2,...);
其中,A为原始图像数据矩阵,h为预定义滤波器生成的计算模块,OPTION1,OPTION2,...为可选参数,滤波计算后输出到矩阵B中。可选参数包括边界选项(X、‘symmetric’、‘replicate’、‘circular’)、输出维数选项(‘same’、‘full’)、相关与卷积选项(‘corr’、‘conv’)等。

二.非线性滤波

matlab工具箱提供了两个执行常规非线性滤波的函数:nlfilter和colfilt。nlfilter直接执行二维操作,而函数colfilt则以列的形式组织数据,虽然colfilt比nlfilter要占用更多的内存,但执行速度要比nlfilter快许多,因此实际使用中如果注重速度,肯定都是选择的colfilt。
但两个函数的使用方法非常的不同,特别是colfilt还有点难理解的地方,通过对colfilt的使用终于搞明白了其使用方法,下面对colfilt使用中要注意的地方进行总结。
 colfilt的运行过程及解释 
colfilt的原型如下:g=colfilt (f, [m n], 'sliding', @fun, parameters).
f:要进行滤波的原图像 
[m,n]:掩膜(邻域)的尺寸,一般为奇数*奇数 
'sliding':块模式,sliding说明逐个像素的滑动mxn区域 
@fun:真是实现滤波的函数,它是一个函数指针,我们定义一个函数对mxn区域的像素进行处理,而这个函数会被colfilt自动调用。 
parameters:我们定义的函数要传入的其他参数。 
colfilt执行过程如下:
1. 首先对f进行列变换,假设f是MxN的图像,则会生成一个mnxMN的矩阵。具体的变化方法要深刻体会,其实就是把原图像每个像素邻域内的mn个像素排成一列,原图像总共有MN个像素,因此变换后的矩阵就有MN列。
2. 然后colfilt会每次选择多列作为一个矩阵传入到fun中进行处理,到底选择几列是由colfilt按照一定策略进行的。而传入矩阵的行数肯定是mn。
3. fun函数对传入的矩阵进行运算,一般是一列一列的处理,然后返回一个行向量,这个行向量的每个元素对应每列处理的结果,因此传入的矩阵有多少列就按序生成多少个结果放到对应的行向量中。
4. colfilt对返回的行向量进行存储、反变换,最后得到和原图像等大小的一个矩阵,这就是非线性滤波的最终结果。

你可能感兴趣的:(matlab,图像处理,非线性滤波,降噪,线性滤波)