IVIMfit is a modular Python library designed to fit intravoxel incoherent motion (IVIM) models to diffusion-weighted MRI (DWI) signals. It includes support for monoexponential, biexponential (free and segmented), triexponential, and Bayesian model fitting. The package is designed for use in clinical and research settings, allowing users to extract physiologically meaningful diffusion parameters from DWI datasets. User can generate synhtethic data.
Install from source:
git clone https://github.com/Atakanisik/IVIMfit
cd IVIMfit
pip install -e .Install from pip:
pip install ivimfitRequirements:
- numpy
- scipy
- matplotlib
- pymc
- pytensor
import numpy as np
import matplotlib.pyplot as plt
from ivimfit.utils import plot_fit, calculate_r_squared
from ivimfit.adc import fit_adc, monoexp_model
b = np.array([0, 50, 100, 200, 400, 600, 800])
s = np.array([800, 654,543,423,328,236,121])
adc = fit_adc(b, s)
r2 = calculate_r_squared(s / s[0], monoexp_model(b, adc))
fig, ax = plot_fit(b, s, monoexp_model, [adc], model_name=f"ADC Fit (R² = {r2:.4f})")
plt.show()import numpy as np
import matplotlib.pyplot as plt
from ivimfit.utils import plot_fit, calculate_r_squared
from ivimfit.biexp import fit_biexp_free, biexp_model
b = np.array([0, 50, 100, 200, 400, 600, 800])
s = np.array([800, 654,543,423,328,236,121])
f, D, D_star = fit_biexp_free(b, s)
r2 = calculate_r_squared(s / s[0], biexp_model(b, f, D, D_star))
fig, ax = plot_fit(b, s, biexp_model, [f, D, D_star], model_name=f"Free Fit (R² = {r2:.4f})")
plt.show()- Estimates
$D$ using high-b values (b>=200 default) - Then fits
$f$ ,$D^*$ with fixed$D$
import numpy as np
import matplotlib.pyplot as plt
from ivimfit.utils import plot_fit, calculate_r_squared
from ivimfit.segmented import fit_biexp_segmented, biexp_fixed_D_model
b = np.array([0, 50, 100, 200, 400, 600, 800])
s = np.array([800, 654,543,423,328,236,121])
f, D_fixed, D_star = fit_biexp_segmented(b, s)
r2 = calculate_r_squared(s / s[0], biexp_fixed_D_model(b, f, D_star, D_fixed))
fig, ax = plot_fit(
b, s,
lambda b_, f_, D_star_,D_fixed: biexp_fixed_D_model(b_, f_, D_star_, D_fixed),
[f, D_star,D_fixed],
model_name=f"Segmented Fit (R² = {r2:.4f})"
)
plt.show()S(b)/S₀ = f₁ · exp(–b · D₁*) + f₂ · exp(–b · D₂*) + (1 – f₁ – f₂) · exp(–b · D)
import numpy as np
import matplotlib.pyplot as plt
from ivimfit.utils import plot_fit, calculate_r_squared
from ivimfit.triexp import fit_triexp_free, triexp_model
b = np.array([0, 50, 100, 200, 400, 600, 800])
s = np.array([800, 654,543,423,328,236,121])
f1, f2, D, D1_star, D2_star = fit_triexp_free(b, s)
pred = triexp_model(b, f1, f2, D, D1_star, D2_star)
r2 = calculate_r_squared(s / s[0], pred)
fig, ax = plot_fit(b, s, triexp_model, [f1, f2, D, D1_star, D2_star], model_name=f"Tri-exponential Fit (R² = {r2:.4f})")
plt.show()import numpy as np
import matplotlib.pyplot as plt
from ivimfit.utils import plot_fit, calculate_r_squared
from ivimfit.bayesian import fit_bayesian
from ivimfit.biexp import biexp_model
b = np.array([0, 50, 100, 200, 400, 600, 800])
s = np.array([800, 654,543,423,328,236,121])
if __name__ == "__main__":
f, D, D_star = fit_bayesian(b, s, draws=500, chains=2)
r2 = calculate_r_squared(s / s[0], biexp_model(b, f, D, D_star))
fig, ax = plot_fit(b, s, biexp_model, [f, D, D_star], model_name=f"Bayesian Fit (R² = {r2:.4f})")
plt.show()Returns posterior mean estimates for
# example.py
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle
from ivimfit.synthetic import PhantomParams, generate_measure_signals
from ivimfit.utils import plot_fit, calculate_r_squared
from ivimfit.adc import fit_adc, monoexp_model
from ivimfit.biexp import fit_biexp_free, biexp_model
from ivimfit.segmented import fit_biexp_segmented, biexp_fixed_D_model
def main():
b = np.array([0, 50, 100, 200, 400, 600, 800,900,1000], dtype=float)
pp = PhantomParams(
shape=(128, 128),
square_size=64,
s0_bright=1.0,
s0_dark=0.30,
D_bright=0.0015,
D_dark=0.0030,
noise_sigma=0.02
)
stack, s, roi = generate_measure_signals(b, params=pp, seed=123)
r0, c0, size = roi
img0 = stack[np.argmin(b)]
plt.imshow(img0, cmap="gray", origin="upper")
plt.gca().add_patch(Rectangle((c0, r0), size, size, fill=False, linewidth=2))
plt.title("b (en düşük) + ROI")
plt.show()
from ivimfit.synthetic import show_stack_grid
show_stack_grid(stack, b, roi=roi, cols=4, suptitle="Synthetic DWI (low b → high b)")
adc = fit_adc(b, s)
r2 = calculate_r_squared(s / s[0], monoexp_model(b, adc))
fig, ax = plot_fit(b, s, monoexp_model, [adc], model_name=f"ADC Fit (R² = {r2:.4f})")
plt.show()
f, D, D_star = fit_biexp_free(b, s)
r2 = calculate_r_squared(s / s[0], biexp_model(b, f, D, D_star))
fig, ax = plot_fit(b, s, biexp_model, [f, D, D_star], model_name=f"Free Fit (R² = {r2:.4f})")
plt.show()
f_seg, D_fixed, D_star_seg = fit_biexp_segmented(b, s)
r2 = calculate_r_squared(s / s[0], biexp_fixed_D_model(b, f_seg, D_star_seg, D_fixed))
fig, ax = plot_fit(
b, s,
lambda b_, f_, D_star_, D_fixed_: biexp_fixed_D_model(b_, f_, D_star_, D_fixed_),
[f_seg, D_star_seg, D_fixed],
model_name=f"Segmented Fit (R² = {r2:.4f})"
)
plt.show()
try:
from ivimfit.bayesian import fit_bayesian
f_bay, D_bay, Dstar_bay = fit_bayesian(
b, s, draws=500, chains=2
)
r2 = calculate_r_squared(s / s[0], biexp_model(b, f_bay, D_bay, Dstar_bay))
fig, ax = plot_fit(b, s, biexp_model, [f_bay, D_bay, Dstar_bay],
model_name=f"Bayesian Fit (R² = {r2:.4f})")
plt.show()
except Exception as e:
print("[Bayesian] atlandı:", repr(e))
try:
from ivimfit.triexp import fit_triexp_free, triexp_model
f1, f2, Dm, D1s, D2s = fit_triexp_free(b, s)
pred = triexp_model(b, f1, f2, Dm, D1s, D2s)
r2 = calculate_r_squared(s / s[0], pred)
fig, ax = plot_fit(b, s, triexp_model, [f1, f2, Dm, D1s, D2s],
model_name=f"Tri-exponential Fit (R² = {r2:.4f})")
plt.show()
except Exception as e:
print("[Triexponential] atlandı:", repr(e))
if __name__ == "__main__":
main()This project is licensed under the MIT License.
Pull requests are welcome. Please open an issue to discuss your proposed change before submitting a PR.
This work was inspired by previous IVIM modeling efforts, including:
- ivim by Jalnefjord et al.
- PyMC Bayesian modeling
- Research on segmented and triexponential IVIM models in liver and kidney imaging
Citation: If you use IVIMfit, please cite it using the following DOI: