Last active
May 26, 2023 19:12
-
-
Save xxxiNAIxxx/544be2f1ef2ad63a44fd38d43ab54760 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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