def SetScale(scale):
        '''Scale Management for Multiscale'''
        scaleManager.set(scale)
        resampler.setScaleLevel(scaleManager)
        curGrid = scaleManager.getCurGrid()
        curGrid.spacing().z = 1  # Because only 2D

        print 'Inside setScale(). Current grid is ', curGrid

        if scaleManager.isLastScale():
            print 'Inside setScale(): **Last Scale**'
        if scaleManager.isFirstScale():
            print 'Inside setScale(): **First Scale**'

        scratchISrc.setGrid(curGrid)
        scratchITar.setGrid(curGrid)
        scratchI.setGrid(curGrid)
        compF.setGrid(curGrid)
        idConf.study.I0 = ca.Image3D(curGrid, memT)
        idConf.study.I1 = ca.Image3D(curGrid, memT)

        if scaleManager.isLastScale():
            s = config.sigBlur[scaleList.index(sc)]
            r = config.kerBlur[scaleList.index(sc)]
            gausFilt.updateParams(I_tar.size(), ca.Vec3Df(r, r, r),
                                  ca.Vec3Di(s, s, s))
            gausFilt.filter(scratchITar, I_tar, temp)
            gausFilt.filter(scratchI, I_src, temp)

# ca.Copy(scratchI, I_src)
# ca.Copy(scratchITar, I_tar)

        else:
            s = config.sigBlur[scaleList.index(sc)]
            r = config.kerBlur[scaleList.index(sc)]
            gausFilt.updateParams(I_tar.size(), ca.Vec3Df(r, r, r),
                                  ca.Vec3Di(s, s, s))
            gausFilt.filter(I_tar_blur, I_tar, temp)
            gausFilt.filter(I_src_blur, I_src, temp)
            resampler.downsampleImage(scratchI, I_src_blur)
            resampler.downsampleImage(scratchITar, I_tar_blur)

        if scaleManager.isFirstScale():
            scratchF.setGrid(curGrid)
            scratchITar.setGrid(curGrid)
            ca.SetToIdentity(scratchF)
            ca.ApplyH(scratchISrc, scratchI, scratchF)

        else:
            compF.setGrid(scratchF.grid())
            ca.ComposeHH(compF, scratchF, h)
            resampler.updateHField(scratchF)
            resampler.updateHField(compF)
            ca.Copy(scratchF, compF)
            ca.ApplyH(scratchISrc, scratchI, compF)
Ejemplo n.º 2
0
    Idef, phi0 = IDiff(BFI_VE_def,
                       MRI_VE,
                       step=step,
                       sigma=sigma,
                       nIters=nIters,
                       plot=debug,
                       verbose=1)[:2]
    if debug:
        time.sleep(3)
        plt.close('all')

    phi = phi0.copy()
    hA = phi0.copy()
    cc.AtoH(hA, A)  # convert A to h field
    ca.ComposeHH(phi, hA, phi0)

    # convert grid back
    hA.setGrid(grid_orig)
    phi0.setGrid(grid_orig)
    phi.setGrid(grid_orig)
    Idef.setGrid(grid_orig)
    BFI_VE.setGrid(grid_orig)
    MRI_VE.setGrid(grid_orig)

    # Insert Slice back into Volume
    if SaveRGB:
        BFI_color = common.ExtractSliceVF(BFI_color3D, sliceIdx)
        BFI_color.toType(ca.MEM_DEVICE)
        BFI_color.setGrid(grid2D)
Ejemplo n.º 3
0
                                      Ieps,
                                      Isigma,
                                      InIter,
                                      plot=False,
                                      verbose=1)

Idiff = T2_VE - live_VEfilt_ID
cd.Disp3Pane(Idiff, rng=[-3, 3], sliceIdx=dispslice)
cd.EnergyPlot(Ienergy, legend=['Reg', 'Data', 'Total'])
cd.DispHGrid(Iphi)
print ca.MinMax(Iphi)

