# # 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