如何在MATLAB中将图像划分为块?
image-processing
matlab
5
0

我有一个256x256的图片,我想将其分为4个128x128的块,并将它们分别命名为A1至A4。现在,我想分别调用它们并对其进行一些操作。我知道可以使用blkproc函数完成此操作-但究竟如何呢?

我这样叫blkproc吗?

B=blkproc(I,[4 4],?)

我要用什么代替“?”,如何处理创建的4个块?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

blockprocblkproc的新名称(已弃用)。它可用于将功能应用于图像中的每个块。例如,如果您想将矩阵I划分为8x8的块并计算每个块的平均值,则可以这样做:

B=blockproc(I, [8 8], @(x) mean(x.data(:)));

那么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); 

    当然,在实际程序中,您可能应该使用循环来执行此操作。

收藏
评论

由于blockproc (和不赞成使用的blkproc )都是Image Processing Toolbox中的函数,因此我想我将添加一个基本的MATLAB解决方案,该解决方案不需要其他工具箱...

如果要将矩阵划分为子矩阵,一种方法是使用mat2cell分解矩阵并将每个子矩阵存储在单元阵列的单元中。对于您的情况,语法如下所示:

C = mat2cell(I, [128 128], [128 128]);

C现在是2×2单元阵列,每个单元都存储I的128×128子矩阵。如果要对每个单元执行操作,则可以使用功能cellfun 。例如,如果要取每个子矩阵中值的平均值,则可以执行以下操作:

meanValues = cellfun(@(x) mean(x(:)), C);

第一个参数是匿名函数函数句柄 ,该函数首先将每个子矩阵整形为列向量,然后取均值。输出是每个子矩阵的平均值的2×2矩阵。如果传递给cellfun的函数为每个单元格创建不同大小或类型的输出,则cellfun将它们连接起来会出现问题,并会引发错误:

??? Error using ==> cellfun
Non-scalar in Uniform output, at index 1, output 1.
Set 'UniformOutput' to false.

如果添加..., 'UniformOutput', false);到对cellfun的调用结束时,上述情况下的输出将改为2 x 2 单元格数组,其中包含对每个子矩阵执行操作的结果。

收藏
评论

如果myImage是您的256x256图像,不是myImage

image_top_left = myImage(1:128,1:128);
image_top_right = myImage(1:128,129:256);
image_bottom_left = myImage(129:256,1:128);
image_bottom_right = myImage(129:256,129:256);

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号