How to divide an image into blocks in MATLAB?

image-processing, matlab

Solution

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.

Problem

I have a 256x256 image and I want to divide it into 4 blocks of 128x128 each and address them as A1 to A4. Now I want to call them separately and do some operations on them. I know this can be done using the `blkproc` function -- but how exactly? Do I call `blkproc` like this? ``` B=blkproc(I,[4 4],?) ``` What do I put in place of the "?", and how can I address the 4 blocks created?

Original source