def testMultimodalRigidTransformationMultiScale3D_ecqmmf(betaGT, level): leftName = 'data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb' rightName = 'data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb' #rightName='data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb' #leftName='data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb' betaGTRads = np.array(betaGT, dtype=np.float64) betaGTRads[0:3] = np.copy(np.pi * betaGTRads[0:3] / 180.0) ns = 181 nr = 217 nc = 181 print 'Loading volume...' left = np.fromfile(leftName, dtype=np.ubyte).reshape(ns, nr, nc) left = left.astype(np.float64) print 'Generating pyramid at level', level, '...' right = np.fromfile(rightName, dtype=np.ubyte).reshape(ns, nr, nc) right = right.astype(np.float64) right = rcommon.applyRigidTransformation3D(right, betaGTRads) leftPyramid = [i for i in rcommon.pyramid_gaussian_3D(left, level)] rightPyramid = [i for i in rcommon.pyramid_gaussian_3D(right, level)] print 'Estimation started.' beta = estimateMultiModalRigidTransformationMultiscale3D( leftPyramid, rightPyramid) print 'Estimation finished.' print 'Ground truth:', betaGT plotSlicePyramidsAxial(leftPyramid, rightPyramid) return beta
def testMultimodalRigidTransformationMultiScale3D_ecqmmf(betaGT, level): leftName='data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb' rightName='data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb' #rightName='data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb' #leftName='data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb' betaGTRads=np.array(betaGT, dtype=np.float64) betaGTRads[0:3]=np.copy(np.pi*betaGTRads[0:3]/180.0) ns=181 nr=217 nc=181 print 'Loading volume...' left=np.fromfile(leftName, dtype=np.ubyte).reshape(ns,nr,nc) left=left.astype(np.float64) print 'Generating pyramid at level',level,'...' right=np.fromfile(rightName, dtype=np.ubyte).reshape(ns,nr,nc) right=right.astype(np.float64) right=rcommon.applyRigidTransformation3D(right, betaGTRads) leftPyramid=[i for i in rcommon.pyramid_gaussian_3D(left, level)] rightPyramid=[i for i in rcommon.pyramid_gaussian_3D(right, level)] print 'Estimation started.' beta=estimateMultiModalRigidTransformationMultiscale3D(leftPyramid, rightPyramid) print 'Estimation finished.' print 'Ground truth:', betaGT plotSlicePyramidsAxial(leftPyramid, rightPyramid) return beta
def testMultimodalRigidTransformationMultiScale3D_ecqmmf( betaGT, level, nclasses, lambdaParam, mu, maxIter, tolerance): betaGTRads = np.array(betaGT, dtype=np.float64) betaGTRads[0:3] = np.copy(np.pi * betaGTRads[0:3] / 180.0) movingName = 'data/t2/t2_icbm_normal_1mm_pn0_rf0_peeled.nii.gz' fixedName = 'data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz' print 'Loading data...' moving = nib.load(movingName) moving = moving.get_data().squeeze() moving = moving.astype(np.float64) fixed = nib.load(fixedName) fixed = fixed.get_data().squeeze() fixed = fixed.astype(np.float64) moving = (moving - moving.min()) / (moving.max() - moving.min()) fixed = (fixed - fixed.min()) / (fixed.max() - fixed.min()) print 'Applying GT transform...' fixed = rcommon.applyRigidTransformation3D(fixed, betaGTRads) sh = moving.shape #leftPyramid=[i for i in rcommon.pyramid_gaussian_3D(moving, level)] #rightPyramid=[i for i in rcommon.pyramid_gaussian_3D(fixed, level)] fixedImage = fixed[:, sh[1] // 2, :].copy() movingImage = moving[:, sh[1] // 2, :].copy() print 'Initializing registration...' meansFixed, variancesFixed, meansMoving, variancesMoving, joint = initializeECQMMFRegistration( fixedImage, movingImage, nclasses, lambdaParam, mu, maxIter, tolerance) joint = np.array(joint) negLogLikelihood = np.zeros_like(joint) ecqmmf_reg.compute_registration_neg_log_likelihood_constant_models( fixedImage, movingImage, joint, meansFixed, meansMoving, variancesFixed, variancesMoving, negLogLikelihood) #ecqmmf_reg.initialize_registration_maximum_likelihood_probs(negLogLikelihood, joint): ecqmmf.initialize_normalized_likelihood(negLogLikelihood, joint) bufferN = np.array(range(nclasses * nclasses)) bufferD = np.array(range(nclasses * nclasses)) for iter_count in range(maxIter): print 'Iter:', iter_count, '/', maxIter ecqmmf_reg.iterate_marginals(negLogLikelihood, joint, lambdaParam, mu, bufferN, bufferD) #ecqmmf_reg.integrate_registration_probabilistic_weighted_tensor_field_products(double[:,:,:] q, double[:,:] diff, double[:,:,:,:] probs, double[:] weights) ecqmmf_reg.compute_registration_neg_log_likelihood_constant_models( fixedImage, movingImage, joint, meansFixed, meansMoving, variancesFixed, variancesMoving, negLogLikelihood) #----plot joint probability maps--- print 'Plotting joint probability maps...' plt.figure() plt.title('Joint probability maps') for i in range(nclasses): for j in range(nclasses): plt.subplot(nclasses, nclasses, 1 + i * nclasses + j) plt.imshow(joint[:, :, i, j], cmap=plt.cm.gray) plt.title("F=" + str(i) + ", M=" + str(j)) #----plot negLogLikelihood maps--- print 'Plotting negLogLikelihood maps...' plt.figure() plt.title('neg-log-likelihood maps') for i in range(nclasses): for j in range(nclasses): plt.subplot(nclasses, nclasses, 1 + i * nclasses + j) plt.imshow(negLogLikelihood[:, :, i, j], cmap=plt.cm.gray) plt.title("F=" + str(i) + ", M=" + str(j))
def testMultimodalRigidTransformationMultiScale3D_ecqmmf(betaGT, level, nclasses, lambdaParam, mu, maxIter, tolerance): betaGTRads=np.array(betaGT, dtype=np.float64) betaGTRads[0:3]=np.copy(np.pi*betaGTRads[0:3]/180.0) movingName='data/t2/t2_icbm_normal_1mm_pn0_rf0_peeled.nii.gz' fixedName ='data/t1/t1_icbm_normal_1mm_pn0_rf0_peeled.nii.gz' print 'Loading data...' moving=nib.load(movingName) moving=moving.get_data().squeeze() moving=moving.astype(np.float64) fixed=nib.load(fixedName) fixed=fixed.get_data().squeeze() fixed=fixed.astype(np.float64) moving=(moving-moving.min())/(moving.max()-moving.min()) fixed=(fixed-fixed.min())/(fixed.max()-fixed.min()) print 'Applying GT transform...' fixed=rcommon.applyRigidTransformation3D(fixed, betaGTRads) sh=moving.shape #leftPyramid=[i for i in rcommon.pyramid_gaussian_3D(moving, level)] #rightPyramid=[i for i in rcommon.pyramid_gaussian_3D(fixed, level)] fixedImage=fixed[:,sh[1]//2,:].copy() movingImage=moving[:,sh[1]//2,:].copy() print 'Initializing registration...' meansFixed, variancesFixed, meansMoving, variancesMoving, joint=initializeECQMMFRegistration(fixedImage, movingImage, nclasses, lambdaParam, mu, maxIter, tolerance) joint=np.array(joint) negLogLikelihood=np.zeros_like(joint) ecqmmf_reg.compute_registration_neg_log_likelihood_constant_models(fixedImage, movingImage, joint, meansFixed, meansMoving, variancesFixed, variancesMoving, negLogLikelihood) #ecqmmf_reg.initialize_registration_maximum_likelihood_probs(negLogLikelihood, joint): ecqmmf.initialize_normalized_likelihood(negLogLikelihood, joint) bufferN=np.array(range(nclasses*nclasses)) bufferD=np.array(range(nclasses*nclasses)) for iter_count in range(maxIter): print 'Iter:',iter_count,'/',maxIter ecqmmf_reg.iterate_marginals(negLogLikelihood, joint, lambdaParam, mu, bufferN, bufferD) #ecqmmf_reg.integrate_registration_probabilistic_weighted_tensor_field_products(double[:,:,:] q, double[:,:] diff, double[:,:,:,:] probs, double[:] weights) ecqmmf_reg.compute_registration_neg_log_likelihood_constant_models(fixedImage, movingImage, joint, meansFixed, meansMoving, variancesFixed, variancesMoving, negLogLikelihood) #----plot joint probability maps--- print 'Plotting joint probability maps...' plt.figure() plt.title('Joint probability maps') for i in range(nclasses): for j in range(nclasses): plt.subplot(nclasses,nclasses,1+i*nclasses+j) plt.imshow(joint[:,:,i,j], cmap=plt.cm.gray) plt.title("F="+str(i)+", M="+str(j)) #----plot negLogLikelihood maps--- print 'Plotting negLogLikelihood maps...' plt.figure() plt.title('neg-log-likelihood maps') for i in range(nclasses): for j in range(nclasses): plt.subplot(nclasses,nclasses,1+i*nclasses+j) plt.imshow(negLogLikelihood[:,:,i,j], cmap=plt.cm.gray) plt.title("F="+str(i)+", M="+str(j))
def testIntersubjectRigidRegistration(fname0, fname1, level, outfname): nib_left = nib.load(fname0) nib_right = nib.load(fname1) left=nib_left.get_data().astype(np.double).squeeze() right=nib_right.get_data().astype(np.double).squeeze() leftPyramid=[i for i in rcommon.pyramid_gaussian_3D(left, level)] rightPyramid=[i for i in rcommon.pyramid_gaussian_3D(right, level)] plotSlicePyramidsAxial(leftPyramid, rightPyramid) print 'Estimation started.' beta=estimateRigidTransformationMultiscale3D(leftPyramid, rightPyramid) print 'Estimation finished.' rcommon.applyRigidTransformation3D(left, beta) sl=np.array(left.shape)//2 sr=np.array(right.shape)//2 rcommon.overlayImages(left[sl[0],:,:], leftPyramid[0][sr[0],:,:]) rcommon.overlayImages(left[sl[0],:,:], right[sr[0],:,:]) affine_transform=AffineTransform('ijk', ['aligned-z=I->S','aligned-y=P->A', 'aligned-x=L->R'], np.eye(4)) left=Image(left, affine_transform) nipy.save_image(left,outfname) return beta
def testIntersubjectRigidRegistration(fname0, fname1, level, outfname): nib_left = nib.load(fname0) nib_right = nib.load(fname1) left = nib_left.get_data().astype(np.double).squeeze() right = nib_right.get_data().astype(np.double).squeeze() leftPyramid = [i for i in rcommon.pyramid_gaussian_3D(left, level)] rightPyramid = [i for i in rcommon.pyramid_gaussian_3D(right, level)] plotSlicePyramidsAxial(leftPyramid, rightPyramid) print 'Estimation started.' beta = estimateRigidTransformationMultiscale3D(leftPyramid, rightPyramid) print 'Estimation finished.' rcommon.applyRigidTransformation3D(left, beta) sl = np.array(left.shape) // 2 sr = np.array(right.shape) // 2 rcommon.overlayImages(left[sl[0], :, :], leftPyramid[0][sr[0], :, :]) rcommon.overlayImages(left[sl[0], :, :], right[sr[0], :, :]) affine_transform = AffineTransform( 'ijk', ['aligned-z=I->S', 'aligned-y=P->A', 'aligned-x=L->R'], np.eye(4)) left = Image(left, affine_transform) nipy.save_image(left, outfname) return beta
def plotEstimatedTransferedImage(v, numLabels, labels, beta): vtrans=rcommon.applyRigidTransformation3D(v,beta) means, variances=tf.computeVolumeClassStatsCYTHON(vtrans, numLabels, labels) means=np.array(means) variances=np.array(variances) sh=labels.shape meansSlice=means[labels[sh[0]//2]] varianceSlice=variances[labels[sh[0]//2]] plt.figure() plt.subplot(1,2,1) plt.title('Means ['+str(numLabels)+']') plt.imshow(meansSlice, cmap=plt.cm.gray) plt.subplot(1,2,2) plt.imshow(varianceSlice, cmap=plt.cm.gray) plt.title('Variances ['+str(numLabels)+']')
def generateTestingPair(betaGT): betaGTRads=np.array(betaGT, dtype=np.float64) betaGTRads[0:3]=np.copy(np.pi*betaGTRads[0:3]/180.0) ns=181 nr=217 nc=181 left=np.fromfile('data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb', dtype=np.ubyte).reshape(ns,nr,nc) left=left.astype(np.float64) right=np.fromfile('data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb', dtype=np.ubyte).reshape(ns,nr,nc) right=right.astype(np.float64) right=rcommon.applyRigidTransformation3D(right, betaGTRads) affine_transform=AffineTransform('ijk', ['aligned-z=I->S','aligned-y=P->A', 'aligned-x=L->R'], np.eye(4)) left=Image(left, affine_transform) right=Image(right, affine_transform) nipy.save_image(left,'moving.nii') nipy.save_image(right,'fixed.nii')
def plotEstimatedTransferedImage(v, numLabels, labels, beta): vtrans = rcommon.applyRigidTransformation3D(v, beta) means, variances = tf.computeVolumeClassStatsCYTHON( vtrans, numLabels, labels) means = np.array(means) variances = np.array(variances) sh = labels.shape meansSlice = means[labels[sh[0] // 2]] varianceSlice = variances[labels[sh[0] // 2]] plt.figure() plt.subplot(1, 2, 1) plt.title('Means [' + str(numLabels) + ']') plt.imshow(meansSlice, cmap=plt.cm.gray) plt.subplot(1, 2, 2) plt.imshow(varianceSlice, cmap=plt.cm.gray) plt.title('Variances [' + str(numLabels) + ']')
def testRigidTransformationMultiScale3D(betaGT, level): betaGTRads=np.array(betaGT, dtype=np.float64) betaGTRads[0:3]=np.copy(np.pi*betaGTRads[0:3]/180.0) ns=181 nr=217 nc=181 print 'Loading volume...' inImg=np.fromfile('data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb', dtype=np.ubyte).reshape(ns,nr,nc) inImg=inImg.astype(np.float64) print 'Generating pyramid at level',level,'...' left=inImg right=rcommon.applyRigidTransformation3D(inImg, betaGTRads) leftPyramid=[i for i in rcommon.pyramid_gaussian_3D(left, level)] rightPyramid=[i for i in rcommon.pyramid_gaussian_3D(right, level)] plotSlicePyramidsAxial(leftPyramid, rightPyramid) print 'Estimation started.' beta=estimateRigidTransformationMultiscale3D(leftPyramid, rightPyramid) print 'Estimation finished.' print 'Ground truth:', betaGT return beta
def generateTestingPair(betaGT): betaGTRads = np.array(betaGT, dtype=np.float64) betaGTRads[0:3] = np.copy(np.pi * betaGTRads[0:3] / 180.0) ns = 181 nr = 217 nc = 181 left = np.fromfile('data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb', dtype=np.ubyte).reshape(ns, nr, nc) left = left.astype(np.float64) right = np.fromfile('data/t1/t1_icbm_normal_1mm_pn0_rf0.rawb', dtype=np.ubyte).reshape(ns, nr, nc) right = right.astype(np.float64) right = rcommon.applyRigidTransformation3D(right, betaGTRads) affine_transform = AffineTransform( 'ijk', ['aligned-z=I->S', 'aligned-y=P->A', 'aligned-x=L->R'], np.eye(4)) left = Image(left, affine_transform) right = Image(right, affine_transform) nipy.save_image(left, 'moving.nii') nipy.save_image(right, 'fixed.nii')
def testRigidTransformationMultiScale3D(betaGT, level): betaGTRads = np.array(betaGT, dtype=np.float64) betaGTRads[0:3] = np.copy(np.pi * betaGTRads[0:3] / 180.0) ns = 181 nr = 217 nc = 181 print 'Loading volume...' inImg = np.fromfile('data/t2/t2_icbm_normal_1mm_pn0_rf0.rawb', dtype=np.ubyte).reshape(ns, nr, nc) inImg = inImg.astype(np.float64) print 'Generating pyramid at level', level, '...' left = inImg right = rcommon.applyRigidTransformation3D(inImg, betaGTRads) leftPyramid = [i for i in rcommon.pyramid_gaussian_3D(left, level)] rightPyramid = [i for i in rcommon.pyramid_gaussian_3D(right, level)] plotSlicePyramidsAxial(leftPyramid, rightPyramid) print 'Estimation started.' beta = estimateRigidTransformationMultiscale3D(leftPyramid, rightPyramid) print 'Estimation finished.' print 'Ground truth:', betaGT return beta
def plotToneTransferFunction(left, rightQ, numLevels, beta): transformed=rcommon.applyRigidTransformation3D(left, beta) data=[transformed[rightQ==i] for i in range(numLevels)] plt.figure() plt.boxplot(data, 0, '')
def plotToneTransferFunction(left, rightQ, numLevels, beta): transformed = rcommon.applyRigidTransformation3D(left, beta) data = [transformed[rightQ == i] for i in range(numLevels)] plt.figure() plt.boxplot(data, 0, '')