matlab中colfilt,matlab中用colfilt实现非线性滤波

1. 图像的空域线性滤波和非线性滤波

在空域对图像进行滤波处理无非两种状况,线性滤波和非线性滤波。滤波的意思就是对原图像的每一个像素周围必定范围内的像素进行运算,运算的范围就称为掩膜或领域。而运算就分两种了,若是运算只是对各像素灰度值进行简单处理(如乘一个权值)最后求和,就称为线性滤波;而若是对像素灰度值的运算比较复杂,而不是最后求和的简单运算,则是非线性滤波;如求一个像素周围3x3范围内最大值、最小值、中值、均值等操做都不是简单的加权,都属于非线性滤波。vim 2. 线性滤波

Matlab进行线性滤波可使用imfilter函数,使用很是的方便。ide

g=imfilter (f, w, ltering_mode, boundary_options, size_options)

具体的使用方法就不细说了。掩膜的生成可使用fspecial函数,能够参考其余函数

资料。工具 3. 非线性滤波

matlab工具箱提供了两个执行常规非线性滤波的函数:nlfilter和colfilt。nlfilter直接执行二维操做,而函数colfilt则以列的形式组织数据,虽然colfilt比nlfilter要占用更多的内存,但执行速度要比nlfilter快许多,所以实际使用中若是注重速度,确定都是选择的colfilt。spa

但两个函数的使用方法很是的不一样,特别是colfilt还有点难理解的地方,经过对colfilt的使用终于搞明白了其使用方法,下面对colfilt使用中要注意的地方进行总结。指针 4. colfilt的运行过程及解释

colfilt的原型以下:g=colfilt (f, [m n], 'sliding', @fun, parameters).内存

f:要进行滤波的原图像

[m,n]:掩膜(邻域)的尺寸,通常为奇数*奇数

'sliding':块模式,sliding说明逐个像素的滑动mxn区域

@fun:真是实现滤波的函数,它是一个函数指针,咱们定义一个函数对mxn区域的像素进行处理,而这个函数会被colfilt自动调用。

parameters:咱们定义的函数要传入的其余参数。

colfilt执行过程以下:ci

1. 首先对f进行列变换,假设f是MxN的图像,则会生成一个mnxMN的矩阵。具体的变化方法要深入体会,其实就是把原图像每一个像素邻域内的mn个像素排成一列,原图像总共有MN个像素,所以变换后的矩阵就有MN列。原型

2. 而后colfilt会每次选择多列做为一个矩阵传入到fun中进行处理,到底选择几列是由colfilt按照必定策略进行的。而传入矩阵的行数确定是mn。it

3. fun函数对传入的矩阵进行运算,通常是一列一列的处理,而后返回一个行向量,这个行向量的每一个元素对应每列处理的结果,所以传入的矩阵有多少列就按序生成多少个结果放到对应的行向量中。

4. colfilt对返回的行向量进行存储、反变换,最后获得和原图像等大小的一个矩阵,这就是非线性滤波的最终结果。 5. 举例(求图像的SMD)

functionvars = vimSMD(f)

usecolfilt

f = padarray(f, [3, 3],'replicate');

g = colfilt(f, [3,3],'sliding', @vimabsolute);

g = g(1+3:end-3,1+3:end-3);

vars = sum(g(:))/numel(g(:));

functionv = vimabsolute(A)

[r c] = size(A);

v = zeros(1, c);

fori = 1:c

b = reshape(A(:,i), 3, 3);

v(i) = abs(b(2,2)-b(1,2)) + abs(b(2,2)-b(2, 1));

end

固然求图像的SMD不必定要用colfilt,是为了演示它的用法才用这样的方法,采用两次线性滤波,而后相加的方法进行速度要快的多!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值