コード例 #1
0
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
コード例 #2
0
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
コード例 #3
0
ファイル: test_ecqmmf_reg.py プロジェクト: zuzyc/registration
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))
コード例 #4
0
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))
コード例 #5
0
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
コード例 #6
0
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
コード例 #7
0
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)+']')
コード例 #8
0
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')
コード例 #9
0
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) + ']')
コード例 #10
0
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
コード例 #11
0
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')
コード例 #12
0
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
コード例 #13
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, '')
コード例 #14
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, '')