| Literature DB >> 33954267 |
Richard Domander1, Alessandro A Felder1,2, Michael Doube1,3.
Abstract
Research software is often developed with expedience as a core development objective because experimental results, but not the software, are specified and resourced as a project output. While such code can help find answers to specific research questions, it may lack longevity and flexibility to make it reusable. We reimplemented BoneJ, our software for skeletal biology image analysis, to address design limitations that put it at risk of becoming unusable. We improved the quality of BoneJ code by following contemporary best programming practices. These include separation of concerns, dependency management, thorough testing, continuous integration and deployment, source code management, code reviews, issue and task ticketing, and user and developer documentation. The resulting BoneJ2 represents a generational shift in development technology and integrates with the ImageJ2 plugin ecosystem. Copyright:Entities:
Keywords: Biology; Bone; BoneJ; FIJI; Image analysis; ImageJ; Java; Morphometry; Open-source; Programming; Software engineering
Year: 2021 PMID: 33954267 PMCID: PMC8063517 DOI: 10.12688/wellcomeopenres.16619.1
Source DB: PubMed Journal: Wellcome Open Res ISSN: 2398-502X
Figure 1. An overview of BoneJ architecture.
Modern wrapper plugins call both ImageJ and third-party plugin code. They mainly run algorithms from the ImageJ Ops framework. Both Modern and Legacy plugins depend on various ImageJ libraries. ImageJ Ops and library architecture are described in more detail elsewhere [8]. The presence of all the components necessary to run BoneJ is managed by Maven on the developer side and by the ImageJ Updater on the user side.
Continuity table showing how plugins from BoneJ1 were carried forward.
| Functionality | Status |
|---|---|
| Analyse Skeleton | wrapped external (Fiji plugin) |
| Anisotropy | ported |
| Connectivity
[ | ported |
| Delete Slice Range | legacy |
| Density Distribution
[ | ported external (PQCT) |
| Ellipsoid Factor | ported |
| Erode 3D, Dilate 3D | external (ImageJ plugins) |
| Fit Ellipsoid | ported |
| Fit Sphere | legacy |
| Fractal Dimension | ported |
| Help
[ | discontinued |
| Interpolate ROIs | ported external (ImageJ1) |
| Intertrabecular Angles | new |
| Isosurface
[ | ported |
| ISQ Reader / Scanco ISQ | ported external (SCIFIO) |
| Kontron IMG | ported external (SCIFIO) |
| Moments of Inertia | legacy |
| Neck Shaft Angle | discontinued |
| Optimise Threshold | discontinued |
| Orientation
[ | legacy |
| Particle Analyser | legacy |
| Plateness | discontinued |
| Purify | legacy |
| Stratec pQCT | ported external (SCIFIO & PQCT) |
| Skeletonise 3D | wrapped external (Fiji plugin) |
| Slice Geometry | legacy |
| Structure Model Index | discontinued |
| Thickness | wrapped external (Fiji plugin) |
| Usage reporting
[ | ported |
| Volume Fraction
[ | ported |
★Renamed to Surface area
†Split into Surface fraction and Area/Volume fraction
‡Added to BoneJ1 after the publication of Doube et al. (2010) [1]
*Split into an independent plug-in
♦Both legacy and modern implementations are provided due to the higher performance of legacy code
Expected results logged in the BoneJ result table comparing BoneJ2 and BoneJ1 output.
Due to the stochastic nature of sampling both degree of anisotropy (DA) and ellipsoid factor (EF) vary between runs in an image- and setting-specific manner. Modern Anisotropy and Ellipsoid Factor [16] plugins differ in implementation from those in BoneJ1, so some minor variation in output is expected. Users are strongly encouraged to run sensitivity analyses. to select settings for Anisotropy and Ellipsoid Factor (as we have done) [16] that produce a stable result on their images. Note that Thickness, Volume Fraction and Connectivity are direct ports from BoneJ1 to BoneJ2 and have no stochastic character, so their results are expected to be invariant for the same input image. BoneJ2’s Purify uses Particle Analyser’s improved ConnectedComponents code [19] and completes in ~ 1 s compared to ~ 15 s in BoneJ1.
| Image | BoneJ2
| BoneJ 1.4.3 |
|---|---|---|
| DA | 0.51675 | 0.56665 |
|
| 25.92792 | 25.92792 |
|
| 62.21983 | 62.21983 |
|
| 0.41671 | 0.41671 |
|
| 0.21246 | 0.21246 |
|
| 0.06347 | 0.06347 |
|
| 0.43277 | 0.43277 |
|
| 0.47014 | 0.47014 |
|
| 0.14888 | 0.14888 |
|
| 0.96242 | 0.96242 |
|
| -0.14632 | NaN (mean, -0.21451) |
|
| 0.91779 | 0.91695 |
|
| -0.84867 | -0.93064 |
|
| -291 | -291 |
|
| -238.375 | -238.375 |
|
| 239.375 | 239.375 |
|
| 3.84725 | 3.84725 |
Figure 2. Sample image output from the worked example above.
Stacks displaying maps of Tb.Th ( A), Tb.Sp ( B), Tb.EF ( C) contain pixels whose values represent the local thickness, separation or ellipsoid factor respectively, each with the Fire lookup table (LUT) applied and spread between the minimum and maximum pixel value. Background pixels are set to NaN (not a number) to exclude them from numerical analysis. Plotting histograms ( Analyze > Histogram...) of the output image stacks results in distributions and summary statistics for Tb.Th ( E), Tb.Sp ( F) and Tb.EF ( G): note the relation between the LUT and histogram x-axis values. Converting the EF image ( C) to RGB ( Image > Type > RGB) and loading in the 3D Viewer ( Plugins > 3D Viewer) results in an interactive 3D visualisation ( D).