Skip to content

v0.3.0

Choose a tag to compare

@lassoan lassoan released this 23 Oct 11:26
· 10 commits to main since this release

Third release of the SlicerHeart 4D flow filters: noise-free images (synthetic phantoms) are handled, the velocity noise has one definition, and the hemodynamic quantities are computed 3 to 12 times faster.

Changed

  • Automatic lumen segmentation grows closer to the vessel wall (estimate_lumen). The lumen is grown into voxels whose RMS speed is above growth_noise_factor times that of the velocity noise. On 15 pediatric clinical cases, the velocity noise of the lumen estimate was 1.7 times (median, 1.1 to 2.6) that of quality_report, because it was estimated in dark tissue too and with a biased estimator, so the lumen stopped short of the wall. On these cases the lumen volume grows by 21% (median, 5% to 30%). Lumens and plane flows computed with an earlier version differ; regenerate them.
  • One velocity noise definition for quality_report and the lumen estimate: noise_tissue_mask selects the tissue above the Otsu threshold of the magnitude (the noise scales with 1 / magnitude), and velocity_noise estimates the noise of each component (median of per-voxel variances, unbiased for Gaussian noise). velocity_noise_in_tissue returns their RMS over the components, or each component with per_component=True.
  • The default growth_noise_factor is 1.9 (was 2.0). It reproduces the flow error, coverage and leakage of the synthetic cases with known lumen.

Fixed

  • Background correction failed on noise-free images ("only N static-tissue candidates"): body_mask dropped voxels with constant velocity over time as zero filling or masked air, which on a noise-free phantom removed all static tissue. When many bright voxels have constant velocity, the body is now found by the Otsu threshold of the magnitude. Zero filling and masked air are dark, so measured data is not affected.
  • The lumen estimate failed on noise-free images ("no tissue selected by magnitude to estimate the velocity noise"). If no static tissue is left outside the lumen, the noise is estimated in all nonzero-magnitude voxels outside it (with a warning); a noise estimate of 0 gets a small speed floor, so rounding errors are not counted as flow.

Faster

On a clinical case (15 frames), with the same results:

Step v0.2.0 v0.3.0
Lumen integrals (velocity_gradient on the lumen only) 10.4 s 3.6 s
Wall shear stress (one pseudo-inverse per sample pattern) 4.8 s 0.4 s
Pressure gradient 35 s 8 s
Relative pressure solve (frames in threads) 25 s 6.3 s

Testing

  • Noise-free phantoms with linear and quadratic background offsets (tests/test_noise_free.py).
  • The clinical tests run case by case and keep one case in memory.