How to split a large image into many small images?
21 次查看(过去 30 天)
显示 更早的评论
Hi, I am working on CNN and I have dataset of large images. I want to split each image into many small images to perform training. Could you please tell me how to do it? To be exact, I want 24 small samples from one 1080 x 1920 image.
Further, is it possible to perform splitting in a imageDatastore? To be exact, I want 24 small samples from one 1080 x 1920 image.
Thanks
2 个评论
Image Analyst
2021-6-17
I don't believe imageDatastore() does any image processing -- it's just basically a fancy way of doing dir().
Do you want the samples to be tiled and non-overlapping? Or do you want them taken from random locations?
What I'm confused about is if you're going to use all these small sub-images as training images, how are you going to create your ground truth labels from them?
采纳的回答
DGM
2021-6-17
编辑:DGM
2021-6-17
Blockwise filtering has already been mentioned; since I don't know if that applies to your needs and I have no familiarity with IMDS, I'll just throw this out there.
If you just want to split an image, there are a bunch of ways. You could do it the long way.
inpict = imread('somerandompicture.jpg');
inpict = imresize(inpict,[1080 1920]); % you assert that it's this size
s = size(inpict);
tiling = [4 6]; % i'm assuming this is what you want
f=1;
sout=s(1:2)./tiling;
outpict=zeros([sout,size(inpict,3),prod(tiling)],class(inpict));
for n=1:tiling(2)
for m=1:tiling(1)
outpict(:,:,:,f)=inpict((1:sout(1))+((m-1)*sout(1)),(1:sout(2))+((n-1)*sout(2)),:);
f=f+1;
end
end
In this case, the output is a 4D array. You could use a cell array just the same, though if the goal is to use a cell, you could just do this:
inpict = imread('somerandompicture.jpg');
inpict = imresize(inpict,[1080 1920]); % you assert that it's this size
s = size(inpict);
tiling = [4 6]; % i'm assuming this is what you want
sout=s(1:2)./tiling;
C = mat2cell(inpict,ones(1,tiling(1))*sout(1),ones(1,tiling(2))*sout(2),3)
It's worth noting that both of these will break if your image geometry isn't integer-divisible by the tiling. MIMT imdetile() handles geometry mismatches of the sort, but I doubt you need to deal with it. Just check the geometry and resize as needed.
0 个评论
更多回答(2 个)
David Willingham
2021-6-17
Hi Syed,
I'd encourge you to use blockedImage along with blockedImagedatastore, it will help you perform the block operations for you.
David Willingham
0 个评论
Sulaymon Eshkabilov
2021-6-17
Here is a nice discussion on how to split images with nlfilter() suggested by Rik:
1 个评论
DGM
2021-6-17
To reinforce the distinction, nlfilter() is a rectangular sliding-window filter, whereas blockproc() works on non-overlapping blocks.
另请参阅
类别
在 Help Center 和 File 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!