-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgenerate_seg.py
135 lines (103 loc) · 4.25 KB
/
generate_seg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# generates the segmentation file in the nifti format for each color (if present) (RGBY) and saves it in the specified folder
# this script requires 3D-slicer and should be placed in the same directory where 3D-slicer is installed
# please refer to the documentation of 3D-slicer for more details
# imports
import slicer
import os
from natsort import natsorted
import shutil
# functions
def load_model(path):
bone_model = slicer.util.loadModel(path)
bone_model_name = bone_model.GetName()
if "blue" in bone_model_name:
bone_model.GetDisplayNode().SetColor(0, 0, 1)
elif "green" in bone_model_name:
bone_model.GetDisplayNode().SetColor(0, 1, 0)
elif "red" in bone_model_name:
bone_model.GetDisplayNode().SetColor(1, 0, 0)
elif "yellow" in bone_model_name:
bone_model.GetDisplayNode().SetColor(1, 1, 0)
bone_model.GetDisplayNode().SetVisibility(False)
return bone_model
def load_volume(path):
ct_volume_node = slicer.util.loadVolume(path)
return ct_volume_node
def create_new_segmentation(segmentation_name):
new_segmentation_node = slicer.vtkMRMLSegmentationNode()
new_segmentation_node.SetName(segmentation_name)
slicer.mrmlScene.AddNode(new_segmentation_node)
new_segmentation_node.CreateDefaultDisplayNodes()
return new_segmentation_node
def import_model_to_segmentation(model, segmentation_node):
import_bool = slicer.modules.segmentations.logic().ImportModelToSegmentationNode(
slicer.util.getNode(model.GetName()), segmentation_node
)
if import_bool:
print("Successful import of model to segmentation!")
slicer.mrmlScene.RemoveNode(model)
else:
raise ImportError("Unsucessful import of model to segmentation")
return segmentation_node
def export_to_labelmapvol(segmentation_node, ref_vol, labelmap_vol_name):
new_labelmap_vol_node = slicer.mrmlScene.AddNewNodeByClass(
"vtkMRMLLabelMapVolumeNode"
)
new_labelmap_vol_node.SetName(labelmap_vol_name)
slicer.modules.segmentations.logic().ExportVisibleSegmentsToLabelmapNode(
segmentation_node, new_labelmap_vol_node, ref_vol
)
print("Exported to labelmap volume!")
return new_labelmap_vol_node
def save_node(labelmap_vol, save_filepath):
slicer.util.saveNode(
slicer.util.getNode(labelmap_vol.GetName()), (save_filepath + ".nii")
)
print("Labelmap volume saved!")
def clear_console():
slicer.app.pythonConsole().clear()
def clear_scene():
slicer.mrmlScene.Clear(0)
# main
def main():
clear_console()
clear_scene()
slicer.util.selectModule("Data")
default_path = "D:\\process\\test"
ctscan_folders = natsorted(
[
i
for i in os.listdir(default_path)
if (not i.endswith("DS_Store")) and (not i.endswith("csv"))
]
)
for folder_num in ctscan_folders:
print(f"Running CT_scan: {folder_num}")
# files and filepaths
ctvol_path = os.path.join(default_path, folder_num)
ct_file = [i for i in os.listdir(ctvol_path) if i.endswith(".nii.gz")]
ct_path = [os.path.join(ctvol_path, i) for i in ct_file]
stl_files = natsorted([i for i in os.listdir(ctvol_path) if i.endswith(".stl")])
stl_paths = natsorted([os.path.join(ctvol_path, i) for i in stl_files])
# processing
ct_vol_node = load_volume(ct_path[0])
models = [load_model(i) for i in stl_paths]
ct_segmentation_name = ct_file[0].split(".")[-3] + "_seg"
ct_segmentation = create_new_segmentation(ct_segmentation_name)
for i in models:
ct_segmentation = import_model_to_segmentation(i, ct_segmentation)
ct_segmentation.GetDisplayNode().SetVisibility(False)
labelmap_vol_node = export_to_labelmapvol(
ct_segmentation, ct_vol_node, ct_segmentation_name
)
save_node(
labelmap_vol_node, os.path.join(ctvol_path, ct_segmentation_name + ".nii")
)
print(f"Success!\n")
src_dir = ctvol_path
tgt_dir = "D:\\process\\labelmap_vol_done\\"
shutil.move(src_dir, tgt_dir)
print(f"\nFinished: {folder_num}!")
print("------------------------------------------------------------\n")
if __name__ == "__main__":
main()