热度 23
2013-9-20 11:39
7804 次阅读|
0 个评论
概述 我们已经知道,线性空间滤波即为掩膜矩阵和图像矩阵的卷积/相关运算。本质上来说,是像素点值与像素点邻域像素点值之间的一种特殊运算关系,因为其运算规则为邻域像素点与对应掩膜系数相乘后相加的线性运算,故称之为线性空间滤波。 如果这种基于邻域的运算是非线性的,对图像的每个像素点都进行这种非线性运算(滤波),即为非线性空间滤波。 本文首先会将线性空间滤波与非线性空间滤波做一个简单的对比,然后介绍matlab中几种非线性空间滤波的函数。 与线性空间滤波对比 为了使得每一个像素都有相同的可计算邻域,我们需要对图像矩阵进行填充。具体填充概念见线性空间滤波一文。 图中:灰色数字部分:0填充部分; 黑色数字部分:图像矩阵; 绿色数字部分:掩膜系数或划定邻域范围; Matlab 中非线性空间滤波函数 先介绍两个执行常规非线性滤波的函数:nlfilter 和 colfilt。当然, 一些常用的非线性滤波器可以通过其他MATLAB和IPT函数实现,我们主要介绍colfilt。 其中colfilt因其出色的执行速度,是进行非线性滤波操作的最好选择。首先介绍colfilt,然后将MATLAB中对nlfilter的描述,最后介绍另一种比较常用的统计排序滤波器。 colfilt是基于列的滤波方式,具体如下: colfilt 函数语法: B = colfilt(A, ,block_type,@fun,paramerters) A:图像矩阵; :邻域范围; block_type:邻域块的处理方式,有如下两值可供选择:distinct 和 sliding 二者通过fun运算返回的值不同,通过colfilt最终返回的矩阵也不同;详情如下: @fun:函数句柄,调用外部写好的函数fun进行邻域像素处理; parameters:fun所需的参数 。 函数原理: 邻域和图像例举: 领域大小为3x3 图像大小为:5x5 fun例举: 为均值函数。 大致过程为:m x n大小领域矩阵中心从左至右,从上到下依次滑过M x N大小的图像的每一个像素点。邻域矩阵将其所包围范围内,所有像素点的亮度值挑选出来。 colfilt 函数调用 im2col 函数将之转换为列向量。如此一来,邻域矩阵中心每经过一个像素点,就产生一个mn维度的向量,M x N 大小的图像就会产生MN个这样的向量。我们得到一个mn x MN 的新的矩阵。对该矩阵每一列代入 fun 中运算,产生一个MN维的向量, colfilt 调用 col2im 函数将MN维向量重新还原为M x N 的矩阵,完成运算。 一、 零填充: 二、生成矩阵: nlfilter B = nlfilter(A, ,FUN) 针对图像A的每一个M x N 滑动块应用函数FUN。FUN是一个接收M x N矩阵作 为输入并且返回一个标量; C = FUN(X) FUN必须为一个函数句柄; C是M x N 块X的中心像素的输出值; nlfilter为图像A中的每一个像素调用函数FUN。 B = nlfilter(A,'indexed',...) 将A作为索引图像来处理,如果A 为单精度型或者双 精度型则使用1来对A进行填充,如果A 是逻辑型、uint8或uint16型图像则使用0 来进行填充。 B = nlfilter(A,'indexed',...) 数据类型支持 ------------- 输入图像A可以是FUN支持的任意数据类型。B的类型取决于FUN的输出类型。 如果A是灰度图像,其可以为任意数字类型或者逻辑型。如果A是索引图形,其 可以是逻辑、uint8、uint16、单精度型或者、双精度型。 注意 ------- 在处理大图片时nlfilter 需要花费大量的时间。在大多数情况下colfilt 函数可 更快的处理相同的操作。 (本节内容为从MATLAB help 中翻译所得。) orderfilt2 其相应是基于对邻域中所包含的像素进行排序,然后使用排序结果的值来代替中心像素值。 函数语法: g = ordfilt2(f , order , domain) 使用邻域的一组排序元素的第order 个元素来替代f中的每个元素,而领域矩阵所选择用来排序的元素,由domain中的非零元素指定。 百分位:我们将排序元素中第一个元素称为第0个百分位,最后一个元素为第100个百分位。 最小滤波器:取order 为0个百分位的排序滤波器; 中值滤波器:取order 为50个百分位的排序滤波器; (降低图像椒盐噪声的有效工具) 最大滤波器:取order 为100个百分位的排序滤波器;