Segment orientation from Analyze Skeleton 3D

Tags: #<Tag:0x00007fb87e063ce8>


Hi -

I am trying to extract information on the orientation of vascular canals in the cortex of mouse bones from high-resolution CT data. I have used Skeletonize 3D followed by Analyze Skeleton 3D with the option for extra information on the vertex coordinates, branch lengths and Euclidean distance between them. The issue is that the difference between the Euclidean and branch lengths can be up to 50%, i.e., the branch representing the canal is significantly more tortuous than the vertices suggest. Is there a way that the branches from the skeletonization process can be further divided into shorter segments whose orientation could then be determined from their vertices (using a 3D specific plugin)? This would be especially relevant for canals that are circumferential, by their nature more curved than radial and longitudinal.

Here’s a link to a recent article that discusses a method with an ImageJ plugin, but it relies on prior processing using the LineSet file format from Amira (using its AutoSkeleton feature). Ideally I’d like to automate this all in ImageJ/BoneJ.

Any thoughts or pointing to relevant plugins would be much appreciated!



I don’t know which plugins you could use, but I have an idea how to code this. The Java API of the BoneJ version of AnalyzeSkeleton_ exposes a method SkeletonResult run(). The returned SkeletonResult object has a getGraphs() method, which returns the graphs which AnalyzeSkeleton_ created from the image. Each graph describes one skeleton, and they consist of vertices (junctions & end points) and edges (branches). I’ve explained the structure in more detail here.

An edge consists of two vertices and “slabs”. Slabs are the points that make the edge between the vertices. NB: an edge may have zero slabs. For slabs 1 – n-1 you could calculate orientation with vector subtraction i+1 - i. Then the orientation of the first and last slabs you can find out by comparing them to e.g. the centroids of start and end vertices respectively.

Best regards,


Hi Richard -
Thanks for the quick reply, that sounds like a good idea and reasonable to implement. I’ll fiddle around with it until I get stuck again!


Hi Richard -
I guess I spoke too soon. I’ve been writing the macro in IJM format, and am not familiar with Java. When I select the plugin for Analyze Skeleton 3D, the Results output does not have the coordinates of every slab voxel (or option to list, as far as I can tell), just their number, while the Branch Information window has the coordinates of the vertices, but again not the slabs. I am not sure how to extract that information using the Java API, which I am assuming is what I could get from the getGraphs function.


I am looking for the same kind of solution. If you got to solve your problem could you help me??


See also this thread:


Hi Mukesh -

I did not come up with a satisfactory solution, so I ended up ignoring tortuosity in my dataset. Hope you have better luck!