Ejemplo n.º 1
0
# # Solve for the TPS based off of the landmakrs
# spline = SolveSpline(flipLM)
# h = SplineToHField(spline, T2Grid, memT)
# print ca.MinMax(h)
# liveDef = T2.copy()
# cc.ApplyHReal(liveDef,live,h)

# Variance equalize the volumes and blur the live
T2_VE = ca.Image3D(T2.grid(), memT)
live_VE = ca.Image3D(liveDef.grid(), memT)
ca.Copy(T2_VE, T2)
cc.VarianceEqualize_I(T2_VE, sigma=5)
ca.Copy(live_VE, liveDef)
cc.VarianceEqualize_I(live_VE, sigma=5)
gausfilt = ca.GaussianFilterGPU()
gausfilt.updateParams(live_VE.size(), ca.Vec3Df(3, 3, 3), ca.Vec3Di(3, 3, 3))
live_VEfilt = ca.Image3D(live_VE.grid(), memT)
temp = ca.Image3D(live_VE.grid(), memT)
gausfilt.filter(live_VEfilt, live_VE, temp)
dispslice = [128, 120, 128]

# Display some initial images
cd.Disp3Pane(live_VEfilt,
             rng=[-3, 3],
             sliceIdx=dispslice,
             title='Live VE Filtered')
cd.Disp3Pane(T2_VE, rng=[-3, 3], sliceIdx=dispslice, title='T2 VE')
print 'MinMax of Live = ' + str(ca.MinMax(live_VE))
print 'MinMax of T2 = ' + str(ca.MinMax(T2_VE))
preRegDiff = T2_VE - live_VEfilt
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