-
Notifications
You must be signed in to change notification settings - Fork 12
Anisotropy
The Anisotropy plug-in is used to quantify the directionality of trabecular bone. More generally, the degree of anisotropy measure tells you whether a structure has a certain orientation or not. The anisotropy algorithm is fairly complex and has multiple steps:
- Find mean intercept length (MIL) vectors from n directions.
- Plot MIL vectors into a point cloud
- Solve the equation of an ellipsoid that best fits the point cloud
- Calculate the degree of anisotropy from the radii of the ellipsoid
It's important to note that method is stochastic, and does not guarantee exact results. Thus it's recommended to run it several times to establish degree of anisotropy for your image. It's also designed to analyse sections of a larger structure. That's why a "cube" of trabecular bone is a suitable image, but for example Bat Cochlea Volume is not.
In the first step the algorithm draws a set parallel lines L over the input image in the direction of v, where v is a unit vector with a random orientation. Then for each line it counts the number of phase changes p, i.e. where the line enters from background to foreground. MIL is the sum of ||l_i|| / p_i, l ∈ L, i.e. the lengths of the lines divided by their phase changes. The drawing is repeated n times, every time with a new orientation v. After each repetition a vector v * MIL is added to a point cloud. The coordinates of the points are transformed to the calibration of the image.
In more detail, the lines L are projected from d * d a plane with normal v. The size d = sqrt(w^2 + h^2 + d^2), where w, h, d are the dimensions of the input image. Each line in L originates from a random point o on the plane. The plane is divided into m * m same-sized sections, where m is a number selected by the user. One origin o is randomly located on each section. The projected lines L are sampled for phase changes at each interval i * ±t * v + o, where t is an increment selected by the user. This method of drawing the lines may seem complicated, but according to our tests it offers a fairly equal and unbiased chance for each voxel in the image to be sampled in each direction.
After plotting the MIL vectors a nine term equation of a quadratic surface i.e. quadric is solved with least squares fitting. There are no guarantees about the type of the quadric, or whether it is real or imaginary. That is, the algorithm may sometimes fail to find an ellipsoid that fits the point cloud. Generally speaking, the more repetitions there are in in step 1 the more likely it is that en ellipsoid is found.
If an ellipsoid is found, then the degree of anisotropy (dA) is given by 1.0 - a / c, where a is the shortest and c the longest radius of the ellipsoid. If the ellipsoid is close to sphere (a ≈ c), then the image is isotropic, and dA close to 0.0. If c is much longer than a then dA ≈ 1.0.
See
- Odgaard A (1997), Three-dimensional methods for quantification of cancellous bone architecture, Bone 20: 315-28, DOI: 10.1016/S8756-3282(97)00007-0
- Harrigan TP, Mann RW (1984), Characterization of microstructural anisotropy in orthotropic materials using a second rank tensor, J Mater Sci 19: 761-767, DOI: 10.1007/BF00540446
- Menu path: Plugins>BoneJ>Anisotropy
- Input paremeters
ImgPlus<T> inputImage
Integer directions
Integer lines
Double samplingIncrement
long translations
boolean recommendedMin
boolean printRadii
- Output parameters
Table<DefaultColumn<String>, String> resultsTable
- Calls
-
MILPlane
inorg.bonej.bone-ops
(to be moved tonet.imagej.imagej-ops
or other fitting artefact) -
Quadric
innet.imagej.imagej-ops
-
QuadricToEllipsoid
inorg.bonej.bone-ops
(to be moved tonet.imagej.imagej-ops
or other fitting artefact)
-
- Options
- directions (Integer)
- Label: Directions
- Widget: Spinner-box, min: 9 = Minimum comes from the minimum number of points needed to solve the quadric equation
- Tooltip: The number of times sampling is performed from different directions
- Optional (required = false), defaults to 2000
- Callback to enforce recommended minimum
- lines (Integer)
- Label: Lines per dimension
- Widget: Spinner-box, min: 1
- Tooltip: How many sampling lines are projected in both 2D directions (this number squared)
- Optional (required = false), defaults to 100
- Callback to enforce recommended minimum
- samplingIncrement (Double)
- Label: Sampling increment
- Widget: Spinner-box, min: 0.01, step: 0.1
- Tooltip: Distance between sampling points (in voxels)
- Optional (required = false), defaults to 1.0
- Callback to enforce recommended minimum
- recommendedMin (boolean)
- Label: Recommended minimum
- Widget: Check-box
- Tooltip: Apply minimum recommended values to directions, lines, and increment
- Callback to enforce recommended minimum (default values as described above)
- Not saved (persist = false)
- Optional (required = false)
- printRadii (boolean)
- Label: Show radii
- Widget: Check-box
- Tooltip: Show the radii of the fitted ellipsoid in the results
- Optional (required = false)
- directions (Integer)
- Other
- instruction (String)
- Value: "NB parameter values can affect results significantly"
- Visibility: MESSAGE (non-interactive)
- instruction (String)
- If there's no image open
- Show an error dialog
- Abort the run
- If the input image is not binary
- Show an error dialog
- Abort the run
- If the input image doesn't have three spatial dimensions
- Show an error dialog
- Abort the run
- If the image has anisotropic voxel size (calibration)
- Show a warning dialog
- Abort the run, if user clicks Cancel
- If there are less than 9 points (minimum needed for fitting)
- Show an error dialog
- Abort the run
- If the fitted quadric is not an ellipsoid
- Show an error dialog
- Abort the run
- The degree of anisotropy and radii of fitted ellipsoid (if
printRadii = true
) for each sub-space in a table (Shared Table)
- BoneJ1 draws the MIL lines in a sphere around random seed points. We suspect this produce less uniform sampling.
- The results of this
Anisotropy
do not stabilize, so it's not repeated automatically. However, the results vary less between runs than in BoneJ1.