Divide Image into Overlapping blocks and save it

조회 수: 4 (최근 30일)
Tahir Mahmood
Tahir Mahmood 2019년 3월 25일
편집: Ashish Uthama 2022년 9월 8일
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
img=double(imread(strcat(folder,num2str(i),'.jpg')));
aa=blockproc(img, [2084 1042], cropSaveBlock,'BorderSize', [2084 521])
end
function cropSaveBlock()
end

답변 (2개)

Ashish Uthama
Ashish Uthama 2022년 9월 8일
편집: Ashish Uthama 2022년 9월 8일
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)

Benjamin Thompson
Benjamin Thompson 2022년 6월 13일
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');

카테고리

Help CenterFile Exchange에서 Image Processing and Computer Vision에 대해 자세히 알아보기

태그

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by