Skip to content

Instantly share code, notes, and snippets.

@xxxiNAIxxx
Last active May 26, 2023 19:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xxxiNAIxxx/544be2f1ef2ad63a44fd38d43ab54760 to your computer and use it in GitHub Desktop.
Save xxxiNAIxxx/544be2f1ef2ad63a44fd38d43ab54760 to your computer and use it in GitHub Desktop.
import os
import sys
import logging
import datetime
import slicer
import labels
from dotenv import load_dotenv
from pathlib import Path
from DICOMLib import DICOMUtils
def clear_scene():
"""Clear slicer scene"""
slicer.mrmlScene.Clear(0)
def load_dicom(dicomDataDir):
"""Load *.dcm to scene as volume"""
loadedNodeIDs = [] # this list will contain the list of all loaded node IDs
with DICOMUtils.TemporaryDICOMDatabase() as db:
DICOMUtils.importDicom(dicomDataDir, db)
patientUIDs = db.patients()
for patientUID in patientUIDs:
loadedNodeIDs.extend(DICOMUtils.loadPatientByUID(patientUID))
return loadedNodeIDs[0]
def get_avalible_labels_list(labelsPath):
"""Return labels list which avalibale in folder"""
f_files=[]
for root, dirs, file in os.walk(labelsPath):
for f in file:
f_files.append(root+'\\'+f)
return f_files
def create_segment_editor_widget(segmentationNode, masterVolumeNode, show:bool=False):
"""Create segmentEditorWidget"""
segmentEditorWidget = slicer.qMRMLSegmentEditorWidget()
if show:
segmentEditorWidget.show()
segmentEditorWidget.setMRMLScene(slicer.mrmlScene)
segmentEditorNode = slicer.vtkMRMLSegmentEditorNode()
slicer.mrmlScene.AddNode(segmentEditorNode)
segmentEditorWidget.setMRMLSegmentEditorNode(segmentEditorNode)
segmentEditorWidget.setSegmentationNode(segmentationNode)
segmentEditorWidget.setSourceVolumeNode(slicer.mrmlScene.GetNodeByID(masterVolumeNode))
return segmentEditorWidget
def create_segmentation_node():
"""Create segmentationNode"""
segmentationNode=slicer.mrmlScene.AddNewNodeByClass("vtkMRMLSegmentationNode")
# segmentationNode.CreateDefaultDisplayNodes() # only needed for display
return segmentationNode
def fill_background(segmentationNode, segmentEditorWidget, maskedVolume):
segment = segmentationNode.GetSegmentation().AddEmptySegment("background")
segmentEditorWidget.setCurrentSegmentID(segment)
segmentEditorWidget.setActiveEffectByName("Mask volume")
effect = segmentEditorWidget.activeEffect()
effect.setParameter("Operation", "FILL_OUTSIDE")
effect.setParameter("FillValue", '0')
effect.self().outputVolumeSelector.setCurrentNode(maskedVolume)
effect.self().onApply()
def load_avalible_labels(labels_stl_path, segmentationNode):
for label in labels_stl_path:
modelNode = slicer.modules.models.logic().AddModel(label)
slicer.modules.segmentations.logic().ImportModelToSegmentationNode(modelNode, segmentationNode)
# slicer.mrmlScene.RemoveNode(modelNode)
def fill_avalible_labels(segmentationNode,segmentEditorWidget,maskedVolume):
segmentList=[]
segmentationNode.GetSegmentation().GetSegmentIDs(segmentList)
segmentEditorWidget.setActiveEffectByName("Mask volume")
effect = segmentEditorWidget.activeEffect()
effect.self().inputVolumeSelector.setCurrentNode(maskedVolume)
effect.self().outputVolumeSelector.setCurrentNode(maskedVolume)
for segment in segmentList:
if segment == 'background':
continue
scalar_value = labels.get_label_scalar_value(segment)
segmentEditorWidget.setCurrentSegmentID(segment)
effect.setParameter("Operation", "FILL_INSIDE")
effect.setParameter("FillValue", str(scalar_value))
effect.self().onApply()
def main(uuid_path, stl_label_path):
clear_scene()
masterVolumeNode = load_dicom(uuid_path)
maskedVolume = slicer.mrmlScene.AddNewNodeByClass("vtkMRMLScalarVolumeNode", "Temporary masked volume")
segmentationNode = create_segmentation_node()
segmentEditorWidget = create_segment_editor_widget(segmentationNode, masterVolumeNode)
fill_background(segmentationNode, segmentEditorWidget, maskedVolume)
labels_stl_path = get_avalible_labels_list(stl_label_path)
load_avalible_labels(labels_stl_path, segmentationNode)
fill_avalible_labels(segmentationNode,segmentEditorWidget,maskedVolume)
slicer.util.exportNode(maskedVolume, stl_label_path+"\\multilabel.nii.gz", {"useCompression": 1})
uuid_path='c:\\Users\\xxxiN\\Documents\\tests\\original\\e1'
stl_label_path='c:\\Users\\xxxiN\\Documents\\tests\\Labels\\e1'
main(uuid_path, stl_label_path)
# sys.exit('0')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment