Diff of /index.py [000000] .. [2c38ce]

Switch to unified view

a b/index.py
1
# Our imports
2
from Dicom import Dicom
3
from CvImage import CvImage
4
from Segment import Segment
5
from geometry import distanceToPolygon, isPointsInsidePolygon
6
import pandas as pd
7
from os import listdir
8
from os.path import isfile, join
9
10
# Our interest segments
11
# Bone
12
bone = Segment("Bone")
13
bone.setMinSegmentArea(200)
14
bone.setHUInterval(700, 3000)
15
bone.setRGB(0,0,255)
16
bone.setHSVFilter(100, 50, 0, 130, 255, 255)
17
18
# Blood
19
blood = Segment("Blood")
20
blood.setMinSegmentArea(100)
21
blood.setHUInterval(60, 100)
22
blood.setRGB(255,0,0)
23
blood.setHSVFilter(0, 60, 0, 10, 255, 255)
24
25
# Ventricle
26
ventricle = Segment("Ventricle")
27
ventricle.setMinSegmentArea(100)
28
ventricle.setHUInterval(-15, 15)
29
ventricle.setRGB(0,255,0)
30
ventricle.setHSVFilter(50,100, 0, 70, 255, 255)
31
32
# BrainMass
33
brainMass = Segment("BrainMass")
34
brainMass.setMinSegmentArea(200)
35
brainMass.setHUInterval(20, 50)
36
brainMass.setRGB(255,255,0)
37
brainMass.setHSVFilter(25, 50, 0, 35, 255, 255)
38
39
labels = pd.read_csv('D:/Downloads/stage2train.csv')
40
41
# Here it comes!
42
path = "D:/Downloads/stage2train/"
43
dcmFiles = []
44
dirFiles = listdir(path)
45
i = 0
46
while i < len(dirFiles) and i < 1:
47
  if isfile(join(path, dirFiles[i])):
48
    dcmFiles.append(dirFiles[i])
49
  i = i + 1
50
51
results = open("./results/results.txt", "a")
52
53
for filename in dcmFiles:
54
  ds = Dicom(path+filename)
55
  
56
  # Print labels and ID
57
  results.write(filename[:-4])
58
  for label in ["epidural", "intraparenchymal", "intraventricular", "subarachnoid", "subdural", "any"]:
59
    results.write("," + str(labels.loc[labels["ID"] == (filename[:-4]+"_"+label)].values[0][1]))
60
61
  # Filter by Hounsfield units (HU)
62
  segmentedRGB = ds.getSegmentedRGB([
63
    (bone.getLowerHU(), bone.getHigherHU(), bone.getBGR()), 
64
    (ventricle.getLowerHU(), ventricle.getHigherHU(), ventricle.getBGR()),
65
    (blood.getLowerHU(), blood.getHigherHU(), blood.getBGR()),
66
    (brainMass.getLowerHU(), brainMass.getHigherHU(), brainMass.getBGR())
67
  ])
68
  
69
  # Array of segments and their features
70
  segments = {
71
    bone.getName():{
72
      "segment": bone,
73
      "extractedFeatures": {}
74
    },
75
    brainMass.getName(): {
76
      "segment": brainMass,
77
      "extractedFeatures": {}
78
    },
79
    ventricle.getName(): {
80
      "segment": ventricle,
81
      "extractedFeatures": {}
82
    },
83
    blood.getName(): {
84
      "segment": blood,
85
      "extractedFeatures": {}
86
    }
87
  }
88
89
  for key in segments:
90
    
91
    segment = segments[key]["segment"]
92
93
    image = CvImage(segmentedRGB, segment.getName())
94
95
    image.hsvFilter(segment.getLowerHSV(), segment.gethigherHSV())
96
97
    # Perform some morph operations
98
    image.morphOperations()
99
100
    # Let's get all we want
101
    features = image.getContoursFeatures(segment.getMinSegmentArea())
102
103
    # RGB to see green contour
104
    image.gray2bgr()
105
106
    if (key == "Ventricle" or key == "BrainMass"):
107
      for atrib in ["area", "eccentricity"]:
108
        results.write("," + str(features[0][atrib]))
109
110
    for i in range(len(features)):
111
      # Blood only features
112
      if key == "Blood":
113
        distanceToBone = distanceToPolygon(features[i]["centroid"], segments["Bone"]["extractedFeatures"][0]["convexHull"])
114
        
115
        j = 0
116
        isInsideVentricle = False
117
        while isInsideVentricle == False and j < len(segments["Ventricle"]["extractedFeatures"]):
118
          isInsideVentricle = isPointsInsidePolygon(features[i]["convexHull"], segments["Ventricle"]["extractedFeatures"][j]["convexHull"]).all()
119
          j = j + 1
120
        
121
        isInsideBrainMass = False
122
        if isInsideVentricle == False:
123
          j = 0
124
          while isInsideBrainMass == False and j < len(segments["BrainMass"]["extractedFeatures"]):
125
            isInsideBrainMass = isPointsInsidePolygon(features[i]["convexHull"], segments["BrainMass"]["extractedFeatures"][j]["convexHull"]).all()
126
            j = j + 1
127
        
128
        features[i]["distanceToBone"] = distanceToBone
129
        features[i]["isInsideVentricle"] = isInsideVentricle
130
        features[i]["isInsideBrainMass"] = isInsideBrainMass
131
        
132
        results.write("\n\t")
133
        for atrib in ["area", "eccentricity", "distanceToBone", "isInsideVentricle", "isInsideBrainMass"]:
134
          if (features[i][atrib] == False or features[i][atrib] == True):
135
            if (features[i][atrib] == True):
136
              results.write(str(1))
137
            else:
138
              results.write(str(0))
139
          else:
140
            results.write(str(features[i][atrib]))
141
          if atrib != "isInsideBrainMass":
142
             results.write(",")
143
        
144
145
      image.drawCircle(features[i]["centroid"])
146
      image.drawContours([features[i]["convexHull"]])
147
148
    segments[key]["extractedFeatures"] = features
149
  results.write("\n")
150
results.close()