How to split a large image into many small images?
24 ビュー (過去 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!