# Compose the deformations and apply the total deformation to the initial live volume
# tempDef = ca.Field3D(phi.grid(), memT)
totDef = ca.Field3D(phi.grid(), memT)
ca.ComposeHH(totDef, phi, Iphi, ca.BACKGROUND_STRATEGY_CLAMP)
# ca.ComposeHH(totDef, h, tempDef, ca.BACKGROUND_STRATEGY_CLAMP)

#Apply the deformation to the TPS live volume and rotate to the original volume
live_T2reg_rot = T2.copy()
cc.HtoReal(totDef)
cc.ApplyHReal(live_T2reg_rot, liveDef, totDef)
cd.Disp3Pane(live_T2reg_rot)
# live_T2reg = T2.copy()
# cc.ApplyAffineReal(live_T2reg,live_T2reg_rot,np.linalg.inv(rotMat))
# cd.Disp3Pane(live_T2reg)

if write:
    cc.WriteMHA(live_T2reg_rot,
                SaveDir + 'M13_01_live_as_MRI_full_bw_256_roty-119_flipy.mha')
    cc.WriteMHA(live_T2reg, SaveDir + 'M13_01_live_as_MRI_full_bw_256.mha')
def DefReg(I_src, I_tar, config, memT, idConf):

    I_src.toType(memT)
    I_tar.toType(memT)

    # Convert to 2D spacing (because it really matters)
    sp2D = I_src.spacing().tolist()
    sp2D = ca.Vec3Df(sp2D[0], sp2D[1], 1)

    I_tar.setSpacing(sp2D)
    I_src.setSpacing(sp2D)
    gridReg = I_tar.grid()

    # Blur the images
    I_tar_blur = I_tar.copy()
    I_src_blur = I_src.copy()
    temp = ca.Image3D(I_tar.grid(), memT)
    gausFilt = ca.GaussianFilterGPU()

    scaleList = config.scale

    # Initiate the scale manager
    scaleManager = ca.MultiscaleManager(gridReg)
    for s in scaleList:
        scaleManager.addScaleLevel(s)
    if memT == ca.MEM_HOST:
        resampler = ca.MultiscaleResamplerGaussCPU(gridReg)
    else:
        resampler = ca.MultiscaleResamplerGaussGPU(gridReg)

    # Generate the scratch images
    scratchITar = ca.Image3D(gridReg, memT)
    scratchISrc = ca.Image3D(gridReg, memT)
    scratchI = ca.Image3D(gridReg, memT)
    scratchF = ca.Field3D(gridReg, memT)
    compF = ca.Field3D(gridReg, memT)

    def SetScale(scale):
        '''Scale Management for Multiscale'''
        scaleManager.set(scale)
        resampler.setScaleLevel(scaleManager)
        curGrid = scaleManager.getCurGrid()
        curGrid.spacing().z = 1  # Because only 2D

        print 'Inside setScale(). Current grid is ', curGrid

        if scaleManager.isLastScale():
            print 'Inside setScale(): **Last Scale**'
        if scaleManager.isFirstScale():
            print 'Inside setScale(): **First Scale**'

        scratchISrc.setGrid(curGrid)
        scratchITar.setGrid(curGrid)
        scratchI.setGrid(curGrid)
        compF.setGrid(curGrid)
        idConf.study.I0 = ca.Image3D(curGrid, memT)
        idConf.study.I1 = ca.Image3D(curGrid, memT)

        if scaleManager.isLastScale():
            s = config.sigBlur[scaleList.index(sc)]
            r = config.kerBlur[scaleList.index(sc)]
            gausFilt.updateParams(I_tar.size(), ca.Vec3Df(r, r, r),
                                  ca.Vec3Di(s, s, s))
            gausFilt.filter(scratchITar, I_tar, temp)
            gausFilt.filter(scratchI, I_src, temp)

