Repository navigation
v0.2.0
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 fromoutputs/<case>, withmanifest.jsonat the data set root;dataset_cases(dataset)andload_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 ofnoise_maskand 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_maskandbody_maskuse wrap-invariant temporal differences. body_maskput 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_reportis 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_maskand the background-correction candidates usebody_maskby 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_maskand 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