-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.py
More file actions
101 lines (72 loc) · 2.95 KB
/
Main.py
File metadata and controls
101 lines (72 loc) · 2.95 KB
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
import pylidc as pl
import nrrd
import numpy
import six
import radiomics
import sys
import os
import itk
from csv import writer
pid = "LIDC-IDRI-0003"
dirName = "C:\\NECSTCamp\\LungCancerDataExtraction\\data\\manifest-1639521588960\\LIDC-IDRI\\LIDC-IDRI-0003\\1.3.6.1.4.1.14519.5.2.1.6279.6001.101370605276577556143013894866\\1.3.6.1.4.1.14519.5.2.1.6279.6001.170706757615202213033480003264"
imagePath = "C:\\NECSTCamp\\LungCancerDataExtraction\\data\\conversionNRRD\\image.nrrd"
maskPath = "C:\\NECSTCamp\\LungCancerDataExtraction\\data\\conversionNRRD\\label.nrrd"
def extractMask(imagePath, maskPath,pid, numSlice):
scans = pl.query(pl.Scan).filter(pl.Scan.patient_id == pid)
scan = scans.first()
ann = pl.query(pl.Annotation).first()
booleanMask = ann.boolean_mask()
bbox = ann.bbox()
booleanMask = booleanMask.astype('int8')
booleanMask = numpy.swapaxes(booleanMask,0,1)
mask = numpy.zeros((512, 512, numSlice))
mask[bbox[1].start:bbox[1].stop, bbox[0].start:bbox[0].stop, bbox[2].start:bbox[2].stop] = booleanMask
mask = numpy.flip(mask, 1)
header = nrrd.read_header(imagePath)
nrrd.write(maskPath, mask, header)
def convertDicomToNRRD(dirName, outFileName):
PixelType = itk.ctype("signed short")
Dimension = 3
ImageType = itk.Image[PixelType, Dimension]
namesGenerator = itk.GDCMSeriesFileNames.New()
namesGenerator.SetUseSeriesDetails(True)
namesGenerator.AddSeriesRestriction("0008|0021")
namesGenerator.SetGlobalWarningDisplay(False)
namesGenerator.SetDirectory(dirName)
seriesUID = namesGenerator.GetSeriesUIDs()
if len(seriesUID) < 1:
print("No DICOMs in: " + dirName)
sys.exit(1)
seriesFound = False
for uid in seriesUID:
seriesIdentifier = uid
fileNames = namesGenerator.GetFileNames(seriesIdentifier)
reader = itk.ImageSeriesReader[ImageType].New()
dicomIO = itk.GDCMImageIO.New()
reader.SetImageIO(dicomIO)
reader.SetFileNames(fileNames)
reader.ForceOrthogonalDirectionOff()
writer = itk.ImageFileWriter[ImageType].New()
writer.SetFileName(outFileName)
writer.UseCompressionOn()
writer.SetInput(reader.GetOutput())
print("Writing: " + outFileName)
writer.Update()
if seriesFound:
break
convertDicomToNRRD(dirName, imagePath)
extractMask(imagePath, maskPath, pid, len(os.listdir(dirName))-1)
extractor = radiomics.featureextractor.RadiomicsFeatureExtractor()
print('Extraction parameters:\n\t', extractor.settings)
print('Enabled filters:\n\t', extractor.enabledImagetypes)
print('Enabled features:\n\t', extractor.enabledFeatures)
result = extractor.execute(imagePath, maskPath)
print("Opening file...")
file = open('featureExtraction.csv', 'w')
writer = writer(file)
print('calculating features...')
for key, value in six.iteritems(result):
data = [str(key), str(value)]
writer.writerow(data)
print('Saved features')
file.close()