工具箱提供了两个函数来执行常见的非线性滤波:nlfilter和colfilt。前者直接执行二维操作,而colfilt按列的形式组织数据。尽管colfilt需要占用更多的内存,但执行起来要比nlfilter快得多。在大多数图像处理应用中,速度是最重要的因素,因此在实现非线性空间滤波时,更多的采用colfilt而不是nolfilt。
给定一幅大小为M*N的输入图像f,邻域大小为m*n,函数colfilt生成一个最大尺寸为mn*MN的矩阵,成为A(A总有mn行,但列数可变,具体取决于输入尺寸)。
函数colfilt的语法为
g = colfilt(f, [m,n], 'sliding', fun)
其中,m和n表示滤波区域的维数,‘sliding’,表明处理过程是m*n区域在输入图像f中逐像素滑动,fun是一个函数句柄。
基于A的组织方式,函数必须分别对A的每一列进行操作,并返回一个行向量v,v的第k个元素即是对A中的第k列进行fun操作后的结果。因为A中最多有MN列,所以A的最大维数为1*MN。
在使用colfilt时,滤波前必须显式地填充图像。为此,使用二维函数padarray,其语法为
fp = padarray(f, [r c], method, direction)
其中f为输入图像,fp为填充后的图像,[r c]表示填充的行数和列数,method和direction为图像尺寸扩展方法和填充方向。