|
a |
|
b/code/p1processing.py |
|
|
1 |
import os |
|
|
2 |
import numpy as np |
|
|
3 |
from multiprocessing import Pool |
|
|
4 |
from functools import partial |
|
|
5 |
from image_utils import * |
|
|
6 |
|
|
|
7 |
|
|
|
8 |
def output2DRefinement(atlases, DLSeg, param_dir, tmps_dir, dofs_dir, subject_dir, savedInd, fr, mirtk): |
|
|
9 |
|
|
|
10 |
segstring = '' |
|
|
11 |
ind = 0 |
|
|
12 |
atlasUsedNo = len(atlases) |
|
|
13 |
|
|
|
14 |
for i in range(atlasUsedNo): |
|
|
15 |
|
|
|
16 |
if mirtk: |
|
|
17 |
os.system('mirtk register ' |
|
|
18 |
'{0} ' |
|
|
19 |
'{1} ' |
|
|
20 |
'-parin {2}/ffd_label_.cfg ' |
|
|
21 |
'-dofin {3}/shapelandmarks_{4}.dof.gz ' |
|
|
22 |
'-dofout {3}/shapeffd_{5}_{6}.dof.gz' |
|
|
23 |
.format(DLSeg, atlases[i], param_dir, dofs_dir, savedInd[i], i, fr)) |
|
|
24 |
|
|
|
25 |
os.system('mirtk transform-image ' |
|
|
26 |
'{0} ' |
|
|
27 |
'{1}/seg_lvsa_{4}_{5}.nii.gz ' |
|
|
28 |
'-dofin {2}/shapeffd_{4}_{5}.dof.gz ' |
|
|
29 |
'-target {3}/lvsa_{5}.nii.gz -interp NN' |
|
|
30 |
.format(atlases[i], tmps_dir, dofs_dir, subject_dir, i, fr)) |
|
|
31 |
|
|
|
32 |
else: |
|
|
33 |
os.system('nreg ' |
|
|
34 |
'{0} ' |
|
|
35 |
'{1} ' |
|
|
36 |
'-parin {2}/segreg.txt ' |
|
|
37 |
'-dofin {3}/shapelandmarks_{4}.dof.gz ' |
|
|
38 |
'-dofout {3}/shapeffd_{5}_{6}.dof.gz' |
|
|
39 |
.format(DLSeg, atlases[i], param_dir, dofs_dir, savedInd[i], i, fr)) |
|
|
40 |
|
|
|
41 |
os.system('transformation ' |
|
|
42 |
'{0} ' |
|
|
43 |
'{1}/seg_lvsa_{4}_{5}.nii.gz ' |
|
|
44 |
'-dofin {2}/shapeffd_{4}_{5}.dof.gz ' |
|
|
45 |
'-target {3}/lvsa_{5}.nii.gz -nn' |
|
|
46 |
.format(atlases[i], tmps_dir, dofs_dir, subject_dir, i, fr)) |
|
|
47 |
|
|
|
48 |
segstring += '{0}/seg_lvsa_{1}_{2}.nii.gz '.format(tmps_dir, i, fr) |
|
|
49 |
|
|
|
50 |
ind += 1 |
|
|
51 |
|
|
|
52 |
# apply label fusion |
|
|
53 |
os.system('combineLabels {0}/seg_lvsa_{1}.nii.gz {2} {3}'.format(subject_dir, fr, ind, segstring)) |
|
|
54 |
|
|
|
55 |
|
|
|
56 |
def apply_PC(subject, data_dir, param_dir, atlases_list, landmarks_list, mirtk): |
|
|
57 |
|
|
|
58 |
print(' registering {0}'.format(subject)) |
|
|
59 |
|
|
|
60 |
subject_dir = os.path.join(data_dir, subject) |
|
|
61 |
|
|
|
62 |
if os.path.isdir(subject_dir): |
|
|
63 |
|
|
|
64 |
tmps_dir = '{0}/tmps'.format(subject_dir) |
|
|
65 |
|
|
|
66 |
dofs_dir = '{0}/dofs'.format(subject_dir) |
|
|
67 |
|
|
|
68 |
segs_dir = '{0}/segs'.format(subject_dir) |
|
|
69 |
|
|
|
70 |
subject_landmarks = '{0}/landmarks.vtk'.format(subject_dir) |
|
|
71 |
|
|
|
72 |
for fr in ['ED', 'ES']: |
|
|
73 |
|
|
|
74 |
DLSeg = '{0}/seg_lvsa_{1}.nii.gz'.format(segs_dir, fr) |
|
|
75 |
|
|
|
76 |
if not os.path.exists(DLSeg): |
|
|
77 |
|
|
|
78 |
print(' segmentation {0} does not exist. Skip.'.format(DLSeg)) |
|
|
79 |
|
|
|
80 |
continue |
|
|
81 |
|
|
|
82 |
topSimilarAtlases_list, savedInd = topSimilarAtlasShapeSelection(atlases_list[fr], landmarks_list[fr], |
|
|
83 |
subject_landmarks, tmps_dir, dofs_dir, DLSeg, param_dir, 3) |
|
|
84 |
|
|
|
85 |
output2DRefinement(topSimilarAtlases_list, DLSeg, param_dir, tmps_dir, dofs_dir, subject_dir, savedInd, fr, mirtk) |
|
|
86 |
|
|
|
87 |
refineFusionResults(subject_dir, 'seg_lvsa_{0}.nii.gz'.format(fr), 2) |
|
|
88 |
|
|
|
89 |
print(' finish 2D nonrigid-registering one subject {}'.format(subject)) |
|
|
90 |
|
|
|
91 |
else: |
|
|
92 |
print(' {0} is not a valid directory, do nothing'.format(subject_dir)) |
|
|
93 |
|
|
|
94 |
|
|
|
95 |
def multiatlasreg2D(dir_0, dir_1, dir_2, coreNo, parallel, mirtk): |
|
|
96 |
|
|
|
97 |
print('Select all the shape atlases for 2D multi-atlas registration') |
|
|
98 |
|
|
|
99 |
atlases_list, landmarks_list = allAtlasShapeSelection(dir_1) |
|
|
100 |
|
|
|
101 |
if parallel: |
|
|
102 |
|
|
|
103 |
print('Start 2D multi-atlas registration and program running on {0} cores'.format(coreNo)) |
|
|
104 |
|
|
|
105 |
pool = Pool(processes = coreNo) |
|
|
106 |
|
|
|
107 |
# partial only in Python 2.7+ |
|
|
108 |
pool.map(partial(apply_PC, |
|
|
109 |
data_dir=dir_0, |
|
|
110 |
param_dir=dir_2, |
|
|
111 |
atlases_list=atlases_list, |
|
|
112 |
landmarks_list=landmarks_list, |
|
|
113 |
mirtk=mirtk), |
|
|
114 |
sorted(os.listdir(dir_0))) |
|
|
115 |
|
|
|
116 |
else: |
|
|
117 |
|
|
|
118 |
print('Start 2D multi-atlas registration and program running subsequently') |
|
|
119 |
|
|
|
120 |
data_dir, param_dir = dir_0, dir_2 |
|
|
121 |
|
|
|
122 |
for subject in sorted(os.listdir(data_dir)): |
|
|
123 |
|
|
|
124 |
print(' registering {0}'.format(subject)) |
|
|
125 |
|
|
|
126 |
subject_dir = os.path.join(data_dir, subject) |
|
|
127 |
|
|
|
128 |
if not os.path.isdir(subject_dir): |
|
|
129 |
|
|
|
130 |
print(' {0} is not a valid folder, Skip'.format(subject_dir)) |
|
|
131 |
|
|
|
132 |
continue |
|
|
133 |
|
|
|
134 |
tmps_dir = '{0}/tmps'.format(subject_dir) |
|
|
135 |
|
|
|
136 |
dofs_dir = '{0}/dofs'.format(subject_dir) |
|
|
137 |
|
|
|
138 |
segs_dir = '{0}/segs'.format(subject_dir) |
|
|
139 |
|
|
|
140 |
subject_landmarks = '{0}/landmarks.vtk'.format(subject_dir) |
|
|
141 |
|
|
|
142 |
for fr in ['ED', 'ES']: |
|
|
143 |
|
|
|
144 |
DLSeg = '{0}/seg_lvsa_{1}.nii.gz'.format(segs_dir, fr) |
|
|
145 |
|
|
|
146 |
if not os.path.exists(DLSeg): |
|
|
147 |
|
|
|
148 |
print(' segmentation {0} does not exist. Skip.'.format(DLSeg)) |
|
|
149 |
|
|
|
150 |
continue |
|
|
151 |
|
|
|
152 |
topSimilarAtlases_list, savedInd = topSimilarAtlasShapeSelection(atlases_list[fr], landmarks_list[fr], |
|
|
153 |
subject_landmarks, tmps_dir, dofs_dir, DLSeg, param_dir, 3) |
|
|
154 |
|
|
|
155 |
output2DRefinement(topSimilarAtlases_list, DLSeg, param_dir, tmps_dir, dofs_dir, subject_dir, savedInd, fr, mirtk) |
|
|
156 |
|
|
|
157 |
refineFusionResults(subject_dir, 'seg_lvsa_{0}.nii.gz'.format(fr), 2) |
|
|
158 |
|
|
|
159 |
|
|
|
160 |
print(' finish 2D nonrigid-registering one subject {}'.format(subject)) |
|
|
161 |
|