How to save each image generated in a for loop?

for i=1:20
volume=randi([2 10], 1,1)
location=randi([10 100], 1, 1)
imagegenerator(volume,location)
end
^This is a simplified example of my code.
I generate random variables which are inputted into a function called imagegenerator, which generates an image.
With the for loop, I'm generating several random images.
I want to
1) save each image with a different name each time (i.e "image 1" "image 2" "image 3", etc.)
2) also save the inputs (volume, location) associated with each image (preferably in the same folder/ with the same name "image 1" "image 2" , etc.)
How can I do this? Thanks!
P.S. I want to be able to use all these images/ their inputs later to put into a machine learning algorithm that'll cluster the images based off the pixels or the inputs (not sure yet).

 Accepted Answer

Hi ,you Can use imwrite for saving images. Also use save for 'volume' and 'location'. (you can make datastore and write a Read_function for datastore to import them sequentially for your ML training).
for datastore see this : datastore
Also for images you can use this : imageDatastore
here's some hint: (consider your imagegenerator has image in output).
for i=1:20
volume=randi([2 10], 1,1)
location=randi([10 100], 1, 1)
Name=['image ' num2str(i)];
save([Name '.mat'],'volume','location');
I=imagegenerator(volume,location);
imwrite(I,[Name '.jpg'])
end

7 Comments

I tried saving imagegenerator as I, but it says "there are too many output arguments"
which is why I can't seem to save the image that's generated
if you have access to imagegenerator function, just add output wich is final generated image.
you should find image variable in the function file and write it's name as output.
function I=imagegenerator(volume,location)
%%%%%%
% function Content
%%%%%%
end
Thank you!
Last question: this is the code that I think is generating the image within imagegenerator function:
% PLOT DENSITIES
colormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6);
Which part of this code would I call as "=I"?
Thanks!
I did this in the imagegenerator code:
function image=imagegenerator(volume,location)
....
image=x
colormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6);
And then in the script within the for loop, I wrote this:
image=imagegenerator(volume,location);
%saving image + inputs
Name=['att6image_' num2str(numdesigns)];
save([Name '.mat'],'volfrac');
imwrite(image,[Name '.jpg'])
The images are saving, but they are coming out VERY very tiny + are inverted (black and white colors inverted). How can I fix this?
Also, I looked into datastore as you suggested but am still confused on how I would apply it in this case. Would all the images generated from this for loop be saved in some folder? then would I later call these images for machine learning algorithm?
about first question : the image is tiny propobly because the size itself . i don't know this related or not , just guessing. but use size(I) if you don't know the size already.
about inverted image. as you can see argument in imagesc is -x. thats why you see an image but the inverted is saving as image. you can use this transform :
image=-image; % invert the image
% because the values are less than 0 if you save it and read it again you'll see the image corrupted
% so need to sacle it to be between 0 to 1
I=(image-min(image,[],'all'))/(max(image,[],'all')-min(image,[],'all'))
% then save I as an image
this will scale up your image for reading.
imageDatastore is a class for saving image addresses. you should have a cell that every cell include path to an image . then write this :
imds=imageDatastore(paths)
for many of application in matlab imageDatastore is supported as Train (Test or validation) of ML or deep learning training process.
every time you use read on your datastore , an image come out as an output.
also Labels of train dataset can be saved in this object.
see:
it doesnt need read function for this class.
if you use special dataset you can use datastore
datastore (example : use .mat file as a dataset)
but in most cases you should write read_function yourself.
for example this function that train a Network need imagedatastore as first argument.
net = trainNetwork(imds,layers,options)

Sign in to comment.

More Answers (1)

You can print the image:
print('filename','-dpng','-r300')
where '-dpng' can be set to whatever format you want (check out the help file) and '-r300' is the resolution ('-r0' is screen resolution).
To change the filename to image 1 etc you can add the following to your for loop
f_name = ['image ' num2str(i)];
print(f_name,'-dpng','-r300')
Make sure you close your figures after you're done printing them.
Edit: In terms of saving the data, you can just use
save('filename','volume','location')
That will save it as a Matlab .mat file. If you want to write it to file, you should check out "writematrix" or "fprintf".

5 Comments

Thank you!
Okay, so the imagegenerator generates an image but in order to print this image don't I have to call it something like
A=imagegenerator(volume,location)
and then print that image A?
When i try this it says there are too many outputs
It depends on what the function imagegenerator() allows for output.
Function syntax is:
function [x,y] = FunctionName(a,b)
where x and y are the outputs and a and b are the inputs. If the syntax for imagegenerator is:
function imagegenerator(volume,location)
then the function is not set up to give an output. In this case, you would have to add a line somewhere inside the function to grab the figure handle and output that to A:
function A = imagegenerator(volume,location)
A = figure;
plot(volume,location)
end
Then you could change your original loop to:
for i=1:20
volume=randi([2 10], 1,1)
location=randi([10 100], 1, 1)
% Save the image handle
A = imagegenerator(volume,location);
% Make a file name
f_name = ['image ' num2str(i)];
% Save the figure
print(A,f_name,'-dpng','-r150')
% Close the figure
close(A)
% Save the variables to a .mat file
save(f_name,'volume','location')
end
You're so so helpful, thank you!
Last question: this is the code that I think is generating the image within imagegenerator function:
% PLOT DENSITIES
colormap(gray); imagesc(-x); axis equal; axis tight; axis off;pause(1e-6);
Which part of this code would I call as "A="?
Thanks!
You can either try
A = gcf
at the end of that snippet of code (gcf = "get current figure"). This stores the figure handle in A.
Or you can do it before:
% PLOT DENSITIES
% Open a new figure window
A = figure;
% Add a colormap
colormap(gray);
% Display the image - store the handle in A
imagesc(-x);
% Make the axis equal and tight
axis equal;
axis tight;
% Turn the axis off
axis off;
% Pause for a moment
pause(1e-6);
Very helpful. Thank you!

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!