-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpreprocess.py
76 lines (60 loc) · 2.45 KB
/
preprocess.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
import os
import numpy as np
import medpy.io as medio
src_path = 'xxx/MICCAI_BraTS2020_TrainingData'
tar_path = 'xxx/BraTS20/Train_npy'
name_list = os.listdir(src_path)
def sup_128(xmin, xmax):
if xmax - xmin < 128:
print ('#' * 100)
ecart = int((128-(xmax-xmin))/2)
xmax = xmax+ecart+1
xmin = xmin-ecart
if xmin < 0:
xmax-=xmin
xmin=0
return xmin, xmax
def crop(vol):
if len(vol.shape) == 4:
vol = np.amax(vol, axis=0)
assert len(vol.shape) == 3
x_dim, y_dim, z_dim = tuple(vol.shape)
x_nonzeros, y_nonzeros, z_nonzeros = np.where(vol != 0)
x_min, x_max = np.amin(x_nonzeros), np.amax(x_nonzeros)
y_min, y_max = np.amin(y_nonzeros), np.amax(y_nonzeros)
z_min, z_max = np.amin(z_nonzeros), np.amax(z_nonzeros)
x_min, x_max = sup_128(x_min, x_max)
y_min, y_max = sup_128(y_min, y_max)
z_min, z_max = sup_128(z_min, z_max)
return x_min, x_max, y_min, y_max, z_min, z_max
def normalize(vol):
mask = vol.sum(0) > 0
for k in range(4):
x = vol[k, ...]
y = x[mask]
x = (x - y.mean()) / y.std()
vol[k, ...] = x
return vol
if not os.path.exists(os.path.join(tar_path, 'vol')):
os.makedirs(os.path.join(tar_path, 'vol'))
if not os.path.exists(os.path.join(tar_path, 'seg')):
os.makedirs(os.path.join(tar_path, 'seg'))
for file_name in name_list:
print (file_name)
num = file_name.split('_')[2]
# HLG = 'HG_' if int(num) <= 259 or int(num) >= 336 else 'LG_'
flair, flair_header = medio.load(os.path.join(src_path, file_name, file_name+'_flair.nii.gz'))
t1ce, t1ce_header = medio.load(os.path.join(src_path, file_name, file_name+'_t1ce.nii.gz'))
t1, t1_header = medio.load(os.path.join(src_path, file_name, file_name+'_t1.nii.gz'))
t2, t2_header = medio.load(os.path.join(src_path, file_name, file_name+'_t2.nii.gz'))
vol = np.stack((flair, t1ce, t1, t2), axis=0).astype(np.float32)
x_min, x_max, y_min, y_max, z_min, z_max = crop(vol)
vol1 = normalize(vol[:, x_min:x_max, y_min:y_max, z_min:z_max])
vol1 = vol1.transpose(1,2,3,0)
print (vol1.shape)
seg, seg_header = medio.load(os.path.join(src_path, file_name, file_name+'_seg.nii.gz'))
seg = seg.astype(np.uint8)
seg1 = seg[x_min:x_max, y_min:y_max, z_min:z_max]
seg1[seg1==4]=3
np.save(os.path.join(tar_path, 'vol', file_name+'_vol.npy'), vol1)
np.save(os.path.join(tar_path, 'seg', file_name+'_seg.npy'), seg1)