def main(): if not (len(sys.argv) == 3): print 'Usage: computeJacobianFromLDDMM LDDMM_map_file.vtk result.vtk' sys.exit(0) v = diffeo.Diffeomorphism(filename=sys.argv[1]) u = diffeo.jacobianDeterminant(v.data, resol = v.resol, periodic=True) diffeo.gridScalars(u, resol=v.resol).saveVTK(sys.argv[2])
def main(): if not (len(sys.argv) == 5): print 'Usage: computeMomentumFromLDDMM LDDMM_Template.vtk LDDMM_Deformed_Target.vtk LDDMM_map_Jacobian.vtk result.vtk' sys.exit(0) I0 = diffeo.gridScalars(fileName=sys.argv[1]) I1 = diffeo.gridScalars(fileName=sys.argv[2]) jac = diffeo.gridScalars(fileName=sys.argv[3]) u = np.multiply(jac.data, I1.data - I0.data) diffeo.gridScalars(u).saveVTK(sys.argv[4]) I0.saveVTK('I0.vtk') I1.saveVTK('I1.vtk') jac.saveVTK('jac.vtk')
def endOfIteration(self): #print self.obj0 self.iter += 1 if (self.iter % self.saveRate) == 0: print 'saving...' (obj1, self.ct, self.St, self.grt, self.Jt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True) dim2 = self.dim**2 A = [np.zeros([self.Tsize, self.dim, self.dim]), np.zeros([self.Tsize, self.dim])] if self.affineDim > 0: for t in range(self.Tsize): AB = np.dot(self.affineBasis, Afft[t]) A[0][t] = AB[0:dim2].reshape([self.dim, self.dim]) A[1][t] = AB[dim2:dim2+self.dim] (ct, St, grt) = evol.gaussianDiffeonsEvolutionEuler(self.c0, self.S0, self.at, self.param.sigmaKernel, affine=A, withPointSet= self.gr0Fine) # (ct, St, grt, Jt) = evol.gaussianDiffeonsEvolutionEuler(self.c0, self.S0, self.at, self.param.sigmaKernel, affine=A, # withPointSet = self.fv0Fine.vertices, withJacobian=True) imDef = diffeo.gridScalars(grid = self.im1) for kk in range(self.Tsize+1): imDef.data = diffeo.multilinInterp(self.im1.data, grt[kk, ...].transpose(range(-1, self.grt.ndim-2))) imDef.saveImg(self.outputDir +'/'+ self.saveFile+str(kk)+'.png', normalize=True) if self.dim==3: gd.saveDiffeons(self.outputDir +'/'+ self.saveFile+'Diffeons'+str(kk)+'.vtk', self.ct[kk,...], self.St[kk,...]) elif self.dim==2: (R, detR) = gd.multiMatInverse1(self.St[kk,...], isSym=True) diffx = self.gr1[..., np.newaxis, :] - self.ct[kk, ...] betax = (R*diffx[..., np.newaxis, :]).sum(axis=-1) dst = (betax * diffx).sum(axis=-1) diffIm = np.minimum((255*(1-dst)*(dst < 1)).astype(float).sum(axis=-1), 255) out = Image.fromarray(diffIm.astype(np.uint8)) out.save(self.outputDir +'/'+ self.saveFile+'Diffeons'+str(kk)+'.png') else: (obj1, self.ct, self.St, self.grt, self.Jt) = self.objectiveFunDef(self.at, self.Afft, withTrajectory=True)
def main(): parser = argparse.ArgumentParser(description="Computes isosurfaces over directories") parser.add_argument("dirIn", metavar="dirIn", type=str, help="input directory") parser.add_argument( "--pattern", metavar="pattern", type=str, dest="pattern", default="*.hdr", help="Regular expression for files to process (default: *.hdr)", ) parser.add_argument("--dirOut", metavar="dirOut", type=str, dest="dirOut", default="", help="Output directory") parser.add_argument( "--targetSize", metavar="targetSize", type=int, dest="targetSize", default=1000, help="targeted number of vertices", ) parser.add_argument( "--force-axial-unflipped", action="store_true", dest="axun", default=False, help="force reading .img files using axial unflipped order", ) parser.add_argument("--with-bug", action="store_true", dest="withbug", default=False, help="for back compatibility") parser.add_argument( "--smooth", action="store_true", dest="smooth", default=False, help="adds smoothing step to triangulation" ) parser.add_argument( "--zeroPad", action="store_true", dest="zeroPad", default=False, help="inserts a layer of zeros around the image before triangulation", ) args = parser.parse_args() if args.dirOut == "": args.dirOut = args.dirIn if path.exists(args.dirOut) == False: os.mkdir(args.dirOut) sf = surfaces.Surface() for name in glob.glob(args.dirIn + "/" + args.pattern): print "Processing ", name u = path.split(name) [nm, ext] = path.splitext(u[1]) v = diffeo.gridScalars(fileName=name, force_axun=args.axun, withBug=args.withbug) if args.zeroPad: v.zeroPad(1) # print v.resol # if args.smooth: # sf.Isosurface(v.data, value=0.5, target = args.targetSize, scales = v.resol, smooth=.5) # else: # sf.Isosurface(v.data, value=0.5, target = args.targetSize, scales = v.resol, smooth =-1) t = 0.5 * (v.data.max() + v.data.min()) # print v.resol if args.smooth: sf.Isosurface(v.data, value=t, target=args.targetSize, scales=v.resol, smooth=0.75) else: sf.Isosurface(v.data, value=t, target=args.targetSize, scales=v.resol, smooth=-1) sf.edgeRecover() # print sf.surfVolume() sf.savebyu(args.dirOut + "/" + nm + ".byu")
def __init__(self, Template=None, Target=None, Diffeons=None, EpsilonNet=None, DecimationTarget=1, subsampleTemplate = 1, targetMargin=10, templateMargin=0, DiffeonEpsForNet=None, DiffeonSegmentationRatio=None, zeroVar=False, fileTempl=None, fileTarg=None, param=None, maxIter=1000, regWeight = 1.0, affineWeight = 1.0, verb=True, rotWeight = None, scaleWeight = None, transWeight = None, testGradient=False, saveFile = 'evolution', affine = 'none', outputDir = '.'): if Template==None: if fileTempl==None: print 'Please provide a template image' return else: self.im0 = diffeo.gridScalars(filename=fileTempl) else: self.im0 = diffeo.gridScalars(grid=Template) #print self.im0.data.shape, Template.data.shape if Target==None: if fileTarg==None: print 'Please provide a target image' return else: self.im1 = diffeo.gridScalars(filename=fileTarg) else: self.im1 = diffeo.gridScalars(grid=Target) #zoom = np.minimum(np.array(self.im0.data.shape).astype(float)/np.array(self.im1.data.shape), np.ones(self.im0.data.ndim)) zoom = np.array(self.im0.data.shape).astype(float)/np.array(self.im1.data.shape) print zoom self.im1.data = Img.interpolation.zoom(self.im1.data, zoom, order=0) # Include template in bigger image if templateMargin >0: I = range(-templateMargin, self.im0.data.shape[0]+templateMargin) for k in range(1, self.im0.data.ndim): I = (I, range(-templateMargin, self.im0.data.shape[k]+templateMargin)) self.gr1 = np.array(np.meshgrid(*I, indexing='ij')) #print self.im1.data.shape self.im0.data = diffeo.multilinInterp(self.im0.data, self.gr1) # Include target in bigger image I = range(-targetMargin, self.im1.data.shape[0]+targetMargin) for k in range(1, self.im1.data.ndim): I = (I, range(-targetMargin, self.im1.data.shape[k]+targetMargin)) self.gr1 = np.array(np.meshgrid(*I, indexing='ij')) #print self.im1.data.shape self.im1.data = diffeo.multilinInterp(self.im1.data, self.gr1) self.gr1 = self.gr1.transpose(np.append(range(1,self.gr1.ndim), 0)) +targetMargin #print self.im1.data.shape self.im0Fine = diffeo.gridScalars(grid=self.im0) self.saveRate = 5 self.iter = 0 self.gradEps = -1 self.dim = self.im0.data.ndim self.setOutputDir(outputDir) self.maxIter = maxIter self.verb = verb self.testGradient = testGradient self.regweight = regWeight self.affine = affine affB = AffineBasis(self.dim, affine) self.affineDim = affB.affineDim self.affineBasis = affB.basis self.affineWeight = affineWeight * np.ones([self.affineDim, 1]) if (len(affB.rotComp) > 0) & (rotWeight != None): self.affineWeight[affB.rotComp] = rotWeight if (len(affB.simComp) > 0) & (scaleWeight != None): self.affineWeight[affB.simComp] = scaleWeight if (len(affB.transComp) > 0) & (transWeight != None): self.affineWeight[affB.transComp] = transWeight if param==None: self.param = ImageMatchingParam() else: self.param = param self.dim = self.param.dimension #self.x0 = self.fv0.vertices if Diffeons==None: gradIm0 = np.sqrt((diffeo.gradient(self.im0.data, self.im0.resol)**2).sum(axis=0)) m0 = stats.mquantiles(gradIm0, 0.75)/10. + 1e-5 if DecimationTarget==None: DecimationTarget = 1 gradIm0 = Img.filters.maximum_filter(gradIm0, DecimationTarget) I = range(templateMargin, self.im0.data.shape[0]-templateMargin, DecimationTarget) for k in range(1, self.im0.data.ndim): I = (I, range(templateMargin, self.im0.data.shape[k]-templateMargin, DecimationTarget)) u = np.meshgrid(*I, indexing='ij') self.c0 = np.zeros([u[0].size, self.dim]) for k in range(self.dim): self.c0[:,k] = u[k].flatten() # if self.dim == 1: # self.c0 = range(0, self.im0.data.shape[0], DecimationTarget) # elif self.dim == 2: # u = np.mgrid[0:self.im0.data.shape[0]:DecimationTarget, 0:self.im0.data.shape[1]:DecimationTarget] # self.c0 = np.zeros([u[0].size, self.dim]) # self.c0[:,0] = u[0].flatten() # self.c0[:,1] = u[1].flatten() # elif self.dim == 3: # u = np.mgrid[0:self.im0.data.shape[0]:DecimationTarget, 0:self.im0.data.shape[1]:DecimationTarget, 0:self.im0.data.shape[2]:DecimationTarget] # self.c0 = np.zeros([u[0].size, self.dim]) # self.c0[:,0] = u[0].flatten() # self.c0[:,1] = u[1].flatten() # self.c0[:,2] = u[2].flatten() gradIm0 = diffeo.multilinInterp(gradIm0, self.c0.T) #print gradIm0 jj = 0 for kk in range(self.c0.shape[0]): if gradIm0[kk] > m0: self.c0[jj, :] = self.c0[kk, :] jj += 1 self.c0 = self.c0[0:jj, :] print 'keeping ', jj, ' diffeons' #print self.im0.resol self.c0 = targetMargin - templateMargin + self.im0.origin + self.c0 * self.im0.resol self.S0 = np.tile( (DecimationTarget*np.diag(self.im0.resol)/2)**2, [self.c0.shape[0], 1, 1]) else: (self.c0, self.S0, self.idx) = Diffeons if zeroVar: self.S0 = np.zeros(self.S0.shape) #print self.c0 #print self.S0 if subsampleTemplate == None: subsampleTemplate = 1 self.im0.resol *= subsampleTemplate self.im0.data = Img.filters.median_filter(self.im0.data, size=subsampleTemplate) I = range(0, self.im0.data.shape[0], subsampleTemplate) II = range(0, self.im0.data.shape[0]) for k in range(1, self.im0.data.ndim): I = (I, range(0, self.im0.data.shape[k], subsampleTemplate)) II = (II, range(0, self.im0.data.shape[k])) self.gr0= np.array(np.meshgrid(*I, indexing='ij')) self.gr0Fine= np.array(np.meshgrid(*II, indexing='ij')) self.im0.data = diffeo.multilinInterp(self.im0.data, self.gr0) self.gr0 = self.gr0.transpose(np.append(range(1,self.gr0.ndim), 0)) self.gr0Fine = self.gr0Fine.transpose(np.append(range(1,self.gr0Fine.ndim), 0)) #print self.gr0.shape # if self.dim == 1: # self.im0.data = self.im0.data[0:self.im0.data.shape[0]:subsampleTemplate] # self.gr0 = range(self.im0.data.shape[0]) # elif self.dim == 2: # self.im0.data = self.im0.data[0:self.im0.data.shape[0]:subsampleTemplate, 0:self.im0.data.shape[1]:subsampleTemplate] # self.gr0 = np.mgrid[0:self.im0.data.shape[0], 0:self.im0.data.shape[1]].transpose((1, 2,0)) # elif self.dim == 3: # self.im0.data = self.im0.data[0:self.im0.data.shape[0]:subsampleTemplate, 0:self.im0.data.shape[1]:subsampleTemplate, 0:self.im0.data.shape[2]:subsampleTemplate] # self.gr0 = np.mgrid[0:self.im0.data.shape[0], 0:self.im0.data.shape[1], 0:self.im0.data.shape[2]].transpose((1,2, 3, 0)) self.gr0 = targetMargin-templateMargin+self.im1.origin + self.gr0 * self.im1.resol self.gr0Fine = targetMargin-templateMargin+self.im1.origin + self.gr0Fine * self.im1.resol self.J0 = np.log(self.im0.resol.prod()) * np.ones(self.im0.data.shape) self.ndf = self.c0.shape[0] self.Tsize = int(round(1.0/self.param.timeStep)) self.at = np.zeros([self.Tsize, self.c0.shape[0], self.dim]) self.atTry = np.zeros([self.Tsize, self.c0.shape[0], self.dim]) self.Afft = np.zeros([self.Tsize, self.affineDim]) self.AfftTry = np.zeros([self.Tsize, self.affineDim]) self.imt = np.tile(self.im0, np.insert(np.ones(self.dim), 0, self.Tsize+1)) self.Jt = np.tile(self.J0, np.insert(np.ones(self.dim), 0, self.Tsize+1)) self.grt = np.tile(self.gr0, np.insert(np.ones(self.dim+1), 0, self.Tsize+1)) self.ct = np.tile(self.c0, [self.Tsize+1, 1, 1]) self.St = np.tile(self.S0, [self.Tsize+1, 1, 1, 1]) print 'error type:', self.param.errorType self.obj = None self.objTry = None self.gradCoeff = self.ndf self.saveFile = saveFile self.gradIm1 = diffeo.gradient(self.im1.data, self.im1.resol) self.im0.saveImg(self.outputDir+'/Template.png', normalize=True) self.im1.saveImg(self.outputDir+'/Target.png', normalize=True)