tag 标签: 滤波原理

相关博文
  • 热度 23
    2013-9-20 11:39
    7805 次阅读|
    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个百分位的排序滤波器;               
  • 热度 20
    2013-8-27 14:22
    5821 次阅读|
    0 个评论
    概述       我们知道,图像在Matlab 中是用矩阵表示的,虽然RGB等彩色图像和灰度图像的矩阵表示方式不同,终归也是矩阵。       而在Matlab中所涉及的线性空间滤波,从本质上来说是两个矩阵的卷积或者相关运算:通过相应滤波器(或者称之为掩膜,实际也为一个二维矩阵)与图像矩阵进行卷积或者相关运算实现。卷积运算和相关运算的区别在于:滤波矩阵(掩膜)经过了翻转,后文中将对此进行介绍。        (线性空间滤波,是规定了掩膜大小,对邻域像素进行的线性运算,输出的响应为掩膜内的像素进行线性运算后的得数值。与以后要介绍的的非线性空间滤波的区别之处在于对于邻域像素的处理的方式。) 矩阵卷积 写在前面: (按照信号卷积的理论,N维向量与M维向量卷积后,所得向量的长度为:N+M。与我们后面要讨论情形的有所不同,请注意区分。) 一维: 为了便于理解,我们先引入一维函数滤波的概念,再引入二维图像的滤波。 基本原理:滤波器w与函数f起始位置对齐后,逐位移动,并且每次移动都进行按位相乘结果累加得到某位的结输出。 设,一维函数 f 为: 0 0 0 0 1 0 0 0 0 ; 滤波器 w:1 2 3 4 5 相关运算的过程: 1、对齐:将 w 的开始位置 5 与 f 的开始位置 0对齐。对齐位置作为运算起点。 2、填充:为了使得 w 每一次运算中各位都有值相乘,对 f 起始位置和结尾无对应位的位置进行“0填充”。             (注意下填充的概念,在图像滤波中,填充的值对图像滤波的影响比较大。)。 3、 计算:将上下对应的位相乘后全部相加得到结果的第一位,输出位置总是在。               向右移动滤波器w “N”位,并进行相同的运算得到相应第N位的计算结果。 4、 输出大小: Matlab中我们使用imfilter函数来进行卷积或者相关运算;(后文中,将具体介绍imfilter函数。)               得到的结果的大小分为“full”和“same”两类,full包含填充项,same为原f大小。                    卷积运算与相关运算类似,只是将滤波器矩阵旋转了180°后进行与之一样的运算。                  二维: 一维和二维的情况很相像,需要注意填充扩展对图像的影响,我们将在后面的实验中讨论。   总的来说:从开始位置平移掩膜到第一行运行结束位置,在每个位置上执行掩膜覆盖的亮度值与对应的掩膜系数相乘结果累加得到对应点的像素值。 然后跳到第二行的起始位置继续平移和运算,如此反复直到掩膜移动到 整个运算的结束位置。 (不过根据设定输出图像大小为same还是full,掩膜移动的范围有所不同。后文将讲具体描述。)   关于掩膜的大小:通常使用奇数维的方阵作为掩膜/滤波器,因为奇数维的方正有唯一的一个中心点,比较直观。   相关运算: 1、对齐:得到same大小的输出结果,只需要保证掩膜中心能够覆盖全图每个像素点即可。               此时只需将掩膜中心与图像矩阵第一行第一个元素对齐即可。               full 的情况如下图,得到的有值的区域可能会有所拓宽,不过不影响原图大小尺寸的滤波结果的得出。 2、填充:同一维中的理由,在二维中我们需要对图像进行填充。 Matlab中的填充方式有4种: a/ 通过值P来进行扩展。(P为常量值,如本例中使用的为“0”) b/ 过复制图像边界进行扩展填充。 c/ 过镜像反射图像边界来扩展填充。 d/ 图像看成二维周期函数来扩展。 在函数imfilter中会有具体的参数来设置这几种方式。后面函数介绍部分会具体描述。 3、运算:将掩膜覆盖的亮度值与对应的掩膜系数相乘后结果累加得到对应点的输出像素值。然后进行平移继续运算,如此反复,直到平移结束位置。 4、输出大小:分为full 类型和same类型。其意义与一维中一致。 卷积运算的情况与相关类似,不过对掩膜进行了180°的旋转。     imfilter函数介绍   函数描述: B = imfilter(A, H) 使用多维矩阵H来对矩阵向量A进行滤波。矩阵A可以是任意种类和维度的逻辑或者非稀疏数值矩阵。结果B与A拥有相同的大小和类型。 输出B中的每一个元素都使用双精度浮点型来进行计算。如果A为整型或者逻辑矩阵,那么超出整型范围的元素将会被截短,而小数值则 进行取整。   B = imfilter(A, H, option1, option2,...) 根据特定的选项进行多维滤波。选项可以有如下值: