MATLAB中blkproc 与 blockproc

转自:http://www.matlabsky.com/thread-11783-1-1.html

MATLAB分块处理矩阵的函数很早就有了——blkproc,但缺点是blkproc必须一次性把要处理的矩阵全部导入内存中,这样大大限制了其应用范围,对一些超大型的图像就无能为力了。

B = blkproc(A,[M,N],fun)
[m,n]为每次分块处理的矩阵大小,A为图像矩阵

幸运的是随着MATLAB使用范围越来越广,MathWorks也紧跟用户需求,新版本的MATLAB推出了可以处理任意大图像的函数blockproc,其用法如下:

  1. B = blockproc(A,[M N],fun)

  2. B = blockproc(src_filename,[M N],fun)

  3. B = blockproc(adapter,[M N],fun)

  4. blockproc(...,param,val,...)
复制代码
A是要处理的图像矩阵,如果图像太大不能完全导入内存,也可以用图像文件名src_filename来表示。[M,N]是希望每次分块处理的矩阵大小,fun是函数句柄,即对每块矩阵的处理函数。
需要说明的是blockproc默认支持tiff/tif和jpeg2000格式的任意大图像处理,如果要读取其他格式的大图像需要针对该图像格式再写一个继承自MATLAB中ImageAdapter这个抽象类的子类adapter,来满足blockproc的输入要求。MATLAB帮助文档中有一个读取lan格式的LanAdapter示例类,大家可以参照那个格式来构造任意图像格式的Adapter类来实现blockproc函数对任意大图像文件的支持。
最后一种调用格式可以实现读取大图像文件,分块处理后再在指定路径写入处理后的图像文件,这个非常有用。下面给一个简单的例子,更多的用法希望大家讨论完善。

  1. fun = @(block_struct) repmat(block_struct.data,5,5) ;%注意处理函数的输入必须是结构体,其data域是我们的矩阵数据,这是由blockproc分块后的机制决定

  2. blockproc('moon.tif',[16 16],fun,'Destination','C:\moonmoon.tif');

  3. imshow('C:\moonmoon.tif')
复制代码
可以看到分块处理后的效果,当然这是简单的把原图像分块(每一子块大小16*16)复制了25倍后的效果。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页