How can I vectorize Imread for loop to run faster?
7 views (last 30 days)
Show older comments
Hi,
I have a piece of code that looks like this:
for k=1:numel(file_names)
Img{1,k}=imread(file_names{k});
end
However, because k can be very long, it takes a long time for the loop to run. Is there a way I can achieve the same result (i.e. a vector Img which contains k cells in everyone of which a single 512x512 uint8 image is contained) by vectorization? If not, how can I make this run faster?
Thanks,
0 Comments
Answers (2)
OCDER
on 2 Aug 2018
Edited: OCDER
on 2 Aug 2018
Your current method for using for loop is okay, as vectorizing is more for matrix manipulation + math. This for loop could be slow if you do not initialize Img before the loop, as that'll cause matlab to grow Img by creating a temp array, copying Img to this temp array, replacing old Img with new Img.
Did you initialize Img before hand like this, and it's still slow? And how many images are you trying to read at once?
Img = cell(1, numel(filenames)
for k=1:numel(file_names)
Img{1,k}=imread(file_names{k});
end
Some more useful suggestion and file links here:
5 Comments
OCDER
on 2 Aug 2018
Hmm, 512x512 size tiff should load pretty fast... If you have a solid state drive, then you're set - do not change SSD to HDD.
If you have an old spinning HDD, then the solid state drive would be a huge upgrade, not only for matlab but for your OS. https://en.wikipedia.org/wiki/Solid-state_drive
It was ~$80 for 250GB, and it comes with a cloning software to help you transfer your old OS to the new OS. I believe you need some sort of USB cable + adapter to plug into your SSD before replacing. But then the topic is no longer about matlab... You'll have to look on the web to see if it's worth the upgrade. RAM is another topic for speeding things up.
If you have access to another computer with matlab with more RAM or SSD, test out the imread there to see if it's worth that few sec speed gain. Don't want you upgrade and still suffer from slow speeds o_O
OCDER
on 2 Aug 2018
For my test, it took 0.63 s to read 150 tiff images. I do have SSD , 12GB RAM, 3.2GHZ quad core. Here's script so that anyone can test it.
filenames = cell(1, 150);
for j = 1:numel(filenames)
filenames{j} = sprintf('test%d.tiff', j);
imwrite(rand(512, 512, 3), filenames{j});
end
tic
Img = cell(1, numel(filenames));
for k=1:numel(filenames)
Img{1,k}=imread(filenames{k});
end
toc %0.63s
Image Analyst
on 3 Aug 2018
I guarantee the for loop is not the bottleneck here. I doubt you have more than a few thousand images in a folder, and a for loop of only a few thousand iterations is insanely fast.
tic
for k = 1 : 150;
k; % Basically do nothing but iterate.
end
toc
Shows:
Elapsed time is 0.000008 seconds.
I agree with OCDER that getting an SSD is the most likely solution to speed things up.
2 Comments
See Also
Categories
Find more on Read, Write, and Modify Image 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!