Convert STL file to something I can use 'regionprops' function

I have to use a code that uses the 'regionprops' function. The problem is, the program that was originally used to import data as a .tif stack to use in this code is no longer available to me. I can only import as an stl (binary or ASCII). Is there a way that I can use the stl file and convert it to a format supported by the regionprops function? Here is a sample of the code that I have to use. 'bone.photo' was the original reference to the .tif stack that was used before.
LM = bwlabel(bone.photo{ind});
m = regionprops(LM==medLM,'Centroid','Area','EquivDiameter','BoundingBox','PixelList','ConvexHull','ConvexArea');
centroid = cat(1,m.Centroid);
area = cat(1,m.Area)*heightPerPixel*widthPerPixel;
equivdia = cat(1,m.EquivDiameter)*widthPerPixel;
boundingbox = cat(1,m.BoundingBox);
pixellist = cat(1,m.PixelList);
convexarea = cat(1,m.ConvexArea)*heightPerPixel*widthPerPixel;
I have tried making a couple different 'stlread' functions work, but I either get a faces matrix and vertices matrix or edge coordinates. These don't give me a binary image, so they won't work in the 'regionprops' function.

 Accepted Answer

I don't use STL files. Somehow you need to convert the STL file to a binary image. Perhaps you can use poly2mask() to do that.

4 Comments

Is there a way to make the resolution on the output better? Also, it doesn't seem to like any negative numbers I have. The origin of my dataset has been normalized so it is in the middle of the object. Can this function handle these negative numbers somehow or should I just offset it and then put it back later?
You can have the image be as big as you want. The more pixels, the more "accurate" it will be.
Scan the data and add the min plus 1 to the numbers because all indexes (rows and columns) must be integers of 1 or more.
Here is the code I have to do this:
CC = cell(1,length(movelist));
movelist1 = cell(1,length(movelist));
for n=1:length(movelist)
offsetx = min(movelist{1,n}(:,1));
offsety = min(movelist{1,n}(:,2));
CC{n}={offsetx,offsety};
bw_x = movelist{1,n}(:,1)+ceil(abs(offsetx))+1;
bw_y = movelist{1,n}(:,2)+ceil(abs(offsety))+1;
bw = [bw_x, bw_y];
movelist1{n} = bw;
xpix = ceil(max(movelist1{n}(:,1)));
ypix = ceil(max(movelist1{n}(:,2)));
bonebinary{n} = poly2mask(movelist1{n}(:,1),movelist{n}(:,2),xpix,ypix);
end
My problem is, it still isn't showing all the data in the binary conversion. Here is the x,y plot of one of the datasets originally (the data I'm trying to convert from coordinates to binary)
and the resulting binary image from this code.
Can you tell what I'm doing wrong? I just can't get it to show the top half of the original image. It seems strange that its the top half since I thought it didn't like negative numbers. I've played around with the offset values and the pixel values, but it doesn't seem to change it.
NEVERMIND! The last line of my code used the original list without the offset. I forgot to add the 1 to that variable. Fixed!

Sign in to comment.

More Answers (0)

Asked:

on 19 Mar 2018

Commented:

on 20 Mar 2018

Community Treasure Hunt

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

Start Hunting!