beginning of the classifier.
[master-thesis.git] / Parasitemia / Parasitemia / ImageAnalysis.fs
index 0b96757..21616af 100644 (file)
@@ -11,13 +11,13 @@ open ImgTools
 open Config
 open Types
 
-type Result = {
+(*type Result = {
     RBCPositions : Point list
     infectedRBCPositions : Point list
     img: Image<Bgr, byte>
-}
+}*)
 
-let doAnalysis (img: Image<Bgr, byte>) (config: Config) : Result =
+let doAnalysis (img: Image<Bgr, byte>) (config: Config) : Classifier.Cell list =
 
     let imgFloat = img.Convert<Bgr, float32>()
     use scaledImg = if config.scale = 1.0 then imgFloat else imgFloat.Resize(config.scale, CvEnum.Inter.Area)
@@ -75,16 +75,8 @@ let doAnalysis (img: Image<Bgr, byte>) (config: Config) : Result =
 
     use magnitudesByte = ((magnitudes / !max) * 255.0).Convert<byte>() // Otsu from OpenCV only support 'byte'.
     use edges = new Matrix<byte>(xEdges.Size)    
-    let threshold = CvInvoke.Threshold(magnitudesByte, edges, 0.0, 1.0, CvEnum.ThresholdType.Otsu ||| CvEnum.ThresholdType.Binary)
-
-//    let filteredGreenMat = new Matrix<float32>(filteredGreen.Size)
-//    filteredGreen.CopyTo(filteredGreenMat)
-    let parasites = ParasitesMarker.find green filteredGreen config
-    
-    saveImg parasites.darkStain "parasites_dark_stain.png"
-    saveImg parasites.stain "parasites_stain.png"
-    saveImg parasites.infection "parasites_infection.png"
-    
+    CvInvoke.Threshold(magnitudesByte, edges, 0.0, 1.0, CvEnum.ThresholdType.Otsu ||| CvEnum.ThresholdType.Binary) |> ignore
+        
     logTime "Finding edges" (fun() ->
         thin edges)
 
@@ -93,6 +85,15 @@ let doAnalysis (img: Image<Bgr, byte>) (config: Config) : Result =
     
     saveMat (edges * 255.0) "edges.png" 
 
+
+    let kmediansResults = KMedians.kmedians filteredGreen 1.0
+
+    let parasites = ParasitesMarker.find green filteredGreen kmediansResults config
+    
+    saveImg parasites.darkStain "parasites_dark_stain.png"
+    saveImg parasites.stain "parasites_stain.png"
+    saveImg parasites.infection "parasites_infection.png"
+
     let radiusRange = config.scale * 20.0, config.scale * 40.0
     let windowSize = roundInt (1.6 * (snd radiusRange))
     let factorNbPick = 1.5
@@ -102,7 +103,7 @@ let doAnalysis (img: Image<Bgr, byte>) (config: Config) : Result =
     drawEllipses img ellipses (Bgr(0.0, 255.0, 255.0))
     //saveImg img "ellipses.png"
 
-    { RBCPositions = []; infectedRBCPositions = []; img = img }
+    Classifier.findCells ellipses parasites kmediansResults.fg
 
     //