How to break an image into blocks?
Show older comments
I have an image with (643x643) dimensions , and i need to split it horizontally and vertically into 100 sub images,so that each sub image is (64x64)pixels using matlab code .The sub images are blocks with (64x64) pixels ,so the height and the width of each block is equal 64
7 Comments
ahmad Al sarairah
on 10 Oct 2019
Rik
on 10 Oct 2019
If you want to divide matrices into cell arrays you can use cell2mat. If you want to do something with those subsections, it might actually be usefull to use blockproc, since that will handle the loops internally for you.
Hadeel
on 21 Aug 2022
yes.sure and the code work with me but i need to disply the blocks in the screen??
Rik
on 21 Aug 2022
Do you mean you want to open the image file with your system viewer? Or do you want to show the images in a Matlab figure?
Answers (1)
Fabio Freschi
on 10 Oct 2019
Edited: Fabio Freschi
on 10 Oct 2019
Three assumprions
1) the image is a 2d matrix
2) the row/cols have 64x3, 3x64 and 3x3 blocks
3) you want 10 sub images, not 100
% A is your image
B = mat2cell(A,[64*ones(1,10) 3],[64*ones(1,10) 3]);
B is a 11x11 cell array with your sub images. You can access each of them with B{i,j}.
If the image is a 3d matrix (643x643x3), just add the third dimension to mat2cell:
B = mat2cell(A,[64*ones(1,10) 3],[64*ones(1,10) 3],3);
8 Comments
ahmad Al sarairah
on 13 Oct 2019
Fabio Freschi
on 13 Oct 2019
So use the method I described using mat2cell Removing the last chunk with 3 pixels
% A is your image
B = mat2cell(A,64*ones(1,10),64*ones(1,10));
ahmad Al sarairah
on 13 Oct 2019
Rik
on 13 Oct 2019
Do you understand the error message? It tells you the inputs must sum to the dimensions. The code in the answer does that for 643x643 inputs. The two codes are not interchangeable.
ahmad Al sarairah
on 13 Oct 2019
Edited: Rik
on 13 Oct 2019
Fabio Freschi
on 13 Oct 2019
Edited: Fabio Freschi
on 13 Oct 2019
if the matrix is 634x643 you can make what are the dimensions of the block you want?
You can make:
- rows: 9 blocks of dimension 64 along and one of dimension 58
- cols: 10 blocks of dimensions 64 and one of dimension 3
- In this case
% dummy matrix
A = rand(634,643);
% partition
B = mat2cell(A,[64*ones(1,9) 58],[64*ones(1,10) 3]);
This code doesn't give error messages. B is a 10x11 cell array. You can access your blocks using B{i,j}. If you have different dimensions, look at mat2cell documentation.
A more general approach: for any dimension of the original image, if you want block with dimension 64 you can use this code
% dummy matrix
A = rand(634,643);
% block dimension
dimBlock = 64;
% number of full row/col blocks
nBlocks = floor(size(A)/dimBlock);
% dimension of the leftover
nRest = size(A)-dimBlock*nBlocks
B = mat2cell(A,[dimBlock*ones(1,nBlocks(1)) nRest(1)],[dimBlock*ones(1,nBlocks(2)) nRest(2)]);
If you dont want the smaller blocks that does not fit the desired 64x64 dimension
% dummy matrix
A = rand(634,643);
% block dimension
dimBlock = 64;
% number of full row/col blocks
nBlocks = floor(size(A)/dimBlock);
B = mat2cell(A(1:nBlocks(1)*dimBlock,1:nBlocks(2)*dimBlock),dimBlock*ones(1,nBlocks(1)),dimBlock*ones(1,nBlocks(2)));
Rik
on 13 Oct 2019
You need to tell Matlab how to split up your array. If I tell you to divide 10 objects in 3 groups of 3, you will ask me what to do with object 10. The code below will show you in multiple steps how to create the grouping for each dimension. Make sure to understand what each line of code does, and look at the contents of D{1} and D{2}.
A = rand(634,643);
D=cell(1,2);
for dim=1:2
D{dim}=64*ones(1,floor(size(A,dim)/64));
if sum(D{dim})~=size(A,dim)
%extend with remainder
D{dim}(end+1)=size(A,dim)-sum(D{dim});
end
end
B=mat2cell(A,D{1},D{2});
Image Analyst
on 13 Oct 2019
No one has actually directly asked what you want to do with the blocks. So I will, because it probably matters. What do you plan on doing with the blocks once you have them?
And again, like the others keep stressing to you, you will not have blocks all the same size if you have an image 643 pixels wide and use blocks 64 pixels wide. What are your plans for the different sized block?
Categories
Find more on Neighborhood and Block Processing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!