def t1w2dwi_align(self): """ A function to perform alignment from T1w_MNI --> DWI. Uses a local optimization 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. """ import time self.ap_path = regutils.apply_mask_to_image(self.ap_path, self.B0_mask, self.ap_path) self.fa_path = regutils.apply_mask_to_image(self.fa_path, self.B0_mask, self.fa_path) # Align T1w-->DWI regutils.align( self.ap_path, self.t1w_brain, xfm=self.t1w2dwi_xfm, bins=None, interp="spline", dof=6, cost="mutualinfo", out=None, searchrad=True, sch=None, ) time.sleep(0.5) self.dwi2t1w_xfm = regutils.invert_xfm(self.t1w2dwi_xfm, self.dwi2t1w_xfm) time.sleep(0.5) if self.simple is False: # Flirt bbr try: print("Learning a Boundary-Based Mapping from 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", ) time.sleep(0.5) self.t1w2dwi_bbr_xfm = regutils.invert_xfm( self.dwi2t1w_bbr_xfm, self.t1w2dwi_bbr_xfm) time.sleep(0.5) # Apply the alignment regutils.align( self.t1w_brain, self.ap_path, init=self.t1w2dwi_bbr_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None, interp="spline", dof=6, cost="mutualinfo", out=self.t1w2dwi, searchrad=True, sch=None, ) time.sleep(0.5) except BaseException: # Apply the alignment regutils.align( self.t1w_brain, self.ap_path, init=self.t1w2dwi_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None, interp="spline", dof=6, cost="mutualinfo", out=self.t1w2dwi, searchrad=True, sch=None, ) time.sleep(0.5) else: # Apply the alignment regutils.align( self.t1w_brain, self.ap_path, init=self.t1w2dwi_xfm, xfm=self.t1wtissue2dwi_xfm, bins=None, interp="spline", dof=6, cost="mutualinfo", out=self.t1w2dwi, searchrad=True, sch=None, ) time.sleep(0.5) self.t1w2dwi = regutils.apply_mask_to_image(self.t1w2dwi, self.B0_mask, self.t1w2dwi) return
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)