-
-
Save lassoan/2d5a5b73645f65a5eb6f8d5f97abf31b to your computer and use it in GitHub Desktop.
# Generate input data | |
################################################ | |
import SampleData | |
# Load master volume | |
sampleDataLogic = SampleData.SampleDataLogic() | |
masterVolumeNode = sampleDataLogic.downloadMRBrainTumor1() | |
# Create segmentation | |
segmentationNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentationNode") | |
segmentationNode.CreateDefaultDisplayNodes() # only needed for display | |
segmentationNode.SetReferenceImageGeometryParameterFromVolumeNode(masterVolumeNode) | |
# Create seed segment inside tumor | |
tumorSeed = vtk.vtkSphereSource() | |
tumorSeed.SetCenter(-6, 30, 28) | |
tumorSeed.SetRadius(10) | |
tumorSeed.Update() | |
segmentationNode.AddSegmentFromClosedSurfaceRepresentation(tumorSeed.GetOutput(), "Tumor", [1.0,0.0,0.0]) | |
# Create seed segment outside tumor | |
backgroundSeedPositions = [[0,65,32], [1, -14, 30], [0, 28, -7], [0,30,64], [31, 33, 27], [-42, 30, 27]] | |
append = vtk.vtkAppendPolyData() | |
for backgroundSeedPosition in backgroundSeedPositions: | |
backgroundSeed = vtk.vtkSphereSource() | |
backgroundSeed.SetCenter(backgroundSeedPosition) | |
backgroundSeed.SetRadius(10) | |
backgroundSeed.Update() | |
append.AddInputData(backgroundSeed.GetOutput()) | |
append.Update() | |
backgroundSegmentId = segmentationNode.AddSegmentFromClosedSurfaceRepresentation(append.GetOutput(), "Background", [0.0,1.0,0.0]) | |
# Run filter | |
################################################ | |
# Create segment editor to get access to effects | |
segmentEditorWidget = slicer.qMRMLSegmentEditorWidget() | |
# To show segment editor widget (useful for debugging): segmentEditorWidget.show() | |
segmentEditorWidget.setMRMLScene(slicer.mrmlScene) | |
segmentEditorNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentEditorNode") | |
segmentEditorWidget.setMRMLSegmentEditorNode(segmentEditorNode) | |
segmentEditorWidget.setSegmentationNode(segmentationNode) | |
segmentEditorWidget.setMasterVolumeNode(masterVolumeNode) | |
# Run segmentation | |
segmentEditorWidget.setActiveEffectByName("Grow from seeds") | |
effect = segmentEditorWidget.activeEffect() | |
# You can change parameters by calling: effect.setParameter("MyParameterName", someValue) | |
# Most effect don't have onPreview, you can just call onApply | |
effect.self().onPreview() | |
effect.self().onApply() | |
# Clean up and show results | |
################################################ | |
# Clean up | |
slicer.mrmlScene.RemoveNode(segmentEditorNode) | |
# Make segmentation results nicely visible in 3D | |
segmentationDisplayNode = segmentationNode.GetDisplayNode() | |
segmentationDisplayNode.SetSegmentVisibility(backgroundSegmentId, False) |
Thanks for making this, would there be a way to manually paint the seeds and then run the script using the painted seeds?
Yes, of course. You can then simply use Segment Editor module in 3D Slicer and the "Grow from seeds" effect. See a simple example here: https://youtu.be/cybL5A0w3hw
what are the best segmentation methods of maxillary bone?
@DrMohamedAssadawy please post this question on the Slicer Forum.
When I run this code using my own CT data, there is an error as follows. How can I solve it?
File "qt-scripted-modules\SegmentEditorEffects\AbstractScriptedSegmentEditorAutoCompleteEffect.py", line 301, in onApply
previewContainsClosedSurfaceRepresentation = previewNode.GetSegmentation().ContainsRepresentation(
AttributeError: 'NoneType' object has no attribute 'GetSegmentation'
This is a code snippet, not a module, so you cannot load it as a module (it has not GUI, so if you replace a module with this script then the previous module GUI will disappear and nothing will be displayed instead).
The quickest is to copy-paste the code from here to Slicer's Python console. If you want to edit/rerun it with different parameters then I would recommend to use Jupyter notebooks with Slicer chosen as kernel.