def convert_all(): # Convert training data for idx in range(1, 1 + 4): for modality in ['T1', 'T2', 'seg']: fname = get_neobrain('train', idx, modality) fname_noext = fname[:-4] convert_neobrain_to_nifti(fname_noext) # Convert testing data for idx in range(1, 1 + 3): for prefix in ['i1', 'i2', 'i3', 'iC1', 'iC2']: for suffix in ['t1', 't2']: modality = prefix + '_' + suffix fname = get_neobrain('test', idx, modality) fname_noext = fname[:-4] convert_neobrain_to_nifti(fname_noext)
def align_atlas(): neo_fname = get_neobrain('train', 1, 'T2') neo_nib = nib.load(neo_fname) neo = neo_nib.get_data() neo_affine = neo_nib.get_affine() # Load atlas (with skull) atlas_fname = get_neobrain('atlas', 'neo-withSkull', None) atlas_nib = nib.load(atlas_fname) atlas = atlas_nib.get_data() atlas_affine = atlas_nib.get_affine() # The first training volume dimensions are about 5cm x 5cm x 8cm # The atlas dimensions are about 7cm x 9cm x 11 cm # Assuming isotropic scale, the atlas is about 1.5 times larger than # the input image: iso_scale = (float(7*9*11)/float(5*5*8))**(1.0/3) print(iso_scale) #We can use this to constraint the transformation to rigid scale = np.eye(4) scale[:3,:3] *= iso_scale rigid_map_fname = 'atlas_towards_neo1_rigid.p' if os.path.isfile(rigid_map_fname): rigid_map = pickle.load(open(rigid_map_fname, 'r')) else: transforms = ['RIGID'] rigid_map = dipy_align(neo, neo_affine, atlas, atlas_affine, transforms=transforms, prealign=scale) pickle.dump(rigid_map, open(rigid_map_fname, 'w')) atlas_resampled = rigid_map.transform(atlas) # Compare anterior coronal slices rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas'); # Compare middle coronal slices rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas'); # Compare posterior coronal slices rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas'); # Load the peeled atlas atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None) atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname) atlas_wcerebellum = atlas_wcerebellum_nib.get_data() atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine() # Configure diffeomorphic registration diff_map_name = 'atlas_towards_neo1_diff.p' if os.path.isfile(diff_map_name): diff_map = pickle.load(open(diff_map_name, 'r')) else: metric = CCMetric(3) sdr = SymmetricDiffeomorphicRegistration(metric) # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine diff_map = sdr.optimize(neo, atlas_wcerebellum, neo_affine, atlas_affine, prealign=rigid_map.affine) pickle.dump(diff_map, open(diff_map_name, 'w')) atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum) # Before and after diffeomorphic registration rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas'); rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas'); # Before and after diffeomorphic registration rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas'); rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas'); # Before and after diffeomorphic registration rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas'); rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas'); # Now all volumes atlas_fname = get_neobrain('atlas', 'neo-withSkull', None) atlas_nib = nib.load(atlas_fname) atlas = atlas_nib.get_data() atlas_affine = atlas_nib.get_affine() atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None) atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname) atlas_wcerebellum = atlas_wcerebellum_nib.get_data() atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine() idx = 2 neoi_fname = get_neobrain('train', idx, 'T2') neoi_nib = nib.load(neoi_fname) neoi = neoi_nib.get_data() neoi_affine = neoi_nib.get_affine() iso_scale = (float(7*9*11)/float(5*5*8))**(1.0/3) print(iso_scale) #We can use this to constraint the transformation to rigid scale = np.eye(4) scale[:3,:3] *= iso_scale rigid_map_fname = 'atlas_towards_neo%d_affine.p'%(idx,) if os.path.isfile(rigid_map_fname): rigid_map = pickle.load(open(rigid_map_fname, 'r')) else: transforms = ['RIGID', 'AFFINE'] level_iters = [[10000, 1000, 100], [100]] rigid_map = dipy_align(neoi, neoi_affine, atlas, atlas_affine, transforms=transforms, level_iters=level_iters, prealign=scale) pickle.dump(rigid_map, open(rigid_map_fname, 'w')) atlas_resampled = rigid_map.transform(atlas) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 6) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 10) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 25) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index = 40) diff_map_name = 'atlas_towards_neo%d_diff.p'%(idx,) if os.path.isfile(diff_map_name): diff_map = pickle.load(open(diff_map_name, 'r')) else: metric = CCMetric(3) sdr = SymmetricDiffeomorphicRegistration(metric) # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine diff_map = sdr.optimize(neoi, atlas_wcerebellum, neoi_affine, atlas_affine, prealign=rigid_map.affine) pickle.dump(diff_map, open(diff_map_name, 'w')) atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum) # Before and after diffeomorphic registration rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=6, ltitle='Neo%d'%(idx,), rtitle='Atlas'); rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=6, ltitle='Neo%d'%(idx,), rtitle='Atlas'); rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo%d'%(idx,), rtitle='Atlas'); rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=10, ltitle='Neo%d'%(idx,), rtitle='Atlas'); # Before and after diffeomorphic registration rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo%d'%(idx,), rtitle='Atlas'); rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=25, ltitle='Neo%d'%(idx,), rtitle='Atlas'); # Before and after diffeomorphic registration rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo%d'%(idx,), rtitle='Atlas'); rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=40, ltitle='Neo%d'%(idx,), rtitle='Atlas');
def quick_check(): img1_fname = "/home/omar/data/DATA_NeoBrainS12/T1.nii.gz" img2_fname = "/home/omar/data/DATA_NeoBrainS12/set2_i1_t1.nii.gz" img1_nib = nib.load(img1_fname) img1 = img1_nib.get_data().squeeze() img1_affine = img1_nib.get_affine() img2_nib = nib.load(img2_fname) img2 = img2_nib.get_data().squeeze() img2_affine = img2_nib.get_affine() # nib.aff2axcodes(img1_affine) #aff = AffineMap(None, img1.shape, img1_affine, img2.shape, img2_affine) #aff = transform_centers_of_mass(img1, img1_affine, img2, img2_affine) aff = dipy_align(img1, img1_affine, img2, img2_affine, np.eye(4)) img2_resampled = aff.transform(img2) rt.overlay_slices(img1, img2_resampled, slice_type=0) rt.overlay_slices(img1, img2_resampled, slice_type=1) rt.overlay_slices(img1, img2_resampled, slice_type=2) # Verify that original and RAS versions of neo1 describe the same object # Load original data neo1_fname = get_neobrain('train', 1, 'T1') neo1_old, neo1_old_affine, neo1_old_spacing, neo1_old_ori = load_from_raw(neo1_fname) # Load RAS version neo1_nib = nib.load(neo1_fname) neo1 = neo1_nib.get_data() neo1_affine = neo1_nib.get_affine() # Resample RAS on top of original aff = AffineMap(None, neo1_old.shape, neo1_old_affine, neo1.shape, neo1_affine) neo1_resampled = aff.transform(neo1) rt.overlay_slices(neo1_old, neo1_resampled, slice_type=0) rt.overlay_slices(neo1_old, neo1_resampled, slice_type=1) rt.overlay_slices(neo1_old, neo1_resampled, slice_type=2) # Attempt to resample a test volume on top of training neo2_fname = get_neobrain('test', 1, 'i1_t1') neo2_nib = nib.load(neo2_fname) neo2 = neo2_nib.get_data() neo2_affine = neo2_nib.get_affine() aff = transform_centers_of_mass(neo1, neo1_affine, neo2, neo2_affine) #aff = dipy_align(neo1, neo1_affine, neo2, neo2_affine) neo2_resampled = aff.transform(neo2) rt.overlay_slices(neo1, neo2_resampled, slice_type=0) rt.overlay_slices(neo1, neo2_resampled, slice_type=1) rt.overlay_slices(neo1, neo2_resampled, slice_type=2) # Load atlas atlas_fname = get_neobrain('atlas', 'neo-withSkull', None) atlas_nib = nib.load(atlas_fname) atlas_affine = atlas_nib.get_affine() atlas = atlas_nib.get_data() rt.plot_slices(atlas) # Resample atlas on top of neo1 aff = AffineMap(None, neo1.shape, neo1_affine, atlas.shape, atlas_affine) atlas_resampled = aff.transform(atlas) rt.overlay_slices(neo1, atlas_resampled)
def align_atlas(): neo_fname = get_neobrain('train', 1, 'T2') neo_nib = nib.load(neo_fname) neo = neo_nib.get_data() neo_affine = neo_nib.get_affine() # Load atlas (with skull) atlas_fname = get_neobrain('atlas', 'neo-withSkull', None) atlas_nib = nib.load(atlas_fname) atlas = atlas_nib.get_data() atlas_affine = atlas_nib.get_affine() # The first training volume dimensions are about 5cm x 5cm x 8cm # The atlas dimensions are about 7cm x 9cm x 11 cm # Assuming isotropic scale, the atlas is about 1.5 times larger than # the input image: iso_scale = (float(7 * 9 * 11) / float(5 * 5 * 8))**(1.0 / 3) print(iso_scale) #We can use this to constraint the transformation to rigid scale = np.eye(4) scale[:3, :3] *= iso_scale rigid_map_fname = 'atlas_towards_neo1_rigid.p' if os.path.isfile(rigid_map_fname): rigid_map = pickle.load(open(rigid_map_fname, 'r')) else: transforms = ['RIGID'] rigid_map = dipy_align(neo, neo_affine, atlas, atlas_affine, transforms=transforms, prealign=scale) pickle.dump(rigid_map, open(rigid_map_fname, 'w')) atlas_resampled = rigid_map.transform(atlas) # Compare anterior coronal slices rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas') # Compare middle coronal slices rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas') # Compare posterior coronal slices rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas') # Load the peeled atlas atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None) atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname) atlas_wcerebellum = atlas_wcerebellum_nib.get_data() atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine() # Configure diffeomorphic registration diff_map_name = 'atlas_towards_neo1_diff.p' if os.path.isfile(diff_map_name): diff_map = pickle.load(open(diff_map_name, 'r')) else: metric = CCMetric(3) sdr = SymmetricDiffeomorphicRegistration(metric) # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine diff_map = sdr.optimize(neo, atlas_wcerebellum, neo_affine, atlas_affine, prealign=rigid_map.affine) pickle.dump(diff_map, open(diff_map_name, 'w')) atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum) # Before and after diffeomorphic registration rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas') rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=10, ltitle='Neo1', rtitle='Atlas') # Before and after diffeomorphic registration rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas') rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=25, ltitle='Neo1', rtitle='Atlas') # Before and after diffeomorphic registration rt.overlay_slices(neo, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas') rt.overlay_slices(neo, atlas_wcerebellum_deformed, slice_type=2, slice_index=40, ltitle='Neo1', rtitle='Atlas') # Now all volumes atlas_fname = get_neobrain('atlas', 'neo-withSkull', None) atlas_nib = nib.load(atlas_fname) atlas = atlas_nib.get_data() atlas_affine = atlas_nib.get_affine() atlas_wcerebellum_fname = get_neobrain('atlas', 'neo-withCerebellum', None) atlas_wcerebellum_nib = nib.load(atlas_wcerebellum_fname) atlas_wcerebellum = atlas_wcerebellum_nib.get_data() atlas_wcerebellum_affine = atlas_wcerebellum_nib.get_affine() idx = 2 neoi_fname = get_neobrain('train', idx, 'T2') neoi_nib = nib.load(neoi_fname) neoi = neoi_nib.get_data() neoi_affine = neoi_nib.get_affine() iso_scale = (float(7 * 9 * 11) / float(5 * 5 * 8))**(1.0 / 3) print(iso_scale) #We can use this to constraint the transformation to rigid scale = np.eye(4) scale[:3, :3] *= iso_scale rigid_map_fname = 'atlas_towards_neo%d_affine.p' % (idx, ) if os.path.isfile(rigid_map_fname): rigid_map = pickle.load(open(rigid_map_fname, 'r')) else: transforms = ['RIGID', 'AFFINE'] level_iters = [[10000, 1000, 100], [100]] rigid_map = dipy_align(neoi, neoi_affine, atlas, atlas_affine, transforms=transforms, level_iters=level_iters, prealign=scale) pickle.dump(rigid_map, open(rigid_map_fname, 'w')) atlas_resampled = rigid_map.transform(atlas) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=6) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=10) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=25) rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=40) diff_map_name = 'atlas_towards_neo%d_diff.p' % (idx, ) if os.path.isfile(diff_map_name): diff_map = pickle.load(open(diff_map_name, 'r')) else: metric = CCMetric(3) sdr = SymmetricDiffeomorphicRegistration(metric) # The atlases are not aligned in physical space!! use atlas_affine instead of atlas_wcerebellum_affine diff_map = sdr.optimize(neoi, atlas_wcerebellum, neoi_affine, atlas_affine, prealign=rigid_map.affine) pickle.dump(diff_map, open(diff_map_name, 'w')) atlas_wcerebellum_deformed = diff_map.transform(atlas_wcerebellum) # Before and after diffeomorphic registration rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=6, ltitle='Neo%d' % (idx, ), rtitle='Atlas') rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=6, ltitle='Neo%d' % (idx, ), rtitle='Atlas') rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=10, ltitle='Neo%d' % (idx, ), rtitle='Atlas') rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=10, ltitle='Neo%d' % (idx, ), rtitle='Atlas') # Before and after diffeomorphic registration rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=25, ltitle='Neo%d' % (idx, ), rtitle='Atlas') rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=25, ltitle='Neo%d' % (idx, ), rtitle='Atlas') # Before and after diffeomorphic registration rt.overlay_slices(neoi, atlas_resampled, slice_type=2, slice_index=40, ltitle='Neo%d' % (idx, ), rtitle='Atlas') rt.overlay_slices(neoi, atlas_wcerebellum_deformed, slice_type=2, slice_index=40, ltitle='Neo%d' % (idx, ), rtitle='Atlas')
def quick_check(): img1_fname = "/home/omar/data/DATA_NeoBrainS12/T1.nii.gz" img2_fname = "/home/omar/data/DATA_NeoBrainS12/set2_i1_t1.nii.gz" img1_nib = nib.load(img1_fname) img1 = img1_nib.get_data().squeeze() img1_affine = img1_nib.get_affine() img2_nib = nib.load(img2_fname) img2 = img2_nib.get_data().squeeze() img2_affine = img2_nib.get_affine() # nib.aff2axcodes(img1_affine) #aff = AffineMap(None, img1.shape, img1_affine, img2.shape, img2_affine) #aff = transform_centers_of_mass(img1, img1_affine, img2, img2_affine) aff = dipy_align(img1, img1_affine, img2, img2_affine, np.eye(4)) img2_resampled = aff.transform(img2) rt.overlay_slices(img1, img2_resampled, slice_type=0) rt.overlay_slices(img1, img2_resampled, slice_type=1) rt.overlay_slices(img1, img2_resampled, slice_type=2) # Verify that original and RAS versions of neo1 describe the same object # Load original data neo1_fname = get_neobrain('train', 1, 'T1') neo1_old, neo1_old_affine, neo1_old_spacing, neo1_old_ori = load_from_raw( neo1_fname) # Load RAS version neo1_nib = nib.load(neo1_fname) neo1 = neo1_nib.get_data() neo1_affine = neo1_nib.get_affine() # Resample RAS on top of original aff = AffineMap(None, neo1_old.shape, neo1_old_affine, neo1.shape, neo1_affine) neo1_resampled = aff.transform(neo1) rt.overlay_slices(neo1_old, neo1_resampled, slice_type=0) rt.overlay_slices(neo1_old, neo1_resampled, slice_type=1) rt.overlay_slices(neo1_old, neo1_resampled, slice_type=2) # Attempt to resample a test volume on top of training neo2_fname = get_neobrain('test', 1, 'i1_t1') neo2_nib = nib.load(neo2_fname) neo2 = neo2_nib.get_data() neo2_affine = neo2_nib.get_affine() aff = transform_centers_of_mass(neo1, neo1_affine, neo2, neo2_affine) #aff = dipy_align(neo1, neo1_affine, neo2, neo2_affine) neo2_resampled = aff.transform(neo2) rt.overlay_slices(neo1, neo2_resampled, slice_type=0) rt.overlay_slices(neo1, neo2_resampled, slice_type=1) rt.overlay_slices(neo1, neo2_resampled, slice_type=2) # Load atlas atlas_fname = get_neobrain('atlas', 'neo-withSkull', None) atlas_nib = nib.load(atlas_fname) atlas_affine = atlas_nib.get_affine() atlas = atlas_nib.get_data() rt.plot_slices(atlas) # Resample atlas on top of neo1 aff = AffineMap(None, neo1.shape, neo1_affine, atlas.shape, atlas_affine) atlas_resampled = aff.transform(atlas) rt.overlay_slices(neo1, atlas_resampled)