register.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import slicer
  2. import cardiacSPECT
  3. #must have SlicerElastix extension installed
  4. import Elastix
  5. import slicerNetwork
  6. mirID='2SBMIR'
  7. obrID='2SMobr'
  8. configFile=os.path.join(os.path.expanduser('~'),'.cardiacSPECT','register.json')
  9. dataManager=cardiacSPECT.cardiacSPECTLogic(configFile)
  10. network=slicerNetwork.labkeyURIHandler()
  11. #parseConfig if a different location than default is chosen
  12. #network.parseConfig(remote.json)
  13. #network.initRemote()
  14. dataManager.setURIHandler(network)
  15. dataManager.loadPatient(mirID)
  16. dataManager.loadPatient(obrID)
  17. elastix=Elastix.ElastixLogic()
  18. registrationIndex=12
  19. """
  20. index 12 corresponds to:
  21. ['par0015', '3D CT, monomodal', 'lung',
  22. 'intrapatient; B-spline transformation; several similarity metrics',
  23. 'Staring (2013), Towards Local Progression Estimation of Pulmonary Emphysema using CT',
  24. ['Parameters.Par0015.expA.patient.NC.affine.txt', 'Parameters.Par0015.expA.patient.NC.bspline.txt']]
  25. """
  26. RegistrationPresets_ParameterFilenames=5
  27. parameterFilenames = elastix.getRegistrationPresets()[registrationIndex][RegistrationPresets_ParameterFilenames]
  28. fixedVolumeNode=slicer.util.getFirstNodeByName(mirID+'CT')
  29. movingVolumeNode=slicer.util.getFirstNodeByName(obrID+'CT')
  30. transformNodeName=obrID+'_DF'
  31. transformNodeFile=outPath=os.path.join(os.path.expanduser('~'),'temp',transformNodeName+'.h5')
  32. ok, transformNode= slicer.util.loadTransform(transformNodeFile,returnNode=True)
  33. if not ok:
  34. transformNode=slicer.vtkMRMLTransformNode()
  35. transformNode.SetName(transformNodeName) # a bspline transform node
  36. slicer.mrmlScene.AddNode(transformNode)
  37. elastix.registerVolumes(fixedVolumeNode, movingVolumeNode,
  38. parameterFilenames = parameterFilenames,
  39. outputVolumeNode = None,
  40. outputTransformNode = transformNode,
  41. fixedVolumeMaskNode = None,
  42. movingVolumeMaskNode = None)
  43. #recent elastix version
  44. #forceDisplacementFieldOutputTransform = 1)
  45. slicer.util.saveNode(transformNode,transformNodeFile)
  46. #already a grid transform node
  47. #gridTransformNode=slicer.modules.transforms.logic().ConvertToGridTransform(transformNode, fixedVolumeNode)
  48. dataManager.applyTransform(obrID,mirID,0,19)
  49. dataManager.storeVolumeNodes(obrID,0,19)
  50. dataManager.storeVolumeNodes(mirID,0,19)
  51. dataManager.storeTransformation(obrID)
  52. quit()