register.py 2.3 KB

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