matlab中用colfilt实现非线性滤波
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 图像的空域线性滤波和非线性滤波
在空域对图像进行滤波处理无非两种情况,线性滤波和非线性滤波。滤波的意思就是对原图像的每个像素周围一定范围内的像素进行运算,运算的范围就称为掩膜或领域。而运算就分两种了,如果运算只是对各像素灰度值进行简单处理(如乘一个权值)最后求和,就称为线性滤波;而如果对像素灰度值的运算比较复杂,而不是最后求和的简单运算,则是非线性滤波;如求一个像素周围3x3范围内最大值、最小值、中值、均值等操作都不是简单的加权,都属于非线性滤波。
2. 线性滤波
Matlab进行线性滤波可以使用imfilter函数,使用非常的方便。
g=imfilter (f, w, ltering_mode, boundary_options, size_options)
具体的使用方法就不细说了。掩膜的生成可以使用fspecial函数,可以参考其他
资料。
3. 非线性滤波
matlab工具箱提供了两个执行常规非线性滤波的函数:nlfilter和colfilt。nlfilter直接执行二维操作,而函数colfilt则以列的形式组织数据,虽然colfilt比nlfilter要占用更多的内存,但执行速度要比nlfilter快许多,因此实际使用中如果注重速度,肯定都是选择的colfilt。
但两个函数的使用方法非常的不同,特别是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执行过程如下:
1. 首先对f进行列变换,假设f是MxN的图像,则会生成一个mnxMN的矩阵。具体的变化方法要深刻体会,其实就是把原图像每个像素邻域内的mn个像素排成一列,原图像总共有MN个像素,因此变换后的矩阵就有MN列。
2. 然后colfilt会每次选择多列作为一个矩阵传入到fun中进行处理,到底选择几列是由colfilt按照一定策略进行的。而传入矩阵的行数肯定是mn。
3. fun函数对传入的矩阵进行运算,一般是一列一列的处理,然后返回一个行向量,这个行向量的每个元素对应每列处理的结果,因此传入的矩阵有多少列就按序生成多少个结果放到对应的行向量中。
4. colfilt对返回的行向量进行存储、反变换,最后得到和原图像等大小的一个矩阵,这就是非线性滤波的最终结果。
5. 举例(求图像
的SMD) function vars = vimSMD(f)
use colfilt
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(:));
function v = vimabsolute(A)
[r c] = size(A);
v = zeros(1, c);
for i = 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,是为了演示它的用法才用这样的方法,采用两次线性滤波,然后相加的方法进行速度要快的多!
本文出自 “景元的技术专栏” 博客,请务必保留此出处/920538/244284