How to divide an image into blocks in MATLAB?

Since blockproc (and the deprecated blkproc) are both functions in the Image Processing Toolbox, I thought I’d add a basic MATLAB solution that requires no additional toolboxes…

If you want to divide a matrix into submatrices, one way is to use mat2cell to break the matrix up and store each submatrix in a cell of a cell array. For your case, the syntax would look like this:

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

C is now a 2-by-2 cell array with each cell storing a 128-by-128 submatrix of I. If you want to perform an operation on each cell, you could then use the function cellfun. For example, if you wanted to take the mean of the values in each submatrix, you would do the following:

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

The first argument is a function handle to an anonymous function which first reshapes each submatrix into a column vector and then takes the mean. The output is a 2-by-2 matrix of the mean values for each submatrix. If the function you pass to cellfun creates outputs of different sizes or types for each cell, then cellfun will have a problem concatenating them and will throw an error:

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

If you add ..., 'UniformOutput', false); to the end of your call to cellfun, then the output in the above case will instead be a 2-by-2 cell array containing the results of performing the operation on each submatrix.

Leave a Comment