Skip to content

Backlog

Michael Doube edited this page Aug 31, 2018 · 33 revisions

This page catalogues ideas for future enhancements and fixes to BoneJ code. The idea is that the team creates issues and project notes from these, after they've decided which go to the next release. Some items are here, because they're waiting for technology to mature, e.g. SciView. Some items also need discussion before we decide to work on them.

Project

Remaining Legacy plug-ins

  • DeleteSliceRange
  • DensityCalibrator
  • EllipsoidFactor
  • Moments
  • Orienteer
  • ParticleCounter
  • Purify
  • SliceGeometry
  • SphereFitter
  • ThresholdMinConn
  • VoxelDepthChecker

General enhancements

  • UI agnosticism: ideally BoneJ plug-ins would be independent of the UI, but for now they require the UI from net.imagej.imagej-legacy. For the moment, Fiji is still shipped with the legacy UI.
  • Credit the authors of Skeletonize / AnalyzeSkeleton / Thickness in the wrappers. We should make clear that we're calling other peoples' code, even if we provide support on the forum.
  • Implement dynamic setup dialogs by extending DynamicCommand
    • Having callBacks, verifiers and persistent @Parameters makes this difficult. You can use AbstractModule.initialize() to setup your saved values correctly, when they depend on each other. However this creates problems when your plug-in gets called through CommandService.run, i.e. inputs are ignored / overridden. See this forum post for more details.
  • Change uiService.showDialog to statusService.showStatus in case of warnings
    • Pros: showStatus doesn't interrupt plug-in
    • Cons: user might miss the warning
  • When messages for contingency checks become possible, add explanations to Ops why matchings fail
  • Add unit tests to sc.fiji.LocalThickness_ from legacy BoneJ
  • Remove remaining dependencies to ImageJ3D from the Legacy module
  • Fix ImageCheck.checkEnvironment() in Legacy. Only check for ImageJ3D where necessary
  • Add usage reporting (like in BoneJ1) to wrapper plug-ins
    • Maybe UsageService can be used for this?
  • Should all the results of the wrappers be output @Parameters in case someone wants to run them headless or from scripts?
    • It is possible to grab results from the SharedTable, but it's not as handy. Also not all results are there.
    • We don't know yet how post-processors will automatically display different types of results, i.e. a @Parameter Double importantMeasure could be displayed in a dialog in addition to our table. To avoid this we'd have to code a custom post-processor (a lot of work), or hack the wrapper so that it leaves output parameters null unless the plug-in is running headless.
    • Someone writing a script might as well call the ops our wrappers call, even though they do calculate some simple derived results, e.g. degree of anisotropy from the radii of an ellipsoid returned by QuadricToEllipsoid
  • Wrappers plug-ins that take ImagePlus parameters - such as AnalyseSkeletonWrapper don't support hyperstacks. This is because the underlying implementations would process them incorrectly, which means that we'd first have to split the hyperstack to 3D subspaces. One option could be to take in an ImgPlus, split that, and then convert the subspaces to ImagePlus. However, in the past there have been conversion issues, like missing (pixel) calibration metadata.
  • Support for true N-dimensional images: At the moment the wrappers only support hyperstacks with x, y, z, channel and time dimensions. The metadata in the image classes of ImageJ don't yet support other types of dimensions. Technical and conceptual questions need to be considered before implementing the support. For example, if an image has modality dimension, for which plug-ins does it make sense to aggregate the measures for all the modalities? Or should measures for different modalities always be measured and reported separately? In principle HyperStackUtils already supports splitting 3D subspaces along any dimension - you just need to make sure that it, for example, recognizes MODALITY type Axes correctly.
  • Ideally calls to logService, statusService would be tested automatically in the wrapper tests. So far, I've only been able to mock uiService in the ImageJ context. Maybe Mockito.spy allows you to do this.
  • Ship BoneJ with a plug-in for reporting bugs to GitHub
  • Determine how legacy style macros work with Modern plug-ins? What about other scripting languages like Python?
  • Some plug-ins have duplicate menu paths. For example, the Thickness plugin can be found under Plugins>BoneJ>Thickness and Analyze>Local Thickness. This is because ThicknessWrapper depends on the old-school Thickness_.jar. This JAR has the ImageJ1 style plugins.config, which makes the plug-in appear in Analyze>Local Thickness. The plug-in behaves differently based on which path it's called from. Calling it from the "IJ1 path" bypasses the wrapper.

General Fixes

  • @Parameter ImagePlus doesn't work without the legacy UI (because autoconversion / legacy input harvester is not activated..?)
  • Investigate persistence issues (parameters stop remembering their changed values)
  • Add a command BoneJOptions to Edit>Options>BoneJ, which has Anisotropy tolerance, and other options shared by BoneJ commands

New features

  • MetadataViewer tool for SCIFIO formats such as Kontron IMG (or wait ImageJ2/Fiji to implement support)
    • Metadata harvested by SCIFIO is not shown in the image info dialog (the i key)
  • Anisotropy for 2D images
    • Either anisotropy wrapper should accept both 2D / 3D and choose appropriate ops, or we create a separate 2D wrapper
  • Use SciView for rendering like ImageJ3DViewer is used in BoneJ1
    • We should wait for SciView to further integrate with Fiji for two reasons:
      1. No need to worry about supplying native libraries from BoneJ update site (which might break peoples' ImageJ)
      2. No need to worry about people having JRE with JavaFX libraries. In the future either Fiji will ship with JavaFX, or SciView will drop JavaFX.
    • SciView will (very likely) become the go-to renderer for Fiji

Anisotropy wrapper

  • A boolean parameter to filter outlier points before calling Quadric op

Element fraction

  • A boolean parameter to limit calculations to ROIs
    • Wait until modern ROIs have been implemented
  • Should Δχ be calculated by implementing χ for 2D faces, 1D edges and 0D vertices as here? Should we add euler characteristic ops for 2D, 1D and 0D?

Fractal dimension wrapper

  • Plot log(n) / log(m) data points

Isosurface wrapper

  • Show meshes with SciView
  • Remove the option for saving .STL files, and allow SciView to do it
    • No reason to duplicate features in tools that ship with Fiji. Also, we don't want to create .stl files that are different from SciView's.
  • Add resampling parameter (there's no op to perform resampling yet)
  • Add support for anisotropically calibrated images - at the moment surface area is reported incorrectly for these

Optimise Threshold

  • Show an error, if user tries to run the plug-in with a 24-bit image
  • Add goodness of fit output

QuadricToEllipsoid op

  • Make op return an Optional of Matrix4d (from JOML)
    • The columns of the matrix are semi-axis, semi-axis, semi-axis, translation
    • This way the type of the output is as generic and flexible as possible
    • If we want to keep using Ellipsoid in our code, we can do convert the matrix to one easily enough
  • Add the op to imagej-ops

SCIFIO

  • The pQCT file reader needs to support the additional metadata in the .typ files
  • Should the functionality in DensityCalibrator be added to the Scanco ISQ file format reader in SCIFIO? At the moment the metadata of an ImgPlus does not support pixel value calibration.

Slice geometry

  • Make plug-in actually check that input image is binary

Surface fraction wrapper

  • A boolean parameter to limit calculations to ROIs
    • Wait until modern ROIs have been implemented
  • Show meshes with SciView
  • Should the mesh created by marching cubes be smoothed, or would this make the results more unrealistic?
Clone this wiki locally