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

Switch to side-by-side view

--- a
+++ b/index.py
@@ -0,0 +1,150 @@
+# Our imports
+from Dicom import Dicom
+from CvImage import CvImage
+from Segment import Segment
+from geometry import distanceToPolygon, isPointsInsidePolygon
+import pandas as pd
+from os import listdir
+from os.path import isfile, join
+
+# Our interest segments
+# Bone
+bone = Segment("Bone")
+bone.setMinSegmentArea(200)
+bone.setHUInterval(700, 3000)
+bone.setRGB(0,0,255)
+bone.setHSVFilter(100, 50, 0, 130, 255, 255)
+
+# Blood
+blood = Segment("Blood")
+blood.setMinSegmentArea(100)
+blood.setHUInterval(60, 100)
+blood.setRGB(255,0,0)
+blood.setHSVFilter(0, 60, 0, 10, 255, 255)
+
+# Ventricle
+ventricle = Segment("Ventricle")
+ventricle.setMinSegmentArea(100)
+ventricle.setHUInterval(-15, 15)
+ventricle.setRGB(0,255,0)
+ventricle.setHSVFilter(50,100, 0, 70, 255, 255)
+
+# BrainMass
+brainMass = Segment("BrainMass")
+brainMass.setMinSegmentArea(200)
+brainMass.setHUInterval(20, 50)
+brainMass.setRGB(255,255,0)
+brainMass.setHSVFilter(25, 50, 0, 35, 255, 255)
+
+labels = pd.read_csv('D:/Downloads/stage2train.csv')
+
+# Here it comes!
+path = "D:/Downloads/stage2train/"
+dcmFiles = []
+dirFiles = listdir(path)
+i = 0
+while i < len(dirFiles) and i < 1:
+  if isfile(join(path, dirFiles[i])):
+    dcmFiles.append(dirFiles[i])
+  i = i + 1
+
+results = open("./results/results.txt", "a")
+
+for filename in dcmFiles:
+  ds = Dicom(path+filename)
+  
+  # Print labels and ID
+  results.write(filename[:-4])
+  for label in ["epidural", "intraparenchymal", "intraventricular", "subarachnoid", "subdural", "any"]:
+    results.write("," + str(labels.loc[labels["ID"] == (filename[:-4]+"_"+label)].values[0][1]))
+
+  # Filter by Hounsfield units (HU)
+  segmentedRGB = ds.getSegmentedRGB([
+    (bone.getLowerHU(), bone.getHigherHU(), bone.getBGR()), 
+    (ventricle.getLowerHU(), ventricle.getHigherHU(), ventricle.getBGR()),
+    (blood.getLowerHU(), blood.getHigherHU(), blood.getBGR()),
+    (brainMass.getLowerHU(), brainMass.getHigherHU(), brainMass.getBGR())
+  ])
+  
+  # Array of segments and their features
+  segments = {
+    bone.getName():{
+      "segment": bone,
+      "extractedFeatures": {}
+    },
+    brainMass.getName(): {
+      "segment": brainMass,
+      "extractedFeatures": {}
+    },
+    ventricle.getName(): {
+      "segment": ventricle,
+      "extractedFeatures": {}
+    },
+    blood.getName(): {
+      "segment": blood,
+      "extractedFeatures": {}
+    }
+  }
+
+  for key in segments:
+    
+    segment = segments[key]["segment"]
+
+    image = CvImage(segmentedRGB, segment.getName())
+
+    image.hsvFilter(segment.getLowerHSV(), segment.gethigherHSV())
+
+    # Perform some morph operations
+    image.morphOperations()
+
+    # Let's get all we want
+    features = image.getContoursFeatures(segment.getMinSegmentArea())
+
+    # RGB to see green contour
+    image.gray2bgr()
+
+    if (key == "Ventricle" or key == "BrainMass"):
+      for atrib in ["area", "eccentricity"]:
+        results.write("," + str(features[0][atrib]))
+
+    for i in range(len(features)):
+      # Blood only features
+      if key == "Blood":
+        distanceToBone = distanceToPolygon(features[i]["centroid"], segments["Bone"]["extractedFeatures"][0]["convexHull"])
+        
+        j = 0
+        isInsideVentricle = False
+        while isInsideVentricle == False and j < len(segments["Ventricle"]["extractedFeatures"]):
+          isInsideVentricle = isPointsInsidePolygon(features[i]["convexHull"], segments["Ventricle"]["extractedFeatures"][j]["convexHull"]).all()
+          j = j + 1
+        
+        isInsideBrainMass = False
+        if isInsideVentricle == False:
+          j = 0
+          while isInsideBrainMass == False and j < len(segments["BrainMass"]["extractedFeatures"]):
+            isInsideBrainMass = isPointsInsidePolygon(features[i]["convexHull"], segments["BrainMass"]["extractedFeatures"][j]["convexHull"]).all()
+            j = j + 1
+        
+        features[i]["distanceToBone"] = distanceToBone
+        features[i]["isInsideVentricle"] = isInsideVentricle
+        features[i]["isInsideBrainMass"] = isInsideBrainMass
+        
+        results.write("\n\t")
+        for atrib in ["area", "eccentricity", "distanceToBone", "isInsideVentricle", "isInsideBrainMass"]:
+          if (features[i][atrib] == False or features[i][atrib] == True):
+            if (features[i][atrib] == True):
+              results.write(str(1))
+            else:
+              results.write(str(0))
+          else:
+            results.write(str(features[i][atrib]))
+          if atrib != "isInsideBrainMass":
+             results.write(",")
+        
+
+      image.drawCircle(features[i]["centroid"])
+      image.drawContours([features[i]["convexHull"]])
+
+    segments[key]["extractedFeatures"] = features
+  results.write("\n")
+results.close()
\ No newline at end of file