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