Divide Image into Overlapping blocks and save it
2 views (last 30 days)
Show older comments
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.
Demo followed: https://www.mathworks.com/matlabcentral/answers/58125-how-to-divide-image-to-overlapping-blocks?s_tid=answers_rc1-3_p3_Topic
This is my code:
for i=1:1
img=double(imread(strcat(folder,num2str(i),'.jpg')));
aa=blockproc(img, [2084 1042], cropSaveBlock,'BorderSize', [2084 521])
end
function cropSaveBlock()
end
0 Comments
Answers (2)
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
bigimageshow(bim)
% 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);
end
%}
% 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")
end
It looks like you may have multiple images, you can extend this workflow by making an array of blockedImages (see here)
0 Comments
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');
0 Comments
See Also
Categories
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!