我有一张256x256的图片,我想把它分成4个128x128的块,每个块的地址是A1到A4现在我想分别给他们打电话,做些手术我知道这可以使用blkproc
函数来完成——但是具体是怎么做到的呢?
我要这样打电话吗?
B=blkproc(I,[4 4],?)
我该用什么来代替“?”,如何处理创建的4个块?
最佳答案
由于blockproc
(和不推荐使用的blkproc
)都是Image Processing Toolbox中的函数,我想我应该添加一个基本的MATLAB解决方案,它不需要额外的工具箱。。。
如果要将矩阵划分为子矩阵,一种方法是使用mat2cell
将矩阵分解并将每个子矩阵存储在单元数组的一个单元中对于您的情况,语法如下所示:
C = mat2cell(I, [128 128], [128 128]);
C
现在是一个2乘2单元阵列,每个单元存储一个128乘128子矩阵如果要对每个单元格执行操作,则可以使用函数I
。例如,如果要取每个子矩阵中值的平均值,可以执行以下操作:meanValues = cellfun(@(x) mean(x(:)), C);
第一个参数是afunction handle到aanonymous function的参数,它首先将每个子矩阵重塑为列向量,然后取平均值输出是每个子矩阵的平均值的2乘2矩阵。如果传递给
cellfun
的函数为每个单元格创建不同大小或类型的输出,则cellfun
将在连接它们时遇到问题,并将引发错误:??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
如果在对
cellfun
的调用结束时添加..., 'UniformOutput', false);
,则上述情况下的输出将是一个2乘2的单元格数组,其中包含对每个子矩阵执行操作的结果。