Source code for omni.pipelines.anat.normalize

import logging
from concurrent.futures import ProcessPoolExecutor
import nibabel as nib
from memori.pathman import replace_suffix, repath
from memori.helpers import create_output_path
from omni.interfaces.common import normalize
from omni.interfaces.ants import N4BiasFieldCorrection


[docs]@create_output_path def debias(output_path: str, t1_do: str, t2_do: str, spline_fit: str = "[100,3,1x1x1,3]"): """Bias field correction of anatomical images. Parameters ---------- output_path : str Output path to write out files to. t1_do : str Deobliqued T1 image. t2_do : str Deobliqued T2 image. spline_fit : str Custom spline fitting string. Returns ------- str Bias field corrected/Normalized T1. str Bias field corrected/Normalized T2. """ # normalize images logging.info("Normalizing images...") t1_nm = replace_suffix(repath(output_path, t1_do), "_nm") t2_nm = replace_suffix(repath(output_path, t2_do), "_nm") nib.Nifti1Image( 10000 * normalize(nib.load(t1_do).get_fdata()), nib.load(t1_do).affine, nib.load(t1_do).header ).to_filename(t1_nm) nib.Nifti1Image( 10000 * normalize(nib.load(t2_do).get_fdata()), nib.load(t2_do).affine, nib.load(t2_do).header ).to_filename(t2_nm) # Bias correct anatomical images logging.info("Bias field correcting anatomical images...") t1_debias = replace_suffix(t1_nm, "_debias") t2_debias = replace_suffix(t2_nm, "_debias") with ProcessPoolExecutor(max_workers=2) as executor: # bias correct t1 and t2 future_t1 = executor.submit(N4BiasFieldCorrection, t1_debias, t1_nm, spline_fit) future_t2 = executor.submit(N4BiasFieldCorrection, t2_debias, t2_nm, spline_fit) # wait for jobs to finish logging.info("Waiting for bias correction...") future_t1.result() logging.info("T1 is Done!") future_t2.result() logging.info("T2 is Done!") # return images return (t1_debias, t2_debias)