Divide Image into Overlapping blocks and save it

19 views (last 30 days)
Hi, I want to divide an image into 3 overlapping block.
input image size=2084 by 2084, output image sizes should be 2084 by 1042 with 50% overlapping. I tried using blockproc but encountering an error, "Too many output arguments.".
How to divide this image into blocks and save each by different name?.
I followed the demo, but these demos are for non-overlapping. I want overlapping blocks. Thank you.
This is my code:
for i=1:1
aa=blockproc(img, [2084 1042], cropSaveBlock,'BorderSize', [2084 521])
function cropSaveBlock()

Answers (2)

Ashish Uthama
Ashish Uthama on 8 Sep 2022
Edited: Ashish Uthama on 8 Sep 2022
input image size=2084 by 2084, output image sizes should be 2084 by 1042% with 50% overlapping
Here is some sample code:
im = ones(2084);
% blockedImage can directly load an image too.
bim = blockedImage(im);
% See help selectBlockLocations for more examples.
blockSize = [2084 1042];
overlapPct = 0.5;
blockOffsets = round(blockSize.*overlapPct);
bls = selectBlockLocations(bim,...
'BlockSize', blockSize,...
'BlockOffSets', blockOffsets,...
'ExcludeIncompleteBlocks', true);
% Create a datastore from this set of blocks
bimds = blockedImageDatastore(bim, 'BlockLocationSet', bls);
% Visualize the block locations to confirm logic
% Block size is in row-col (height-width) order
blockWH = fliplr(bls.BlockSize(1,1:2));
colors = prism(size(bls.BlockOrigin,1));
for ind = 1:size(bls.BlockOrigin,1)
blockColor = colors(ind,:);
% BlockOrigin is already in x-y order
drawrectangle('Position', [bls.BlockOrigin(ind,1:2), blockWH],'Color', blockColor);
% You can use this datastore (bimds) directly depending on your workflow.
% Read each block and write it out
while hasdata(bimds)
[data, info] = read(bimds);
imwrite(data{1}, "blockStart_"+num2str(info.Start)+".jpg")
It looks like you may have multiple images, you can extend this workflow by making an array of blockedImages (see here)

Benjamin Thompson
Benjamin Thompson on 13 Jun 2022
An image is just a matrix. If you want to save a part, then
imwrite(img(1:2084,1:1042), 'file1.jpg', 'jpg');
imwrite(img(1042:2084,524:1042), 'file2.jpg', 'jpg');


Find more on Image Processing and Computer Vision 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!