Skip to content

Commit 6f68088

Browse files
authored
Add files via upload
1 parent 74dc516 commit 6f68088

File tree

2 files changed

+170
-0
lines changed

2 files changed

+170
-0
lines changed

functions_baffle planner.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
2+
def subtract():
3+
"""
4+
Subtracts the skull (first segment) from the baffle (second segment)
5+
"""
6+
masterVolumeNode = slicer.mrmlScene.GetNthNodeByClass(0, 'vtkMRMLScalarVolumeNode')
7+
segmentationNode = slicer.mrmlScene.GetNthNodeByClass(0, 'vtkMRMLSegmentationNode')
8+
segmentationNode.CreateDefaultDisplayNodes() # only needed for display
9+
segmentationNode.SetReferenceImageGeometryParameterFromVolumeNode(masterVolumeNode)
10+
# Create segment editor to get access to effects
11+
segmentEditorWidget = slicer.qMRMLSegmentEditorWidget()
12+
segmentEditorWidget.setMRMLScene(slicer.mrmlScene)
13+
segmentEditorNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentEditorNode")
14+
segmentEditorWidget.setMRMLSegmentEditorNode(segmentEditorNode)
15+
segmentEditorWidget.setSegmentationNode(segmentationNode)
16+
segmentEditorWidget.setMasterVolumeNode(masterVolumeNode)
17+
#getnames
18+
bafflename = segmentationNode.GetSegmentation().GetNthSegment(1).GetName()#get name of baffle
19+
skullname = segmentationNode.GetSegmentation().GetNthSegment(0).GetName()#get name of skull
20+
##run subtaction
21+
segmentEditorWidget.setActiveEffectByName('Logical operators')
22+
effect = segmentEditorWidget.activeEffect()
23+
segmentEditorNode.SetSelectedSegmentID(bafflename)######perform operations
24+
effect.setParameter("Operation", "SUBTRACT")
25+
effect.setParameter("ModifierSegmentID", skullname)#subtract this selection
26+
effect.self().onApply()
27+
#remove segment editor connection
28+
segmentEditorWidget = None
29+
slicer.mrmlScene.RemoveNode(segmentEditorNode)
30+
31+
32+
def smooth(mm):
33+
"""
34+
Smooth the baffle (the second segment) using median smoothing. Takes an argument in mm.
35+
"""
36+
masterVolumeNode = slicer.mrmlScene.GetNthNodeByClass(0, 'vtkMRMLScalarVolumeNode')
37+
segmentationNode = slicer.mrmlScene.GetNthNodeByClass(0, 'vtkMRMLSegmentationNode')
38+
segmentationNode.CreateDefaultDisplayNodes() # only needed for display
39+
segmentationNode.SetReferenceImageGeometryParameterFromVolumeNode(masterVolumeNode)
40+
# Create segment editor to get access to effects
41+
segmentEditorWidget = slicer.qMRMLSegmentEditorWidget()
42+
segmentEditorWidget.setMRMLScene(slicer.mrmlScene)
43+
segmentEditorNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentEditorNode")
44+
segmentEditorWidget.setMRMLSegmentEditorNode(segmentEditorNode)
45+
segmentEditorWidget.setSegmentationNode(segmentationNode)
46+
segmentEditorWidget.setMasterVolumeNode(masterVolumeNode)
47+
#getnames of segments in segmentation
48+
bafflename = segmentationNode.GetSegmentation().GetNthSegment(1).GetName()#get name of baffle
49+
skullname = segmentationNode.GetSegmentation().GetNthSegment(0).GetName()#get name of skull
50+
##run Smoothing
51+
segmentEditorWidget.setActiveEffectByName("Smoothing")
52+
effect = segmentEditorWidget.activeEffect()
53+
segmentEditorNode.SetSelectedSegmentID(bafflename)
54+
effect.setParameter("SmoothingMethod", "MEDIAN")
55+
effect.setParameter("KernelSizeMm", mm)
56+
effect.self().onApply()
57+
#remove segment editor connection
58+
segmentEditorWidget = None
59+
slicer.mrmlScene.RemoveNode(segmentEditorNode)
60+
61+
62+
def connect():
63+
"""
64+
Connects the segmentation and volume nodes together in preparation for subsequent functions. Adds a segmentation node to the scene
65+
"""
66+
global masterVolumeNode
67+
#Connect the volumes and segmentation to allow programatic access to model-segmentation conversion and segmentation effects
68+
masterVolumeNode = slicer.mrmlScene.GetNthNodeByClass(0, 'vtkMRMLScalarVolumeNode')#detects the first scalar volume
69+
global segmentationNode
70+
segmentationNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentationNode")
71+
segmentationNode.CreateDefaultDisplayNodes() # only needed for display
72+
segmentationNode.SetReferenceImageGeometryParameterFromVolumeNode(masterVolumeNode)
73+
74+
def modelToSeg():
75+
"""
76+
Converts model and baffle to segmentations. Takes the first and second models in the scene (besides from the 3 slice models already present in the
77+
scene by default). Skull should be the first model, baffle the second.
78+
"""
79+
modelskull = slicer.mrmlScene.GetNthNodeByClass(3, 'vtkMRMLModelNode')
80+
modelbaffle = slicer.mrmlScene.GetNthNodeByClass(4, 'vtkMRMLModelNode')
81+
# Import the model into the segmentation node
82+
slicer.modules.segmentations.logic().ImportModelToSegmentationNode(modelskull, segmentationNode)
83+
slicer.modules.segmentations.logic().ImportModelToSegmentationNode(modelbaffle, segmentationNode)
84+
85+
86+
def seg_to_obj(path, segmentationNode):
87+
"""
88+
Convert baffle to obj. Converts the second segmentation. Takes as arguments the name of the segmentation("Segmentation" by default), and saves an obj file as the name of the segmentation .
89+
Example usage: seg_to_obj("c:/tmp", "Segmentation")
90+
"""
91+
segmentationNode = getNode(segmentationNode)
92+
bafflename = segmentationNode.GetSegmentation().GetNthSegment(1).GetName()#get name of baffle
93+
segmentIds = vtk.vtkStringArray()
94+
segmentIds.InsertNextValue(bafflename)
95+
# Write to STL file
96+
slicer.vtkSlicerSegmentationsModuleLogic.ExportSegmentsClosedSurfaceRepresentationToFiles(path, segmentationNode, segmentIds, "OBJ")
97+

