>>g=imfilter(f, w, filtering_mode, boundary_options,size_options);
#fitering_mode选项为'corr', 'conv'
分别代表相关滤波和卷积滤波,后者结果相当于将前者旋转180度
#boundary_options用于处理边界填充问题,
可以为填充0,复制边界,对称映象,周期拓展等方式填充
#size_options设置输出图像大小,'full'或者‘same’
默认情况下,为'corr','0','same'
注意滤波时,输入输出图像类型,避免结果超出[0,255]
以上通过在像素邻域计算乘积和(卷积)的方式对图像滤波的方式成为线性滤波;
非线性空间滤波也是在每个像素邻域内,只是应用非线性操作的方式,例如使得每个每个中心点的响应等于领域内像素最大值。
g=colfilt(f,[m,n],'sliding',fun); #可产生mn*MN矩阵A
#[m,n]为模板大小;
#‘sliding’表明模板对输入图像f逐像素进行滑动;
#fun函数句柄,即通过某个函数对每个像素邻域进行操作,返回函数值作为结果;
colfilt操作相当于先生成矩阵A,然后f分别对A每一列进行操作,并返回MN维向量v,每个元素与就是对原图像每个像素邻域的操作结果。
使用colfilt时,首先要对输入图像进行填充:
>>fp=padarray(f, [r,c], method, direction);
在得到结果g后要移除填充部分:
>>[M,N]=size(f);
>>g=g((1:M)+m,(1:N)+n);
例1、用laplace 进行线性滤波
>>f=imread(...);
>>w1=fspecial('laplace',0);#预定义laplace模板
>>w2=[1 1 1;1 -8 1;1 1 1];#常用数字二阶导数模板
>>f=tofloat(f);#将输入图像转化成浮点型,得到带有正直和负值结果f1,f2
>>f1=imfilter(f,w1,'replicate');#imfilter 输出与输入相同的数据类型
>>f2=imfilter(f,w2,'replicate');
>>g1=f-f1;
>>g2=f-f2;
>>imshow (f)
....
例2、统计排序滤波器ordfilt2
>>g=ordfilt2(f,order,domain);
#domain通常为ones(m,n)即对邻域内所有元素进行计算
#order为1时,代表最小滤波器;为m*n时为最大滤波器;
>>gm=medfilt2(f,[m n],padopt);
#实现中值滤波功能,相当于ordifllt2中order取吗m*n/2