数字图像处理(二):非线性空间滤波

一、基本概念

非线性空间滤波也基于邻域操作,与线性空间滤波相同,可通过定义一个大小为 m x n 的邻域,以其中心点滑过一幅图像的方式进行操作。

领域处理

见上节

与线性空间滤波的区别

线性空间滤波基于计算乘积之和,而非线性空间滤波基于非线性操作。例如:令每个中心点处的响应等于其邻域内的最大像素值的操作即为非线性滤波。
在非线性滤波中,“滤波器”应看作是一个基于邻域像素操作的非线性函数,其响应组成了在邻域的中心像素处操作的响应

二、非线性空间滤波函数

函数nlfilter

nlfilter 直接执行二维操作;colfilt 以列的形式组织数据,速度更快。

函数colfilt

给定一个大小为 M X N 的图像 f 和一个大小为 m x n 的邻域,函数 colfilt 生成一个最大尺寸为 mn x MN 1的矩阵A,在该矩阵中,每一列对应于其中心位于图像内某个位置的邻域所包围的像素。

函数 colfilt 语法g = colfilt(f,[m,n],'sliding',@fun,parameters)
m 和 n 表示滤波区域的维数,‘sliding’ 表示处理过程是在输入图像 f 中逐个像素地滑动该 m x n 区域,@fun引用一个函数,parameters表述函数fun可能需要的参数。符号@称为函数句柄,它是一种MATLAB数据类型,它包含有引用函数用到的一些信息。
基于矩阵A的组织形式,函数fun必须对矩阵的每一列操作,并返回一个包含所有列结果的行向量v。v的第k个元素表示的是对A中的第k列进行fun操作后的结果。因而,A中可以有 MN 列,v 的最大维数为 1 x MN。

函数padarry

线性滤波中,需要对图像进行填充来处理空间滤波中固有的边界问题。但在使用colfilt时,滤波前必须经过填充
由此引入函数 padarryfp = padarray(f,[r,c],method,direction)
其中,f 为输入图像,fp 为填充后的图像,[r,c]用于给出填充 f 的行数和列数,
method 和 direction 的意义见下表:
函数padarry的选项

>> f = [1 2;3 4]

f =
     1     2
     3     4
% 如果参数中不包含direction,则默认值为'both'
>> fp = padarray(f,[3 2],'replicate','post')	
% 在每一维的最后一个元素之后填充 32 列
fp =
     1     2     2     2
     3     4     4     4
     3     4     4     4
     3     4     4     4
     3     4     4     4

三、例 滤波实现(函数colfilt)

假设一个非线性滤波器,该滤波器在任何点的响应都是以该点为中心点的邻域中的像素灰度值的几何平均。大小为 mxn 的邻域中的几何平均是邻域内亮度值的乘积的 1/mn 次幂
匿名函数句柄: gmean = @(A)prod(A,1)^(1/size(A,1))

function v = gmean(A) 
% 这里的 A 代表的是 colfilt 生成的一个 mn x MN 的矩阵;
mn = size(A, 1);
v = prod(A, 1).^(1/mn);
f = padarray(f,[m n],'replicate');
% 为了消减边界效应,使用padarray中的’replicate’选项来填充输入图像;
g = colfilt(f,[m n],'sliding',@gmean);
% 调用colfilt

尽管矩阵 A 是函数gmean 中的一个参量,但它未包括在函数colfilt的参数中,这个矩阵可通过函数colfilt 中使用函数句柄自动传递给gmean。
同时矩阵 A 总有mn行,但是列数是可变的,因此函数colfilt 每调用该参量一次,就要计算一次A的大小,这种情况下,滤波的过程就是计算邻域内所有像素的乘积的1/mn 次幂。

附录 相关函数

函数prod

>> a = [1 2; 3 4]
a =

     1     2
     3     4
% 若 a 是一个向量返回元素的乘积,若 A 是一个矩阵则 prod(A)将列作为向量处理,并返回每列的积
>> b = prod(a)
b =
     3     8
% prod(a,dim) 计算A中有dim指定方向的乘积,dim为1 代表返回行计算列
>> b = prod(a,1)

b =

     3     8
%  dim 为 2 代表返回列,计算行
>> b = prod(a,2)

b =

     2
    12

函数size

>> a = [1 2;3 4;5 6]
a =
     1     2
     3     4
     5     6
 % size(a) 返回一个行向量,包括每一维的长度
>> size(a)
ans =

     3     2
% size(a,dim) dim为1 返回有多少行,dim 为 2 返回有多少列
>> size(a,1)
ans =
     3
>> size(a,2)
ans =
     2

  1. A总有mn行,但列数可根据输入的尺寸变化,尺寸的选择由colfilt自动完成。 ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值