当我们在编写一些实现复杂功能的程序,例如图像处理的时候,没有必要把所有的最基本的功能都自己写。例如滑动窗操作,这在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.