将矩阵拆分为非重叠子矩阵

时间:2014-09-28 08:40:52

标签: matlab matrix split regions

我有一个任何尺寸的图像,我需要分成15x15像素的非重叠区域。以前我查了一下并使用了以下代码:

newIm = rand(size(im2, 1),size(im2, 2));
subIm = mat2cell(newIm, 15*ones(size(newIm,1)/15,1), 15*ones(size(newIm,2)/15,1));

我的问题是我可能无法始终将矩阵拆分为漂亮的15x15区域。我怎样才能解决这个问题?另外,你能解释到底发生了什么吗?我想更好地了解Matlab以备将来使用!

1 个答案:

答案 0 :(得分:2)

如果使用上面的代码,其大小不能完全被15整除(比如说160),那么在MATLAB中会出现以下错误:

  

输入参数D1到D2必须与输入矩阵大小的每个维度相加,[160 160]。'

所以你必须将mat2cell总和的第二和第三个输入参数加到160.然后你就完成了。

代码来自here

blockSize=[15 15];
wholeBlockRows = floor(size(newIm,1)/ blockSize(1));
blockVectorR = [blockSize(1) * ones(1, wholeBlockRows), rem(size(newIm,1), blockSize(1))];
wholeBlockCols = floor(size(newIm,2)/ blockSize(2));
blockVectorC = [blockSize(2) * ones(1, wholeBlockCols), rem(size(newIm,2), blockSize(2))];

% sum of blockVectorR and blockVectorC will be equal to size(newIm,1) and 
% size(newIm,2) respectively.

ca = mat2cell(newIm, blockVectorR, blockVectorC, size(newIm,3));

在输出单元格数组中,您将看到最后一行和一列中的子图像,其中行或列(或两者)等于:rem(size(newIm,1), blockSize(1))或(和)rem(size(newIm,2), blockSize(2))