-
Notifications
You must be signed in to change notification settings - Fork 30
/
Step1_PreProcessing.py
159 lines (147 loc) · 5.93 KB
/
Step1_PreProcessing.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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
# -*- coding: utf-8 -*-
"""
@author: HuangyjSJTU
"""
import SimpleITK as sitk
import numpy as np
import sys
import os
sys.path.append('./lib/')
import matplotlib.pyplot as pl
from PIL import Image as Img
from FindFiles import findfiles
import dicom
import cv2
from skimage import filters
from skimage.measure import label,regionprops
#For intensity normalization
DataRoot='../Data/send/'
ModelName='/t2-fov/'
ManualNormalize=True
ResRate=['HighRes','MidRes','LowRes']
ToSpacing={'HighRes':[1,1,4],'MidRes':[1.5,1.5,4],'LowRes':[2,2,4]}
def ReadImageAndLabel(CasePath,inverted=False):
#Reading Images
Reader = sitk.ImageSeriesReader()
name=findfiles(CasePath+'img/','*.dcm')
for i in range(len(name)):
name[i]=int(name[i][0:-4])
name=sorted(name)
name=name[::-1]
for i in range(len(name)):
#print name[i],'\n'
name[i]=CasePath+'img/'+str(name[i])+'.dcm'
Reader.SetFileNames(name)
Image = Reader.Execute()
Spacing=Image.GetSpacing()
Origin = Image.GetOrigin()
Direction = Image.GetDirection()
#Reading Labels
name=findfiles(CasePath+'label/','*.PNG')
name=sorted(name)
for i in range(len(name)):
name[i]=CasePath+'label/'+name[i]
#print name
#Sometimes labels are inverted along Z axis and should be rectified in this dataset
if inverted:
pass
else:
name=name[::-1]
# for i in range(len(name)):
# print name[i]+'\n'
Reader.SetFileNames(name)
Label = Reader.Execute()
LabelArray=sitk.GetArrayFromImage(Label)
LabelArray=((255-LabelArray[:,:,:,1])).astype(np.uint8)/255
Label=sitk.GetImageFromArray(LabelArray)
Label.SetSpacing(Spacing)
Label.SetOrigin(Origin)
Label.SetDirection(Direction)
return Image,Label
def Resampling(Image,Label):
Size=Image.GetSize()
Spacing=Image.GetSpacing()
Origin = Image.GetOrigin()
Direction = Image.GetDirection()
ImagePyramid=[]
LabelPyramid=[]
for i in range(3):
NewSpacing = ToSpacing[ResRate[i]]
NewSize=[int(Size[0]*Spacing[0]/NewSpacing[0]),int(Size[1]*Spacing[1]/NewSpacing[1]),int(Size[2]*Spacing[2]/NewSpacing[2])]
Resample = sitk.ResampleImageFilter()
Resample.SetOutputDirection(Direction)
Resample.SetOutputOrigin(Origin)
Resample.SetSize(NewSize)
Resample.SetInterpolator(sitk.sitkLinear)
Resample.SetOutputSpacing(NewSpacing)
NewImage = Resample.Execute(Image)
ImagePyramid.append(NewImage)
Resample = sitk.ResampleImageFilter()
Resample.SetOutputDirection(Direction)
Resample.SetOutputOrigin(Origin)
Resample.SetSize(NewSize)
Resample.SetOutputSpacing(NewSpacing)
Resample.SetInterpolator(sitk.sitkNearestNeighbor)
NewLabel = Resample.Execute(Label)
LabelPyramid.append(NewLabel)
return ImagePyramid,LabelPyramid
#We shift the mean value to enhance the darker side
UpperBound=1.0
LowerBound=-4.0
def Normalization(Image):
Spacing=Image.GetSpacing()
Origin = Image.GetOrigin()
Direction = Image.GetDirection()
Array=sitk.GetArrayFromImage(Image)
Array_new=Array.copy()
Array_new+=np.min(Array_new)
Array_new=Array_new[Array_new.shape[0]/2-5:Array_new.shape[0]/2+5]
Mask=Array_new.copy()
for i in range(Array_new.shape[0]):
otsu=filters.threshold_otsu(Array_new[i])
Mask[i][Array_new[i]<0.5*otsu]=0
Mask[i][Array_new[i]>=0.5*otsu]=1
MaskSave=sitk.GetImageFromArray(Mask)
MaskSave=sitk.BinaryDilate(MaskSave,10)
MaskSave=sitk.BinaryErode(MaskSave,10)
Mask=sitk.GetArrayFromImage(MaskSave)
Avg=np.average(Array[Array_new.shape[0]/2-5:Array_new.shape[0]/2+5],weights=Mask)
Std=np.sqrt(np.average(abs(Array[Array_new.shape[0]/2-5:Array_new.shape[0]/2+5] - Avg)**2,weights=Mask))
Array=(Array.astype(np.float32)-Avg)/Std
Array[Array>UpperBound]=UpperBound
Array[Array<LowerBound]=LowerBound
Array=((Array.astype(np.float64)-np.min(Array))/(np.max(Array)-np.min(Array))*255).astype(np.uint8)
Image=sitk.GetImageFromArray(Array)
Image.SetDirection(Direction)
Image.SetOrigin(Origin)
Image.SetSpacing(Spacing)
return Image,MaskSave
if __name__=='__main__':
PatientNames=os.listdir('../Data/send/')
PatientNames=sorted(PatientNames)
for i in range(len(PatientNames)):
PatientName=PatientNames[i]
print PatientName
Image,Label=ReadImageAndLabel('../Data/send/'+PatientName+'/t2-fov/')
Image,Mask=Normalization(Image)
ImagePyramid,LabelPyramid=Resampling(Image,Label)
for i in range(3):
if os.path.exists('../Data/Normalized/'+PatientName)==False:
os.mkdir('../Data/Normalized/'+PatientName)
if os.path.exists('../Data/Normalized/'+PatientName+'/'+ResRate[i])==False:
os.mkdir('../Data/Normalized/'+PatientName+'/'+ResRate[i])
sitk.WriteImage(Mask,'../Data/Normalized/'+PatientName+'/'+'BodyMask.mhd')
sitk.WriteImage(ImagePyramid[i],'../Data/Normalized/'+PatientName+'/'+ResRate[i]+'/'+'Image.mhd')
sitk.WriteImage(LabelPyramid[i],'../Data/Normalized/'+PatientName+'/'+ResRate[i]+'/'+'Label.mhd')
InvertPatientNames=['10262598']
for i in range(len(InvertPatientNames)):
PatientName=InvertPatientNames[i]#'ForTest'
Image,Label=ReadImageAndLabel('../Data/send/'+PatientName+'/t2-fov/',inverted=True)
Image,Mask=Normalization(Image)
ImagePyramid,LabelPyramid=Resampling(Image,Label)
for i in range(3):
if os.path.exists('../Data/Normalized/'+PatientName)==False:
os.mkdir('../Data/Normalized/'+PatientName)
sitk.WriteImage(Mask,'../Data/Normalized/'+PatientName +'/'+'BodyMask.mhd')
sitk.WriteImage(ImagePyramid[i],'../Data/Normalized/'+PatientName+'/'+ResRate[i]+'/'+'Image.mhd')
sitk.WriteImage(LabelPyramid[i],'../Data/Normalized/'+PatientName+'/'+ResRate[i]+'/'+'Label.mhd')