高效地使用Matlab加速滑动窗

当我们在编写一些实现复杂功能的程序,例如图像处理的时候,没有必要把所有的最基本的功能都自己写。例如滑动窗操作,这在matlab里面看起来是一个非常耗时间的处理,因为matlab这种脚本语言对于循环的加速不是很好。例如我们有一个图像I和一个小区域MxN,我们称为ROI,我们在这个ROI里通常想做:图像增强,获取一些统计信息,例如均值,方差等以及其他。

在matlab的Image Processing 工具箱里,实际上已经为我们提供了好几个辅助函数,能让我们的程序编写变得更加轻松,而不是写一大堆for和end。这几个函数包括 blockproc, nlfilter, colfilt 等。函数的具体说明推荐大家看相应的帮助文档,matlab的help一向是写的非常清晰明白的。这里简单说一下这几个函数的用法和区别,

blockproc是比较强大的一个,它可以接受一个函数句柄fun以及一个滑动窗大小[M,N],然后将输出结果重新连接为一个新的矩阵。

B = blockproc(Image, [M N], fun)
其中,image可以是读入进来的图像,也可以是计算机上的图像存储路径。这个功能确实很实用,因为有些大图像预先读入进来非常占内存。需要说明的是blockproc默认支持tiff/tif和jpeg2000格式的任意大图像处理,如果要读取其他格式的大图像需要针对该图像格式再写一个继承自MATLAB中ImageAdapter这个抽象类的子类adapter,来满足blockproc的输入要求。见帮助文档。
f =@(block_struct)imresize(block_struct.data,0.15);
I =imread('rose-original.tif');
I2 =blockproc(I,[100,100],f);
figure;
imshow(I);
figure;
imshow(I2);
上面是帮助文档中给出的一个例子,这个例子看起来很简单,但是依照这种方法可以设计很多强大的功能。

nlfilter, colfilt使用方法类似。根据matlab的文档,在多数情况下,colfilt处理速度要比nlfilter更快一些。与blockproc的区别是这两个函数只能处理2维矩阵,就是灰度图像,并且不支持文件名作为第一个参数。因为这两个函数本质上是处理矩阵的,不是专门针对图像的。colfilt中,函数句柄的输出是一个;这两个函数和模版运算conv2的区别就是前者可以接受任何句柄,而模版只能是线性操作。例如

I =imread('rose-original.tif');
figure;
imshow(I);
I2 =colfilt(I,[5,5],'sliding',@max);
%I2 =nlfilter(I,[5,5],@max)
figure;
imshow(I2);



关于Image Engineering & Computer Vision的更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.


你可能感兴趣的:(matlab,图像处理,计算机视觉,加速滑动窗)