Skip to content

v0.2.0

Choose a tag to compare

@lassoan lassoan released this 23 Oct 00:22

Second release of the SlicerHeart 4D flow filters: clinical data support, new methods, fixes found on clinical data, and about 6 times faster preprocessing.

New

  • Reading data prepared in 3D Slicer (slicer_io, pip install slicerheart_4dflow[clinical]): volumes and volume sequences (.nrrd, .seq.nrrd), segmentations, plane markups, and whole test cases exported by SlicerHeart Import 4D Flow. Data sets use format 4: inputs/<case> (acquisition, annotations) separate from outputs/<case>, with manifest.json at the data set root; dataset_cases(dataset) and load_case(dataset, case_id) read them.
  • Automatic lumen segmentation (estimate_lumen): Otsu threshold of the PC-MRA on a 2x finer grid, resampled with VTK in physical space, grown to the vessel wall.
  • Noise mask by body mask (body_mask, draft): a Kittler-Illingworth split of log magnitude against the temporal phase noise, which adapts to the air fraction of the field of view and is not fooled by coil shading; now the default of noise_mask and of the static tissue for background correction.
  • Multi-venc unwrapping (draft): dual- and triple-venc (sdv, odv, the Schnell 2017 threshold rule), with a valve-jet phantom.
  • Background correction: the Pruitt 2019 WRLS + ARTO fitter (arto).
  • Laplacian unwrapping: a periodic time axis for laplacian4d (Loecher 2016), for retrospectively gated data.
  • Wall shear stress: the wall surface by VTK flying edges instead of scikit-image marching cubes.
  • Validation tools: semi-synthetic references built from measured cases, a transfer audit that compares a case with a matched synthetic case, the encoding-direction self-check, and a clinical test suite with per-case baselines (a synthetic clinical case runs in CI).

Fixed

  • Aliased voxels were marked as noise before unwrapping (and so excluded from it): with venc, noise_mask and body_mask use wrap-invariant temporal differences.
  • body_mask put the air into the body where the field of view has zero-filled voxels, and kept only the lumen in dark tissue without air.
  • The velocity noise of quality_report is estimated in tissue above the Otsu threshold again (it was 1.2 to 2.5 times too high with the body mask).
  • Plane flow: in-plane basis and disc-edge sampling; pathline emission times; WSS wall normals on anisotropic grids.

Faster

preprocess on a clinical case (160 x 120 x 80 voxels, 26 frames) takes 15 s instead of 88 s, with the same results: the Laplacian kernels, the spectral solves and the temporal statistics were rewritten to work frame by frame and in threads (#28, #41). leray and dfw divergence filtering are 6 to 8 times faster.

Changed

  • noise_mask and the background-correction candidates use body_mask by default (magnitude_threshold="otsu" restores the Otsu threshold).
  • Test cases in format 3 (per-vendor folders, per-case manifest) are no longer read.

Known issues

  • The EM of the war+msac wrap-around rejection does not converge within its iteration cap (#42).
  • body_mask and multi-venc are drafts, chosen on phantoms and a first clinical data set; their defaults may change.

Algorithms by Matthew Jolley (@mattjolley); clinical integration and validation by Andras Lasso (@lassoan).

Full list of changes: v0.1.0...v0.2.0