MATLAB: How to divide images from folder into 4×4 blocks

Computer Vision Toolboxdigital image processingimage processingImage Processing Toolboxrgbsupport vector machinesvm

I want to divide all images in a folder into 4×4 blocks and then store the RGB information in a zeros matrix. A sample of what the images look like is attached. Does anyone know how to divide into these blocks and then store the information in the matrix.

Best Answer

Hi Petrus, the mat2cell approach that Jonas pointed out can be done more generally as follows. Note, this handles the scenario where image dimensions are not a factor of the corresponding block dimensions (the remainder rows or columns are ommited)
1. Parameters
blockHeight = 4;
blockWidth = 4;
folderName = 'C://...'; % folder containing images
2. Directory. These three lines can be used by others to replicate the demo. Once you modify folderName you can replace the following three lines with the fourth one.
[fils(1:6).folder] = deal('');
fnames = cellfun(@(x) sprintf('office_%s.jpg',x),{'1','2','3','4','5','6'},'uni',false);
[fils.name] = fnames{:};
%fils = dir(fullfile(folderName,'*.PNG')); < Replace the above with this line
3. Load an initial image to get some metadata:
I0 = imread(fullfile(fils(1).folder,fils(1).name));
N1 = blockHeight*ones(floor(size(I0,1)/blockHeight),1);
N2 = blockWidth*ones(floor(size(I0,2)/blockWidth),1);
4. Loop through your directory:
L = cell(numel(fils),1);
for ii = 1:numel(fils)
I = imread(fullfile(fils(ii).folder,fils(ii).name));
b = mat2cell(I(1:blockHeight*numel(N1),1:blockWidth*numel(N2),:),N1,N2,3);
L{ii} = cat(4,b{:}); % alternatively L{ii} = b;
end
L
L = 6×1 cell array
{4×4×3×33750 uint8} {4×4×3×33750 uint8} {4×4×3×33750 uint8} {4×4×3×33750 uint8} {4×4×3×33750 uint8} {4×4×3×33750 uint8}
The result, L, is then a 6 by 1 cell array of matrices where each cell corresponds to an image. The matrix dimensions (4x4x3x3750) correspond to the block height, block width, RGB, and a linear index for the block.