[Unity] 数字图像处理——滤波原理——非线性空间滤波

查看:1715 |回复:4 | 2015-12-29 15:43:05

您需要 登录 才可以下载或查看,没有账号?注册

x
基于Matlab的数字图像处理——滤波原理——非线性空间滤波

概述    我们已经知道,线性空间滤波即为掩膜矩阵和图像矩阵的卷积/相关运算。本质上来说,是像素点值与像素点邻域像素点值之间的一种特殊运算关系,因为其运算规则为邻域像素点与对应掩膜系数相乘后相加的线性运算,故称之为线性空间滤波。
    如果这种基于邻域的运算是非线性的,对图像的每个像素点都进行这种非线性运算(滤波),即为非线性空间滤波。
    本文首先会将线性空间滤波与非线性空间滤波做一个简单的对比,然后介绍matlab中几种非线性空间滤波的函数。


与线性空间滤波对比            为了使得每一个像素都有相同的可计算邻域,我们需要对图像矩阵进行填充。具体填充概念见线性空间滤波一文。
    图中:灰色数字部分:0填充部分;              黑色数字部分:图像矩阵;
              绿色数字部分:掩膜系数或划定邻域范围;
20130920113248194.jpg

            



Matlab 中非线性空间滤波函数    先介绍两个执行常规非线性滤波的函数:nlfilter 和 colfilt。当然, 一些常用的非线性滤波器可以通过其他MATLAB和IPT函数实现,我们主要介绍colfilt。
    其中colfilt因其出色的执行速度,是进行非线性滤波操作的最好选择。首先介绍colfilt,然后将MATLAB中对nlfilter的描述,最后介绍另一种比较常用的统计排序滤波器。
    colfilt是基于列的滤波方式,具体如下:
colfilt       函数语法:

B = colfilt(A,[m n],block_type,@fun,paramerters)


A:图像矩阵;
[m n]:邻域范围;
block_type:邻域块的处理方式,有如下两值可供选择:distinct 和 sliding
           二者通过fun运算返回的值不同,通过colfilt最终返回的矩阵也不同;详情如下:
20130920113409840.jpg


@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,[M N],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个百分位的排序滤波器;




非线性空间滤波
掩膜的概念在非线性操作中并不流行,滤波的概念仍然存在。非线性空间滤波基于非线性操作,这种操作包含了一个领域的像素。而线性空间滤波基于计算乘积之和(这是一种线性操作)
MATLAB IPT中提供了两个执行常规非线性滤波的函数:nlfilter和colfilt(Columnwise neighborhood operations,列向领域操作)。nlfilter直接执行二维操作,而colfilt则以列的形式组织数据。虽然colfilt需要占用更多的内存,但执行起来比nlfilter快得多。在大多数图像处理中,速度是个很重要的概念。内存已不是主要因素。
在执行常规的非线性空间滤波时,更多采用的是colfilt而非nlfilter
调用语法:G = colfilt(A,[m n],block_type,fun)
执行过程:
(1)先是根据block_type将A(比如图像数据f(x,y))转换成待处理的矩阵B,方法为:
B = im2col(A,[m n],block_type)
当block_type为'distinct'时,转换过程如下图所示:

当block_type为'sliding'(默认参数)时,转换过程如下图:


(注:①A是5阶魔方矩阵,仅作示意②使用了2x3的block③此转换过程是colfilt函数里面进行的)
(2)得到矩阵B,然后调用函数fun对B进行运算(fun为函数名柄),如:
G=colfilt(A,[5 5],'sliding',@mean)  %使用mean函数(求均值)
(3)colfilt函数的最后一步是将fun函数执行的结果,再调用col2im转换为和原始矩阵A同尺寸的矩阵,作为输出结果。
col2im调用语法为:G = col2im(B’,[m n],[mm nn],'distinct') %B'是fun函数运算后的结果。

由上可知,colfilt处理的关键在于fun函数的选取。
============
示例:
I = imread('tire.tif');
imshow(I)

I2 = uint8(colfilt(I,[5 5],'sliding',@mean));
figure, imshow(I2)



2015-12-29 15:43:05  
 赞 赞 1

使用道具 登录

4个回答,把该问题分享到群,邀请大神一起回答。
2#
不明觉厉!!!但教程贴一定要支持!!!{:1_151:}
回复 收起回复
2015-12-29 16:10:02   回复
 赞 赞 1

使用道具 登录

3#
谢谢楼主分享
回复 收起回复
2015-12-30 10:24:56   回复
 赞 赞 1

使用道具 登录

4#
谢谢分享~!!
回复 收起回复
2016-2-7 09:57:15   回复
 赞 赞 1

使用道具 登录

5#

谢谢分享~!!
回复 收起回复
2020-5-22 13:48:18   回复
 赞 赞 1

使用道具 登录

CG 游戏行业专业问题

Unity3D技术手机游戏引擎手游引擎
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表