MATLAB Answers

1

How to keep for loop from over writing variables?

Asked by IowaClassic on 14 Mar 2019
Latest activity Answered by Adam
on 15 Mar 2019
I am new to MATLAB and teaching myself how to use it. I am trying to run some image processing code to measure the vertical length of objects/blobs in an image. I am also calculating the width so that I can later classify the blobs. I need to run this for hundreds of images once it is finished and ideally export all data to an excel (or similar) file fo analysis. I am stuck in my for loops. They keep the last variable but I would like it to keep all data (i.e. values for each blob). How can I keep the for loop from over writing each variable? Below is my code and attached are example post processed images. Any help is greatly appreciated!
close all
file=uipickfiles;
for a = 1:length(file)
RGB=imread(file{a});
imshow(RGB);
label = bwlabel(BW5);
max(max(label));
%Calculating length and width of the blobs;
for j=1:max(max(label))
[row, col] = find(label==j);
len=max(row)-min(row)+2;
width=max(col)-min(col)+2;
end
end
filename = 'testexcel.xlsx';
xlswrite(filename,len);
winopen('testexcel.xlsx');

  10 Comments

Well if you have an outer loop running round some number of images you would need a 2d output result and indexing as e.g.
for n = 1:numImages
for j = 1:...
len( n, j ) = ...
width( n, j ) = ...
...
end
end
You should also presize these variables outside the outer loop as e.g.
len = zeros( numImages, max(max(label)) )
Thanks, Adam. When i presize outside the outerloop, I get an undefned function error. Presizing before the inner loop eliminates this. However, it returns the first three lines of the matrix as zeros. I believe this happen because it is getting resized for each image but only has data for the image it is currently processing. How do I presize outside the outer loop without the undefined function error? Thank you
close all
clear all
file=uipickfiles;
numImages = length(file);
for a = 1:numImages
RGB=imread(file{a});
%there is some image processing code here to get RGB to a binary for the measuring of blobs
imshow(RGB);
label = bwlabel(BW5);
max(max(label));
len = zeros( numImages, max(max(label)) )
width = zeros( numImages, max(max(label)) )
%Calculating length and width of the blobs;
for j=1:max(max(label))
[row, col] = find(label==j);
len(a,j)=max(row)-min(row)+2;
width(a,j)=max(col)-min(col)+2;
end
end
All, I figured it out what I was doing wrong. Thank you for your help!
Adam, Please add your answer to the answer section so that I can mark it as the accepted answer.

Sign in to comment.

1 Answer

Answer by Adam
on 15 Mar 2019
 Accepted Answer

You aren't indexing anything on the left-hand side of all those lines, which is the side where things are stored/overwritten. e.g.
len( j ) = max(row) - min(row) + 2;
If you have an outer loop running round some number of images you would need a 2d output result and indexing as e.g.
for n = 1:numImages
for j = 1:...
len( n, j ) = ...
width( n, j ) = ...
...
end
end
You should also presize these variables outside the outer loop as e.g.
len = zeros( numImages, max(max(label)) )

  0 Comments

Sign in to comment.