Search code examples
matlabmatrixsplitregions

Split matrix into non-overlapping submatrices


I have an image of any size that I need to split into non-overlapping regions of 15x15 pixels. Previously I looked this up and used the following code:

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

My problem is that I may not always be able to split the matrix into nice 15x15 regions. How can I fix this? Also, can you explain what exactly happens? I'd like to understand Matlab better for future use!


Solution

  • If you use the above code with a size not perfectly divisible by 15 (say 160), you will get the following error in MATLAB:

    Input arguments, D1 through D2, must sum to each dimension of the input matrix size, [160 160].'

    So you have to make your second and third input arguments of mat2cell sum to 160. Then you are done.

    Code taken from 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));
    

    In your output cell array, you will see sub-images in the last row and column where either rows or columns (or both) are equal to: rem(size(newIm,1), blockSize(1)) or (and) rem(size(newIm,2), blockSize(2))