How to join or merge two Image Data Stores?
Show older comments
If I have two image datastores and I wish to concatenate them. How can I do that?
Thanks
1 Comment
Sherin Aly
on 13 Jan 2018
Edited: Sherin Aly
on 13 Jan 2018
It was a bit tricky but I was able to merge 2 datastores as follows:
imds1 = imageDatastore(location of DS 1,'IncludeSubfolders',true,'LabelSource','foldernames');
imds2 = imageDatastore(imds2 location,'IncludeSubfolders',true,'LabelSource','foldernames');
% create a dummy dataset with the same size of the combined datastores (if ds1 has 100 images and ds2 has 100 images then dummy has 200 images. I made a folder with some photos with equal number of the 2 datastores)
dummy = imageDatastore('Dummy data store locaation','IncludeSubfolders',true,'LabelSource','foldernames');
% note: below this line you can use any datastore variable you want to merge including the ones you get after splitting training and testing
dummy.Files=[imds1.Files;imds2.Files];
dummy.Labels=[imds1.Labels;imds2.Labels];
% Now dummy is the new combined datastore and you can use all datastore functions
Accepted Answer
More Answers (6)
Hana
on 18 Jan 2018
I met the same problem and saw your post. Finally I find out a way:
imds = imageDatastore(cat(1,imds1.Files,imds2.Files))
imds.Labels = cat(1,imds1.Labels,imds2.Labels)
It works for me.
5 Comments
Yifan Dong
on 18 Sep 2018
Brilliant!! Thanks!
Heng Zhang
on 5 Jul 2020
OMG! Thanks bro! That really helps!
Yingying Pang
on 6 Mar 2021
brilliant!!!!!
Silvia Guatelli
on 19 Mar 2021
Excelente!!! Muchas gracias!
Joseph Garrett
on 9 Jan 2022
perfect. thank you so much!!
berkan
on 22 May 2017
1 vote
allImages.Files=[test1.Files;test2.Files]; allImages.Labels=[test1.Labels;test2.Labels];
1 Comment
Sascha D. Krauß
on 3 Jul 2017
Unfortunately, this produces a struct instead of a new datastore - and I could not find a way to convert it back. This means, that you cannot use the datastore specific functions like "countEachLabel" etc. Does anyone know another solution?
Birju Patel
on 30 Oct 2025
1 vote
The best way to do this is to use the datastore combine method:
ds = combine(imds1, imds2, ReadOrder="sequential")
The resulting datastore is a "vertical concatenation" of the two datastores.
KSSV
on 27 Feb 2017
A = imread('ngc6543a.jpg');
B = imread('peppers.png');
%%resize the images so that they have same dimensions
A_resize = imresize(A,[size(B,1) size(B,2)]) ;
%%join them
AB = [A_resize B] ;
imshow(AB) ;
1 Comment
kowshik Thopalli
on 27 Feb 2017
Edited: kowshik Thopalli
on 27 Feb 2017
Aasim Khurshid
on 30 Dec 2020
Edited: Matt J
on 28 Jun 2022
There is a better way to do this,
imds = imageDatastore({fullfile(imgFolder1Adress),fullfile(imgFolder2Adress),fullfile(imgFolder3Adress)},...
'IncludeSubfolders',true,'FileExtensions','.png','LabelSource','foldernames');
Perhaps by wrapping them in a TransformedDataStore (R2019a and higher),
imdsnew = transform(imds1,imds2, @(x) x)
Categories
Find more on Image Data Workflows 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!