anu*_*hav 13 matlab image-processing
我有一个256x256的图像,我想把它分成4个128x128的块,并将它们分别为A1到A4.现在我想分别调用它们并对它们进行一些操作.我知道这可以使用该blkproc功能完成- 但究竟如何?
我这样打电话blkproc吗?
B=blkproc(I,[4 4],?)
Run Code Online (Sandbox Code Playgroud)
我应该用什么代替"?",如何解决创建的4个块?
gno*_*ice 12
由于blockproc(和不推荐使用的blkproc)都是图像处理工具箱中的函数,我想我会添加一个基本的MATLAB解决方案,不需要额外的工具箱......
如果要将矩阵划分为子矩阵,一种方法是使用mat2cell中断矩阵并将每个子矩阵存储在单元阵列的单元格中.对于您的情况,语法如下所示:
C = mat2cell(I, [128 128], [128 128]);
Run Code Online (Sandbox Code Playgroud)
C现在是一个2乘2的单元阵列,每个单元存储一个128×128的子矩阵I.如果要对每个单元格执行操作,则可以使用该功能cellfun.例如,如果要获取每个子矩阵中值的平均值,则可以执行以下操作:
meanValues = cellfun(@(x) mean(x(:)), C);
Run Code Online (Sandbox Code Playgroud)
第一个参数是匿名函数的函数句柄,它首先将每个子矩阵重新整形为列向量,然后取平均值.输出是每个子矩阵的平均值的2乘2矩阵.如果您传递的函数为每个单元格创建不同大小或类型的输出,那么连接它们会出现问题并将引发错误:cellfuncellfun
??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.
Run Code Online (Sandbox Code Playgroud)
如果添加..., 'UniformOutput', false);到调用结束时cellfun,则上述情况下的输出将是一个2乘2的单元格数组,其中包含在每个子矩阵上执行操作的结果.
blockproc是blkproc(不推荐使用)的新名称.它可用于将函数应用于图像中的每个块.例如,如果要将矩阵I划分为8x8块并计算每个块的平均值,则可以执行以下操作:
B=blockproc(I, [8 8], @(x) mean(x.data(:)));
Run Code Online (Sandbox Code Playgroud)
然后B是包含块的平均值的矩阵.
这里有两点需要注意:
说明符[8 8]指定块的大小,而不是块的数量.
在传递给函数之外,您无法访问块本身blockproc.如果您需要自己的块,您必须按照Adrien的建议:
A1=I(1:128, 1:128);
A2=I(129:256, 1:128);
A3=I(1:128, 129:256);
A4=I(129:256, 129:256);
Run Code Online (Sandbox Code Playgroud)
当然,在实际程序中,您应该使用循环来完成此操作.