# ca.Copy(scratchI, I_src)
# ca.Copy(scratchITar, I_tar)

        else:
            s = config.sigBlur[scaleList.index(sc)]
            r = config.kerBlur[scaleList.index(sc)]
            gausFilt.updateParams(I_tar.size(), ca.Vec3Df(r, r, r),
                                  ca.Vec3Di(s, s, s))
            gausFilt.filter(I_tar_blur, I_tar, temp)
            gausFilt.filter(I_src_blur, I_src, temp)
            resampler.downsampleImage(scratchI, I_src_blur)
            resampler.downsampleImage(scratchITar, I_tar_blur)

        if scaleManager.isFirstScale():
            scratchF.setGrid(curGrid)
            scratchITar.setGrid(curGrid)
            ca.SetToIdentity(scratchF)
            ca.ApplyH(scratchISrc, scratchI, scratchF)

        else:
            compF.setGrid(scratchF.grid())
            ca.ComposeHH(compF, scratchF, h)
            resampler.updateHField(scratchF)
            resampler.updateHField(compF)
            ca.Copy(scratchF, compF)
            ca.ApplyH(scratchISrc, scratchI, compF)

    for sc in scaleList:
        SetScale(scaleList.index(sc))

        #Set the optimize parameters in the IDiff configuration object
        idConf.optim.Niter = config.iters[scaleList.index(sc)]
        idConf.optim.stepSize = config.epsReg[scaleList.index(sc)]
        idConf.idiff.regWeight = config.sigReg[scaleList.index(sc)]
        ca.Copy(idConf.study.I0, scratchISrc)
        ca.Copy(idConf.study.I1, scratchITar)
        idConf.io.plotEvery = config.iters[scaleList.index(sc)]

        h = IDiff.Matching.Matching(idConf)
        tempScr = scratchISrc.copy()
        ca.ApplyH(tempScr, scratchISrc, h)

        #Plot the images to see the change
        cd.DispImage(scratchISrc - scratchITar,
                     rng=[-2, 2],
                     title='Orig Diff',
                     colorbar=True)
        cd.DispImage(tempScr - scratchITar,
                     rng=[-2, 2],
                     title='Reg Diff',
                     colorbar=True)

        # common.DebugHere()

        # I_src_def = idConf.study.I0.copy()

        # scratchITar = idConf.study.I1
        # eps = config.epsReg[scaleList.index(sc)]
        # sigma = config.sigReg[scaleList.index(sc)]
        # nIter = config.iters[scaleList.index(sc)]
        # # common.DebugHere()
        # [I_src_def, h, energy] = apps.IDiff(scratchISrc, scratchITar, eps, sigma, nIter, plot=True, verbose=1)
    ca.ComposeHH(scratchF, compF, h)
    I_src_def = idConf.study.I0.copy()

    return I_src_def, scratchF
Ejemplo n.º 5
0
    nIter_I = 200
    [def_ID, theta, energy] = apps.IDiff(def_TPS,
                                         M13_aff,
                                         eps,
                                         sigma_I,
                                         nIter_I,
                                         plot=True,
                                         verbose=1)

    if write:
        cc.WriteMHA(def_ID, M15dir + 'IDiff/M15_01_ID_to_M13.mha')
        cc.WriteMHA(theta, M15dir + 'IDiff/M15_01_ID_Field_to_M13.mha')

    h = cc.LoadMHA(M15dir + 'TPS/M15_01_TPS_Field_to_M13.mha', memT)
    compDef = ca.Field3D(M13_aff.grid(), memT)
    ca.ComposeHH(compDef, h, theta, bg=ca.BACKGROUND_STRATEGY_CLAMP)

    common.DebugHere()

    Final_aff = ca.Image3D(M13_aff.grid(), memT)
    cc.ApplyAffineReal(Final_aff, M15, np.linalg.inv(aff))

    Final = ca.Image3D(M13_aff.grid(), memT)
    cc.ApplyHReal(Final, Final_aff, compDef)

    if write:
        cc.WriteMHA(Final, M15dir + 'FullDef/M15_01_MRI_as_M13.mha')
        cc.WriteMHA(compDef, M15dir + 'FullDef/M15_01_Field_to_M13.mha')

if not M15_to_M13:
    write = True