def warpANTSAffine(targetName, referenceName, affineName, oname, interpolationType='trilinear'): baseName=rcommon.getBaseFileName(targetName) nib_target=nib.load(targetName) nib_reference=nib.load(referenceName) M=nib_target.get_affine() F=nib_reference.get_affine() referenceShape=np.array(nib_reference.shape, dtype=np.int32) ######Load and compose affine##### if not affineName: T=np.eye(4) else: T=rcommon.readAntsAffine(affineName) affineComposition=np.linalg.inv(M).dot(T.dot(F)) ###################### if interpolationType=='NN': target=nib_target.get_data().squeeze().astype(np.int32) target=np.copy(target, order='C') warped=np.array(tf.warp_discrete_volumeNNAffine(target, referenceShape, affineComposition)).astype(np.int16) else: target=nib_target.get_data().squeeze().astype(np.float64) target=np.copy(target, order='C') warped=np.array(tf.warp_volume_affine(target, referenceShape, affineComposition)).astype(np.int16) warped=nib.Nifti1Image(warped, F) if not oname: oname="warped"+baseName+"nii.gz" warped.to_filename(oname)
def register_3d(params): r''' Runs the non-linear registration with the parsed parameters ''' print('Registering %s to %s'%(params.target, params.reference)) sys.stdout.flush() ####Initialize parameter dictionaries#### metric_name=params.metric[0:params.metric.find('[')] metric_params_list=params.metric[params.metric.find('[')+1:params.metric.find(']')].split(',') if metric_name=='EM': metric_parameters = { 'max_step_length':float(metric_params_list[0]), 'lambda':float(metric_params_list[1]), 'q_levels':int(metric_params_list[2]), 'max_inner_iter':int(metric_params_list[3]), 'use_double_gradient':False if params.single_gradient else True} similarity_metric = EMMetric(3, metric_parameters) elif metric_name=='CC': metric_parameters = { 'max_step_length':float(metric_params_list[0]), 'sigma_diff':float(metric_params_list[1]), 'radius':int(metric_params_list[2])} similarity_metric = CCMetric(3, metric_parameters) optimizer_parameters = { 'max_iter':[int(i) for i in params.iter.split(',')], 'inversion_iter':int(params.inversion_iter), 'inversion_tolerance':float(params.inversion_tolerance), 'report_status':True if params.report_status else False} moving = nib.load(params.target) moving_affine = moving.get_affine() fixed = nib.load(params.reference) fixed_affine = fixed.get_affine() print 'Affine:', params.affine if not params.affine: transform = np.eye(4) else: transform = rcommon.readAntsAffine(params.affine) init_affine = np.linalg.inv(moving_affine).dot(transform.dot(fixed_affine)) #print initAffine moving = moving.get_data().squeeze().astype(np.float64) fixed = fixed.get_data().squeeze().astype(np.float64) moving = moving.copy(order='C') fixed = fixed.copy(order='C') moving = (moving-moving.min())/(moving.max()-moving.min()) fixed = (fixed-fixed.min())/(fixed.max()-fixed.min()) ###################Run registration################## update_rule = UpdateRule.Composition() registration_optimizer = SymmetricRegistrationOptimizer( fixed, moving, None, init_affine, similarity_metric, update_rule, optimizer_parameters) registration_optimizer.optimize() displacement = registration_optimizer.get_forward() inverse = registration_optimizer.get_backward() del registration_optimizer del similarity_metric del update_rule save_registration_results(init_affine, displacement, inverse, params)
def test_exec(): target='target/IBSR_01_ana_strip.nii.gz' reference='reference/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz' affine='IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeledAffine.txt' paramiter='30x30x0' inversion_iter='20' inversion_tolerance='1e-3' report_status=True print('Registering %s to %s'%(target, reference)) sys.stdout.flush() ####Initialize parameter dictionaries#### metric_parameters = { 'max_step_length':0.25, 'sigma_diff':3.0, 'radius':4} similarity_metric = CCMetric(3, metric_parameters) optimizer_parameters = { 'max_iter':[int(i) for i in paramiter.split(',')], 'inversion_iter':int(inversion_iter), 'inversion_tolerance':float(inversion_tolerance), 'report_status':True if report_status else False} moving = nib.load(target) moving_affine = moving.get_affine() fixed = nib.load(reference) fixed_affine = fixed.get_affine() print 'Affine:', affine if not affine: transform = np.eye(4) else: transform = rcommon.readAntsAffine(affine) init_affine = np.linalg.inv(moving_affine).dot(transform.dot(fixed_affine)) #print initAffine moving = moving.get_data().squeeze().astype(np.float64) fixed = fixed.get_data().squeeze().astype(np.float64) moving = moving.copy(order='C') fixed = fixed.copy(order='C') moving = (moving-moving.min())/(moving.max()-moving.min()) fixed = (fixed-fixed.min())/(fixed.max()-fixed.min()) ###################Run registration################## update_rule = UpdateRule.Composition() registration_optimizer = SymmetricRegistrationOptimizer( fixed, moving, None, init_affine, similarity_metric, update_rule, optimizer_parameters) registration_optimizer.optimize() #displacement = registration_optimizer.get_forward() #inverse = registration_optimizer.get_backward() del registration_optimizer del similarity_metric del update_rule
def testEstimateMultimodalSyN3DMultiScale(fnameMoving, fnameFixed, fnameAffine, warpDir, lambdaParam): ''' testEstimateMultimodalDiffeomorphicField3DMultiScale('IBSR_01_ana_strip.nii.gz', 't1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeledAffine.txt', 100) ''' print 'Registering', fnameMoving, 'to', fnameFixed, 'with lambda=', lambdaParam sys.stdout.flush() moving = nib.load(fnameMoving) fixed = nib.load(fnameFixed) referenceShape = np.array(fixed.shape, dtype=np.int32) M = moving.get_affine() F = fixed.get_affine() if not fnameAffine: T = np.eye(4) else: T = rcommon.readAntsAffine(fnameAffine) initAffine = np.linalg.inv(M).dot(T.dot(F)) print initAffine moving = moving.get_data().squeeze().astype(np.float64) fixed = fixed.get_data().squeeze().astype(np.float64) moving = np.copy(moving, order='C') fixed = np.copy(fixed, order='C') moving = (moving - moving.min()) / (moving.max() - moving.min()) fixed = (fixed - fixed.min()) / (fixed.max() - fixed.min()) level = 2 maskMoving = moving > 0 maskFixed = fixed > 0 movingPyramid = [ img for img in rcommon.pyramid_gaussian_3D(moving, level, maskMoving) ] fixedPyramid = [ img for img in rcommon.pyramid_gaussian_3D(fixed, level, maskFixed) ] #maxOuterIter=[25,50,100,100, 100, 100] maxOuterIter = [2, 2, 2, 2, 2, 2] baseMoving = rcommon.getBaseFileName(fnameMoving) baseFixed = rcommon.getBaseFileName(fnameFixed) # if(os.path.exists('disp_'+baseMoving+'_'+baseFixed+'.npy')): # displacement=np.load('disp_'+baseMoving+'_'+baseFixed+'.npy') # else: displacement, directInverse = estimateMultimodalSyN3DMultiScale( movingPyramid, fixedPyramid, initAffine, lambdaParam, maxOuterIter, 0) tf.prepend_affine_to_displacement_field(displacement, initAffine) # np.save('disp_'+baseMoving+'_'+baseFixed+'.npy', displacement) #####Warp all requested volumes #---first the target using tri-linear interpolation--- moving = nib.load(fnameMoving).get_data().squeeze().astype(np.float64) moving = np.copy(moving, order='C') warped = np.array(tf.warp_volume(moving, displacement)).astype(np.int16) imgWarped = nib.Nifti1Image(warped, F) imgWarped.to_filename('warpedDiff_' + baseMoving + '_' + baseFixed + '.nii.gz') #---warp using affine only moving = nib.load(fnameMoving).get_data().squeeze().astype(np.int32) moving = np.copy(moving, order='C') warped = np.array( tf.warp_discrete_volumeNNAffine(moving, referenceShape, initAffine)).astype(np.int16) imgWarped = nib.Nifti1Image( warped, F) #The affine transformation is the reference's one imgWarped.to_filename('warpedAffine_' + baseMoving + '_' + baseFixed + '.nii.gz') #---now the rest of the targets using nearest neighbor names = [os.path.join(warpDir, name) for name in os.listdir(warpDir)] for name in names: #---warp using the non-linear deformation toWarp = nib.load(name).get_data().squeeze().astype(np.int32) toWarp = np.copy(toWarp, order='C') baseWarp = rcommon.getBaseFileName(name) warped = np.array(tf.warp_discrete_volumeNN( toWarp, displacement)).astype(np.int16) imgWarped = nib.Nifti1Image( warped, F) #The affine transformation is the reference's one imgWarped.to_filename('warpedDiff_' + baseWarp + '_' + baseFixed + '.nii.gz') #---warp using affine inly warped = np.array( tf.warp_discrete_volumeNNAffine(toWarp, referenceShape, initAffine)).astype(np.int16) imgWarped = nib.Nifti1Image( warped, F) #The affine transformation is the reference's one imgWarped.to_filename('warpedAffine_' + baseWarp + '_' + baseFixed + '.nii.gz') #---finally, the deformed lattices (forward, inverse and resdidual)--- lambdaParam = 0.9 maxIter = 100 tolerance = 1e-4 print 'Computing inverse...' inverse = np.array( tf.invert_vector_field3D(displacement, lambdaParam, maxIter, tolerance)) residual = np.array(tf.compose_vector_fields3D(displacement, inverse)) saveDeformedLattice3D( displacement, 'latticeDispDiff_' + baseMoving + '_' + baseFixed + '.nii.gz') saveDeformedLattice3D( inverse, 'latticeInvDiff_' + baseMoving + '_' + baseFixed + '.nii.gz') saveDeformedLattice3D( residual, 'latticeResdiff_' + baseMoving + '_' + baseFixed + '.nii.gz') residual = np.sqrt(np.sum(residual**2, 3)) print "Mean residual norm:", residual.mean(), " (", residual.std( ), "). Max residual norm:", residual.max()
def testEstimateMultimodalSyN3DMultiScale(fnameMoving, fnameFixed, fnameAffine, warpDir, lambdaParam): ''' testEstimateMultimodalDiffeomorphicField3DMultiScale('IBSR_01_ana_strip.nii.gz', 't1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeledAffine.txt', 100) ''' print 'Registering', fnameMoving, 'to', fnameFixed,'with lambda=',lambdaParam sys.stdout.flush() moving = nib.load(fnameMoving) fixed= nib.load(fnameFixed) referenceShape=np.array(fixed.shape, dtype=np.int32) M=moving.get_affine() F=fixed.get_affine() if not fnameAffine: T=np.eye(4) else: T=rcommon.readAntsAffine(fnameAffine) initAffine=np.linalg.inv(M).dot(T.dot(F)) print initAffine moving=moving.get_data().squeeze().astype(np.float64) fixed=fixed.get_data().squeeze().astype(np.float64) moving=np.copy(moving, order='C') fixed=np.copy(fixed, order='C') moving=(moving-moving.min())/(moving.max()-moving.min()) fixed=(fixed-fixed.min())/(fixed.max()-fixed.min()) level=2 maskMoving=moving>0 maskFixed=fixed>0 movingPyramid=[img for img in rcommon.pyramid_gaussian_3D(moving, level, maskMoving)] fixedPyramid=[img for img in rcommon.pyramid_gaussian_3D(fixed, level, maskFixed)] #maxOuterIter=[25,50,100,100, 100, 100] maxOuterIter=[2,2,2,2,2,2] baseMoving=rcommon.getBaseFileName(fnameMoving) baseFixed=rcommon.getBaseFileName(fnameFixed) # if(os.path.exists('disp_'+baseMoving+'_'+baseFixed+'.npy')): # displacement=np.load('disp_'+baseMoving+'_'+baseFixed+'.npy') # else: displacement, directInverse=estimateMultimodalSyN3DMultiScale(movingPyramid, fixedPyramid, initAffine, lambdaParam, maxOuterIter, 0) tf.prepend_affine_to_displacement_field(displacement, initAffine) # np.save('disp_'+baseMoving+'_'+baseFixed+'.npy', displacement) #####Warp all requested volumes #---first the target using tri-linear interpolation--- moving=nib.load(fnameMoving).get_data().squeeze().astype(np.float64) moving=np.copy(moving, order='C') warped=np.array(tf.warp_volume(moving, displacement)).astype(np.int16) imgWarped=nib.Nifti1Image(warped, F) imgWarped.to_filename('warpedDiff_'+baseMoving+'_'+baseFixed+'.nii.gz') #---warp using affine only moving=nib.load(fnameMoving).get_data().squeeze().astype(np.int32) moving=np.copy(moving, order='C') warped=np.array(tf.warp_discrete_volumeNNAffine(moving, referenceShape, initAffine)).astype(np.int16) imgWarped=nib.Nifti1Image(warped, F)#The affine transformation is the reference's one imgWarped.to_filename('warpedAffine_'+baseMoving+'_'+baseFixed+'.nii.gz') #---now the rest of the targets using nearest neighbor names=[os.path.join(warpDir,name) for name in os.listdir(warpDir)] for name in names: #---warp using the non-linear deformation toWarp=nib.load(name).get_data().squeeze().astype(np.int32) toWarp=np.copy(toWarp, order='C') baseWarp=rcommon.getBaseFileName(name) warped=np.array(tf.warp_discrete_volumeNN(toWarp, displacement)).astype(np.int16) imgWarped=nib.Nifti1Image(warped, F)#The affine transformation is the reference's one imgWarped.to_filename('warpedDiff_'+baseWarp+'_'+baseFixed+'.nii.gz') #---warp using affine inly warped=np.array(tf.warp_discrete_volumeNNAffine(toWarp, referenceShape, initAffine)).astype(np.int16) imgWarped=nib.Nifti1Image(warped, F)#The affine transformation is the reference's one imgWarped.to_filename('warpedAffine_'+baseWarp+'_'+baseFixed+'.nii.gz') #---finally, the deformed lattices (forward, inverse and resdidual)--- lambdaParam=0.9 maxIter=100 tolerance=1e-4 print 'Computing inverse...' inverse=np.array(tf.invert_vector_field3D(displacement, lambdaParam, maxIter, tolerance)) residual=np.array(tf.compose_vector_fields3D(displacement, inverse)) saveDeformedLattice3D(displacement, 'latticeDispDiff_'+baseMoving+'_'+baseFixed+'.nii.gz') saveDeformedLattice3D(inverse, 'latticeInvDiff_'+baseMoving+'_'+baseFixed+'.nii.gz') saveDeformedLattice3D(residual, 'latticeResdiff_'+baseMoving+'_'+baseFixed+'.nii.gz') residual=np.sqrt(np.sum(residual**2,3)) print "Mean residual norm:", residual.mean()," (",residual.std(), "). Max residual norm:", residual.max()
def showRegistrationResultMidSlices(fnameMoving, fnameFixed, fnameAffine=None): ''' showRegistrationResultMidSlices('IBSR_01_ana_strip.nii.gz', 't1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeledAffine.txt') showRegistrationResultMidSlices('warpedDiff_IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 't1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_ana_strip_IBSR_02_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_02/IBSR_02_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_segTRI_ana_IBSR_02_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_02/IBSR_02_segTRI_ana.nii.gz', None) ##Worst pair: showRegistrationResultMidSlices('warpedDiff_IBSR_16_segTRI_ana_IBSR_12_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_segTRI_ana.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_16/IBSR_16_segTRI_ana.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_segTRI_ana.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_16/IBSR_16_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_16_segTRI_ana_IBSR_12_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_segTRI_ana.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_16_ana_strip_IBSR_12_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_16_ana_strip_IBSR_12_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_ana_strip.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_16/IBSR_16_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_10_ana_strip_IBSR_16_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_16/IBSR_16_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_16_ana_strip_IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_16_ana_strip_IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_ana_strip_IBSR_08_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_08/IBSR_08_ana_strip.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_01/IBSR_01_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_08/IBSR_08_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_13_ana_strip_IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_13_ana_strip_IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_13/IBSR_13_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_ana_strip_IBSR_02_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_16_seg_ana_IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_seg_ana.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_16/IBSR_16_seg_ana.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_seg_ana.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_01/IBSR_01_segTRI_fill_ana.nii.gz', 'warpedAffine_IBSR_10_segTRI_fill_ana_IBSR_01_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_07_ana_strip_IBSR_17_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_17/IBSR_17_ana_strip.nii.gz', None) showRegistrationResultMidSlices('/opt/registration/data/t1/IBSR18/IBSR_07/IBSR_07_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_17/IBSR_17_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_06_ana_strip_IBSR_17_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_17/IBSR_17_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_07_ana_strip_IBSR_12_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_12/IBSR_12_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_15_ana_strip_IBSR_10_ana_strip.nii.gz', '/opt/registration/data/t1/IBSR18/IBSR_10/IBSR_10_ana_strip.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 't1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_segTRI_fill_ana_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/phantom_1.0mm_normal_crisp.rawb.nii.gz', None) showRegistrationResultMidSlices('data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/phantom_1.0mm_normal_crisp_peeled.nii.gz', None) showRegistrationResultMidSlices('data/t2/t2_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/phantom_1.0mm_normal_crisp_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_16_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_16_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('test16.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_15_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_15_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedAffine_IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) showRegistrationResultMidSlices('warpedDiff_IBSR_01_ana_strip_t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz', None) ''' if(fnameAffine==None): T=np.eye(4) else: T=rcommon.readAntsAffine(fnameAffine) print 'T:',T fixed=nib.load(fnameFixed) F=fixed.get_affine() print 'F:',F fixed=fixed.get_data().squeeze().astype(np.float64) moving=nib.load(fnameMoving) M=moving.get_affine() print 'M:',M moving=moving.get_data().squeeze().astype(np.float64) initAffine=np.linalg.inv(M).dot(T.dot(F)) fixed=np.copy(fixed, order='C') moving=np.copy(moving, order='C') warped=np.array(tf.warp_volume_affine(moving, np.array(fixed.shape).astype(np.int32), initAffine)) sh=warped.shape rcommon.overlayImages(warped[sh[0]//2,:,:], fixed[sh[0]//2,:,:]) rcommon.overlayImages(warped[:,sh[1]//2,:], fixed[:,sh[1]//2,:]) rcommon.overlayImages(warped[:,:,sh[2]//2], fixed[:,:,sh[2]//2])