def test_align_nonlinear(): """ Test align_nonlinear functionality """ import pkg_resources # Nonlinear normalization base_dir = str(Path(__file__).parent / "examples") anat_dir = f"{base_dir}/003/anat" inp = f"{anat_dir}/sub-003_T1w.nii.gz" ref = pkg_resources.resource_filename( "pynets", f"templates/MNI152_T1_brain_2mm.nii.gz") out = f"{anat_dir}/highres2standard_nonlinear.nii.gz" warp = f"{anat_dir}/highres2standard_warp" # affine mat created from test_align above. xfm = f"{anat_dir}/highres2standard.mat" reg_utils.align_nonlinear(inp, ref, xfm, out, warp, ref_mask=None, in_mask=None, config=None) highres2standard_nonlin = nib.load(out) assert highres2standard_nonlin is not None
def t1w2dwi_align(self): """ A function to perform alignment from T1w --> MNI and T1w_MNI --> DWI. Uses a local optimisation cost function to get the two images close, and then uses bbr to obtain a good alignment of brain boundaries. Assumes input dwi is already preprocessed and brain extracted. """ # Create linear transform/ initializer T1w-->MNI regutils.align(self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm_init, bins=None, interp="spline", out=None, dof=12, cost='mutualinfo', searchrad=True) # Attempt non-linear registration of T1 to MNI template if self.simple is False: try: print('Running non-linear registration: T1w-->MNI ...') # Use FNIRT to nonlinearly align T1 to MNI template regutils.align_nonlinear(self.t1w_brain, self.input_mni, xfm=self.t12mni_xfm_init, out=self.t1_aligned_mni, warp=self.warp_t1w2mni, ref_mask=self.input_mni_mask, config=self.input_mni_sched) # Get warp from MNI -> T1 regutils.inverse_warp(self.t1w_brain, self.mni2t1w_warp, self.warp_t1w2mni) # Get mat from MNI -> T1 os.system("convert_xfm -omat {} -inverse {}".format(self.mni2t1_xfm_init, self.t12mni_xfm_init)) except RuntimeError('Error: FNIRT failed!'): pass else: # Falling back to linear registration regutils.align(self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm, init=self.t12mni_xfm_init, bins=None, dof=12, cost='mutualinfo', searchrad=True, interp="spline", out=self.t1_aligned_mni, sch=None) # Align T1w-->DWI regutils.align(self.fa_path, self.t1w_brain, xfm=self.t1w2dwi_xfm, bins=None, interp="spline", dof=6, cost='mutualinfo', out=None, searchrad=True, sch=None) os.system("convert_xfm -omat {} -inverse {}".format(self.dwi2t1w_xfm, self.t1w2dwi_xfm)) if self.simple is False: # Flirt bbr try: print('Running FLIRT BBR registration: T1w-->DWI ...') regutils.align(self.fa_path, self.t1w_brain, wmseg=self.wm_edge, xfm=self.dwi2t1w_bbr_xfm, init=self.dwi2t1w_xfm, bins=256, dof=7, searchrad=True, interp="spline", out=None, cost='bbr', sch="${FSLDIR}/etc/flirtsch/bbr.sch") os.system("convert_xfm -omat {} -inverse {}".format(self.t1w2dwi_bbr_xfm, self.dwi2t1w_bbr_xfm)) # Apply the alignment regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_bbr_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None, interp="spline", dof=7, cost='mutualinfo', out=self.t1w2dwi, searchrad=True, sch=None) except RuntimeError('Error: FLIRT BBR failed!'): pass else: # Apply the alignment regutils.align(self.t1w_brain, self.fa_path, init=self.t1w2dwi_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None, interp="spline", dof=6, cost='mutualinfo', out=self.t1w2dwi, searchrad=True, sch=None) return
def test_align_nonlinear(): """ Test align_nonlinear functionality """ # Nonlinear normlization base_dir = str(Path(__file__).parent / "examples") anat_dir = base_dir + '/003/anat' inp = anat_dir + '/sub-003_T1w.nii.gz' ref = anat_dir + '/MNI152_T1_2mm.nii.gz' out = anat_dir + '/highres2standard_nonlinear.nii.gz' warp = anat_dir + '/highres2standard_warp' # affine mat created from test_align above. xfm = anat_dir + '/highres2standard.mat' reg_utils.align_nonlinear(inp, ref, xfm, out, warp, ref_mask=None, in_mask=None, config=None) highres2standard_nonlin = nib.load(out) assert highres2standard_nonlin is not None
def t1w2mni_align(self): """ A function to perform alignment from T1w --> MNI. """ # Create linear transform/ initializer T1w-->MNI regutils.align(self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm_init, bins=None, interp="spline", out=None, dof=12, cost='mutualinfo', searchrad=True) # Attempt non-linear registration of T1 to MNI template try: print('Running non-linear registration: T1w-->MNI ...') # Use FNIRT to nonlinearly align T1 to MNI template regutils.align_nonlinear(self.t1w_brain, self.input_mni, xfm=self.t12mni_xfm_init, out=self.t1_aligned_mni, warp=self.warp_t1w2mni, ref_mask=self.input_mni_mask, config=self.input_mni_sched) # Get warp from MNI -> T1 regutils.inverse_warp(self.t1w_brain, self.mni2t1w_warp, self.warp_t1w2mni) # Get mat from MNI -> T1 os.system("convert_xfm -omat {} -inverse {}".format(self.mni2t1_xfm_init, self.t12mni_xfm_init)) except RuntimeError('Error: FNIRT failed!'): pass
def t1w2mni_align(self): """ A function to perform alignment from T1w --> MNI template. """ import time # Create linear transform/ initializer T1w-->MNI regutils.align( self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm_init, bins=None, interp="spline", out=None, dof=12, cost="mutualinfo", searchrad=True, ) time.sleep(0.5) # Attempt non-linear registration of T1 to MNI template if self.simple is False: try: print( f"Learning a non-linear mapping from T1w --> " f"{self.template_name} ..." ) # Use FNIRT to nonlinearly align T1 to MNI template regutils.align_nonlinear( self.t1w_brain, self.input_mni, xfm=self.t12mni_xfm_init, out=self.t1_aligned_mni, warp=self.warp_t1w2mni, ref_mask=self.input_mni_mask, ) time.sleep(0.5) # Get warp from MNI -> T1 regutils.inverse_warp( self.t1w_brain, self.mni2t1w_warp, self.warp_t1w2mni ) time.sleep(0.5) # Get mat from MNI -> T1 self.mni2t1_xfm = regutils.invert_xfm(self.t12mni_xfm_init, self.mni2t1_xfm) time.sleep(0.5) except BaseException: # Falling back to linear registration regutils.align( self.t1w_brain, self.input_mni_brain, xfm=self.mni2t1_xfm, init=self.t12mni_xfm_init, bins=None, dof=12, cost="mutualinfo", searchrad=True, interp="spline", out=self.t1_aligned_mni, sch=None, ) time.sleep(0.5) # Get mat from MNI -> T1 self.mni2t1_xfm = regutils.invert_xfm(self.t12mni_xfm, self.mni2t1_xfm) time.sleep(0.5) else: # Falling back to linear registration regutils.align( self.t1w_brain, self.input_mni_brain, xfm=self.t12mni_xfm, init=self.t12mni_xfm_init, bins=None, dof=12, cost="mutualinfo", searchrad=True, interp="spline", out=self.t1_aligned_mni, sch=None, ) time.sleep(0.5) # Get mat from MNI -> T1 self.t12mni_xfm = regutils.invert_xfm(self.mni2t1_xfm, self.t12mni_xfm) time.sleep(0.5)