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).

 採用された回答

Abolfazl Chaman Motlagh
Abolfazl Chaman Motlagh 2020 年 11 月 2 日

0 投票

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 件のコメント

Rachel Dawn
Rachel Dawn 2020 年 11 月 2 日
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
Abolfazl Chaman Motlagh
Abolfazl Chaman Motlagh 2020 年 11 月 2 日
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
Rachel Dawn
Rachel Dawn 2020 年 11 月 3 日
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!
Rachel Dawn
Rachel Dawn 2020 年 11 月 3 日
編集済み: Rachel Dawn 2020 年 11 月 3 日
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?
Rachel Dawn
Rachel Dawn 2020 年 11 月 3 日
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?
Abolfazl Chaman Motlagh
Abolfazl Chaman Motlagh 2020 年 11 月 3 日
編集済み: Abolfazl Chaman Motlagh 2020 年 11 月 3 日
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.
Abolfazl Chaman Motlagh
Abolfazl Chaman Motlagh 2020 年 11 月 3 日
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)

サインインしてコメントする。

その他の回答 (1 件)

S. Walter
S. Walter 2020 年 11 月 2 日
編集済み: S. Walter 2020 年 11 月 2 日

0 投票

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 件のコメント

Rachel Dawn
Rachel Dawn 2020 年 11 月 2 日
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
S. Walter
S. Walter 2020 年 11 月 2 日
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
Rachel Dawn
Rachel Dawn 2020 年 11 月 3 日
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!
S. Walter
S. Walter 2020 年 11 月 3 日
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);
Rachel Dawn
Rachel Dawn 2020 年 11 月 6 日
Very helpful. Thank you!

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by