Summary
The current IVIM fitting pipeline (fit_ivim) only produces a binary
quality_mask to indicate fitting success/failure. There is no
continuous metric to quantify how well the bi-exponential IVIM model
fits each voxel.
Proposed Addition
Add two new utilities to osipy/ivim/fitting/residuals.py:
-
reconstruct_ivim_signal() — reconstructs the expected IVIM
bi-exponential signal from fitted D, D*, f, and S0 parameter maps.
-
compute_rmse_map() — computes per-voxel RMSE between the
observed DWI signal and the reconstructed signal, returning a
ParameterMap with units a.u..
IVIMFitResult gains an optional rmse_map field, and fit_ivim()
populates it automatically.
Why RMSE?
RMSE gives a continuous quality score per voxel, allowing
downstream users to threshold by fit quality level rather than relying
solely on the binary mask. This is consistent with established IVIM
QC practices (Le Bihan et al. 1988).
Implementation
Already implemented in PR #119.
Summary
The current IVIM fitting pipeline (fit_ivim) only produces a binary
quality_mask to indicate fitting success/failure. There is no
continuous metric to quantify how well the bi-exponential IVIM model
fits each voxel.
Proposed Addition
Add two new utilities to osipy/ivim/fitting/residuals.py:
reconstruct_ivim_signal() — reconstructs the expected IVIM
bi-exponential signal from fitted D, D*, f, and S0 parameter maps.
compute_rmse_map() — computes per-voxel RMSE between the
observed DWI signal and the reconstructed signal, returning a
ParameterMapwith unitsa.u..IVIMFitResult gains an optional rmse_map field, and fit_ivim()
populates it automatically.
Why RMSE?
RMSE gives a continuous quality score per voxel, allowing
downstream users to threshold by fit quality level rather than relying
solely on the binary mask. This is consistent with established IVIM
QC practices (Le Bihan et al. 1988).
Implementation
Already implemented in PR #119.