1 from os import listdir as ls
4 from os.path import join
7 from topng import topng, mask, CROP_SIZE
8 from regularjson import search, RT_PATH, JSON_GTS, INFA_STR, EPI_STR, ENDO_STR
11 GLOB_DIR = '../../Data/Images_anonymous/'
12 OUT_DIR = './generated/90/'
15 START = None # to manage the number of Patient Case to use in training + validation, if START == None => 0, if END == None => last index, it will use all in GLOB_DIR
21 return sorted( ls(r) )
23 if __name__ == '__main__':
24 l = sorted(ls(GLOB_DIR))
27 wmin = hmin = None # None is important here, confert the 'minimum' algo
28 wmax = hmax = w = h = 0
30 for cas in l[START:END]:# cas like 'Case0002'
31 caspath = join(GLOB_DIR, cas)
33 if not INDICE_CASE in cas:# if the directory name doesn't sound familiar
36 l1 = sorted( ls( caspath ) )# just ls one CaseXXXX and sort the result
37 # $$NOTRUSTREF here we need to sort because there is no trusted ref or id
39 r = search(RT_PATH, cas)
41 print(cas, end=' ', flush=True) # log CaseXXXX
43 if not r: # if the feature doesn't yet labeled by an expert go to next
45 r = search(r['path'], '.') # to be more dynamic, here can just be '.' instead of '1.2.3.4.5.6'
50 l2 = sorted( ls(r) ) # $$NOTRUSTREF
51 except NotADirectoryError as e:
52 print("WARN", "a file in unexcepted place")
55 if 0 < len(l2) < len(l1):
57 l2 = sorted( ls(r) ) # $$NOTRUSTREF
58 # Try once : check subdirectory if i'am not the right
60 if 0 < len(l2) < len(l1):
61 # TODO: log, json doesn't match with images (labels != features)
62 print("WARN", "json doesn't match with images (labels != features), Case", cas)
66 for i, dic in enumerate(l1):
67 # print('join', r, l2[i])
68 ref = join(r, l2[i]) # logically, should be the json ref's "parent directory" of i dicom image
70 infarctus = search(ref, INFA_STR)
71 epimask = search(ref, EPI_STR)
72 endomask = search(ref, ENDO_STR)
73 # print("ref left:", l1[i]) # Testing..
74 # print("ref right:", ref) # Testing..
75 # print("infarctus:", infarctus) # Testing..
76 # topng(join(caspath, dic), '%/%-%' % (join(OUT_DIR, 'infarctus'), cas, dic)
77 # print('epimask', epimask)
79 if epimask:# this condition could be if necessary
80 # w, h = topng(join(caspath, dic), '{}/{}-{}'.format(join(OUT_DIR, 'infarctus' if infarctus else 'noinfarctus'), cas, dic), epimask=epimask['path'] if epimask else None)
81 # img_, dicimg_, minmax_ = topng(join(caspath, dic),
82 # '{}/{}-{}'.format(join(OUT_DIR, 'infarctus' if infarctus else 'noinfarctus'), cas, dic),
83 # epimask=epimask['path'] if epimask else None,
87 # Possibly data augmentation purpose here
90 outfile='{}/crop-mask/{}-{}'.format(join(OUT_DIR,
91 'infarctus' if infarctus else 'noinfarctus'),
95 epimask=epimask['path'] if epimask else None,
98 ) # crop and mask with black
103 outfile='{}/crop-mask-hollow/{}-{}'.format(join(OUT_DIR,
104 'infarctus' if infarctus else 'noinfarctus'),
108 epimask=epimask['path'] if epimask else None,
109 endomask=endomask['path'] if endomask else None,
110 centercrop=CROP_SIZE,
112 ) # crop and (mask and fill hollow) with black
116 outfile='{}/crop-nomask/{}-{}'.format(join(OUT_DIR,
117 'infarctus' if infarctus else 'noinfarctus'),
121 epimask=epimask['path'] if epimask else None,
122 centercrop=CROP_SIZE,
123 ) # just crop, don't apply black mask
126 # join(caspath, dic),
127 # outfile='{}/contour/{}-{}'.format(join(OUT_DIR,
128 # 'infarctus' if infarctus else 'noinfarctus'),
132 # epimask=epimask['path'] if epimask else None,
134 # ) # draw a red contour for visibily purpose
136 # segmentation width & height <<
137 # xmin, ymin, xmax, ymax = minmax_
138 # w = xmax - xmin + 1 # +1 : even the position takes a bit
139 # h = ymax - ymin + 1
140 # segmentation width & height >>
144 # if wmax < w: wmax = w
145 # if hmax < h: hmax = h
147 # # search width minimum
148 # if wmin is None: wmin = w
149 # elif wmin > w: wmin = w
151 # # search height minimum
152 # if hmin is None: hmin = h
153 # elif hmin > h: hmin = h
156 # print('min-width, max-width:', (wmin, wmax))
157 # print('min-height, max-height:', (hmin, hmax))