Mikhail Genkin
Mikhail Genkin

Reputation: 3460

Failed to convert structure to matrix with regionprops in MATLAB

I am working with particle tracking in images in MATLAB and using regionprops function. On the provided resource there is an example with circles:

stats = regionprops('table',bw,'Centroid',...
'MajorAxisLength','MinorAxisLength')  
centers = stats.Centroid;
diameters = mean([stats.MajorAxisLength stats.MinorAxisLength],2);
radii = diameters/2;

In my Matlab R2014b, the line centers = stats.Centroid; produces undesired result: my stats.Centroid structure has 20 elements (each element is two numbers - the coordinates of the center of the region). However, after the following command, my variable center is only 1x2 matrix, instead of desired 20x2.

Screenshot attached.

enter image description here

I tried to go around this with different methods. The only solution I found is to do:

t=zeros(20,2);
for i=1:20
    t(i,:)=stats(i).Centroid;
end

However, as we all know loops are slow in MATLAB. Is there another method that takes advantage of MATLAB matrix operations?

Upvotes: 3

Views: 330

Answers (1)

rayryeng
rayryeng

Reputation: 104503

Doing stats.Centroid would in fact give you a comma-separated list of centroids, so MATLAB would only give you the first centre of that matrix if you did centers = stats.Centroid. What you must do is encapsulate the centres in an array (i.e. [stats.Centroid]), then reshape when you're done.

Something like this should work for you:

centers = reshape([stats.Centroid], 2, []).';

What this will do is read in the centroids as a 1 x 2*M array where M is the total number of blobs and because MATLAB does reshaping in column-major format, you should make sure that specify the total number of rows to be 2 and let MATLAB figure out how many columns there are after by itself. You would then transpose the result when you're done to complete what you want.

Minor Note

If you look at the regionprops documentation page in their Tips section - http://www.mathworks.com/help/images/ref/regionprops.html#buorh6l-1, you will see that they surround stats.Area, which is the area of each blob with [] brackets to ensure that the comma-separated list of values is encapsulated in an array. This is not an accident and there is a purpose of having those there and I've basically told you what that was.

Upvotes: 4

Related Questions