Understanding results from BoneJ2 Anisotropy

Hello everyone,

I am having a hard time making sense of the output data from BoneJ2 Anisotropy, and would love to get some input on it’s meaning.

I see some conflict in what I have read elsewhere (both from a previous post and from BoneJ2 documentation). And my own attempts have not helped me in any ways.

From the previous post, I understood that eigenvectors are presented in a 3x3 matrix as columns (meaning the first column would be x,y,z components of the first eigenvector, associated with the lower eigenvalue, and thus the biggest radius).

BoneJ2 has been developped and distributed ever since this post so I thought I would check the documentation for any change, but it is unclear (in my opinion) regarding that subject. It states that “the values m00, m01, m02, …, m22 correspond to the xyz components of the three eigenvectors of the fitted ellipsoid” which could be interpreted either as the previous explanation or as “m00, m01, m02 correspond to the xyz components of the first eigenvector; m10, m11, m12 to the xyz of the second eigenvector, etc”.

I tried to test the output with a known structure and the results I get don’t match either possibilities, so I am at a loss. To test things out, I created an ellipsoid of known dimensions and orientation in CAD software, voxelised it and ran BoneJ2 anisotropy. The MIL point cloud closely matches the expected result (as you can see on the following image), but I can’t make sense of the eigenvectors and eigenvalues.


This radii of the ellipsoid are a=5mm, b=10mm, c=15mm which would translate to eigenvalues of D3=0.04, D2=0.01, D1=0.0044 respectively.
The orientation is rotated 30° around the z-axis, so I would expect the eigenvectors to be (-sin(30), cos(30), 0), (cos(30), sin(30), 0) and (0, 0, 1) (in order of increasing eigenvalues).

The output from BoneJ2 Anisotropy is the following
DA / a / b / c / m00 / m01 / m02 / m10 / m11 / m12 / m20 / m21 / m22 / D1 / D2 / D3 :
0.84 / 5.9 / 10.6 / 15.1 / 0 / 0 / -1 / 0.84 / 0.54 / 0 / 0.54 / -0.84 / 0 / 0.0044 / 0.0089 / 0.0286

As you can see, the eigenvalues are close, but the eigenvectors are not. They could be, if they were arranged as xyz components in order of increasing radius (meaning the first vector would be (0, 0, -1) associated with radius a=5mm, etc.) but that is not what either sources I have found mention.

So please, if anybody has any insight that could help me understand those results, I would be very interested ! Maybe @mdoube or @alessandrofelder can enlighten me ?

If anyone is curious about the context, I am looking at ways to compute fabric tensors from stress tensors and would like to compare the estimated fabric tensor (computed from FEA stress tensor on trabecular samples) to the mesured fabric tensor on the same trabecular sample. I already have pretty close matching for eigenvalues (following a formula from Hazrati Marangalou et al., 2015) and would love to measure angular differences in eigenvectors.

Sorry for the lengthy post and for the formatting of the output data (I didn’t find any better solution)

Thank you all in advance !

Hi Nicolas,

Your image is not suitable for anisotropy analysis.

The mean intercept length (MIL) and other anisotropy measurements assume a volume or area full of ‘texture’, which is loosely understood as a repeating pattern an order of magnitude or less in scale than the size of the volume or area.

In BoneJ’s case, the typical image is an 3D stack full of trabecular bone, where the trabecular thickness and separation are at least 10× smaller than the stack’s width. People often use anisotropy measurements on other samples with texture, such as soil or rock, which have many small grains and/or pores.

Your image has a single (solid?) ellipsoid, which is not a texture. If you want to measure this ellipsoid (or indeed, many ellipsoids) as individual objects you should use Particle Analyser.

So far it has been difficult to conceptualise a good test image suite for Anisotropy, because it is not obvious how to make an image that has controlled texture with known properties intermediate from pure isotropy to pure anisotropy (i.e. to work backwards from a perfect rose plot and fabric tensor to a test image).

Dear Michael,

Understood, thank you for your quick response. Would maybe repeating this ellipsoid in a regular array (let’s say 10x10x10 for example) solve this problem ?

To be clear, the final objective is indeed to use anisotropy analysis on trabecular bone samples in binary stack form. I was just trying to make sense of the outputted data by supplying a structure of known properties, I guess I didn’t have a good enough understanding of anisotropy measurements for my reasoning to be correct.

Otherwise, could you confirm the information I found in the previous post mentionned above ? I.E. eigenvectors coordinates (x, y, z) correspond to (m00, m10, m20), (m01, m11, m21) and (m02, m12, m22) in the BoneJ Anisotropy output. That would save me from having to do any testing but since the code for BoneJ has been rewritten since that post, I would like to make sure I have a good understanding of it.

Thank you again for your help !


Intuitively it seems like it should, but I’m not sure that it does, at least not in a controllable way where you can predict the eigenvectors, values and DA ahead of time. Maybe a series of ellipsoids of increasing size, sitting inside each other would do it? As long as the axes increase in length by the same amount each time (different for the 3 axes, but the same on each step). But then the sample probes that pass through the different parts of the ellipsoid will sample different oblique paths through the structure - remember it’s a grid of line probes passing in each direction. It’s really not straightforward. But I’d be pleased to know if you figure something out!