load_dicom_modified_otsu.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
loadedNodeIDs = [] # this list will contain the list of all loaded node IDs
2+
3+
4+
#Imports the necessary libraries and modules for loading DICOM files and creating a surface mesh from a volume node using CLI module.
5+
import argparse
6+
import DICOMLib.DICOMUtils as utils
7+
import DICOMScalarVolumePlugin
8+
9+
10+
#Create command line arguments using argparse module and then parses them using parse_args() method.
11+
parser = argparse.ArgumentParser(description='Load dicom')
12+
parser.add_argument('-f', '--folder', type=str, help='DICOM FOLDER PATH', required=True)
13+
args = parser.parse_args()
14+
15+
#Use DICOMScalarVolumePlugin module to load the scalar volume reader.
16+
from DICOMLib import DICOMUtils
17+
with DICOMUtils.TemporaryDICOMDatabase() as db:
18+
DICOMUtils.importDicom(args.folder, db)
19+
patientUIDs = db.patients()
20+
for patientUID in patientUIDs:
21+
loadedNodeIDs.extend(DICOMUtils.loadPatientByUID(patientUID))
22+
23+
24+
25+
#Creates a surface mesh from volume node using CLI module grayscale model maker. Threshold is set as a parameter
26+
#Adds ' skull' to the name of the volume as name of model
27+
def modelFromVolume(thresh):
28+
"""Create surface mesh from volume node using CLI module"""
29+
global volumeNode
30+
volumeNode = slicer.mrmlScene.GetNthNodeByClass(0,"vtkMRMLScalarVolumeNode")
31+
# Set parameters
32+
parameters = {}
33+
parameters["InputVolume"] = volumeNode
34+
parameters["Threshold"] = thresh
35+
global outputModelNode
36+
outputModelNode = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLModelNode")
37+
outputModelNode.SetName(volumeNode.GetName()+' skull')
38+
volumeNode.GetName()
39+
parameters["OutputGeometry"] = outputModelNode
40+
# Execute
41+
grayMaker = slicer.modules.grayscalemodelmaker
42+
cliNode = slicer.cli.runSync(grayMaker, None, parameters)
43+
# Process results
44+
if cliNode.GetStatus() & cliNode.ErrorsMask:
45+
# error
46+
errorText = cliNode.GetErrorText()
47+
slicer.mrmlScene.RemoveNode(cliNode)
48+
raise ValueError("CLI execution failed: " + errorText)
49+
# success
50+
slicer.mrmlScene.RemoveNode(cliNode)
51+
return outputModelNode
52+
53+
54+
#get otsu threshold
55+
masterVolumeNode = slicer.mrmlScene.GetNthNodeByClass(0, 'vtkMRMLScalarVolumeNode')
56+
import vtkITK
57+
Otsu_thresholdCalculator = vtkITK.vtkITKImageThresholdCalculator()
58+
Otsu_thresholdCalculator.SetInputData(masterVolumeNode.GetImageData())
59+
Otsu_thresholdCalculator.SetMethodToOtsu()
60+
Otsu_thresholdCalculator.Update()
61+
Otsuval = Otsu_thresholdCalculator.GetThreshold()
62+
#print('Otsu threshold is: ' + Otsuval)
63+
#get max value in volume
64+
otsu_int = int(Otsuval)
65+
print("Otsu threshold is:")
66+
print(otsu_int)
67+
68+
try:
69+
modelFromVolume(otsu_int)
70+
except:
71+
print("failed to create model")
72+
73+

0 commit comments

Comments
 (0)