Finding ellipses and parasites.
[master-thesis.git] / Parasitemia / Parasitemia / ImageAnalysis.fs
index 1215965..0b96757 100644 (file)
@@ -41,7 +41,7 @@ let doAnalysis (img: Image<Bgr, byte>) (config: Config) : Result =
     //let test = greenMatrix.[10, 10]
 
     use filteredGreen = (gaussianFilter green config.doGSigma1) - config.doGLowFreqPercentageReduction * (gaussianFilter green config.doGSigma2)
     //let test = greenMatrix.[10, 10]
 
     use filteredGreen = (gaussianFilter green config.doGSigma1) - config.doGLowFreqPercentageReduction * (gaussianFilter green config.doGSigma2)
-
+    
     use sobelKernel = 
         new ConvolutionKernelF(array2D [[ 1.0f; 0.0f; -1.0f ]
                                         [ 2.0f; 0.0f; -2.0f ]
     use sobelKernel = 
         new ConvolutionKernelF(array2D [[ 1.0f; 0.0f; -1.0f ]
                                         [ 2.0f; 0.0f; -2.0f ]
@@ -75,19 +75,32 @@ 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)    
 
     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)        
-    thin edges    
-    removeArea edges 12
+    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"
+    
+    logTime "Finding edges" (fun() ->
+        thin edges)
+
+    logTime "Removing small connected components" (fun () -> 
+        removeArea edges 12)
     
     saveMat (edges * 255.0) "edges.png" 
 
     let radiusRange = config.scale * 20.0, config.scale * 40.0
     let windowSize = roundInt (1.6 * (snd radiusRange))
     
     saveMat (edges * 255.0) "edges.png" 
 
     let radiusRange = config.scale * 20.0, config.scale * 40.0
     let windowSize = roundInt (1.6 * (snd radiusRange))
-    let factorNbPick = 1.0;
-    let ellipses = Ellipse.find edges xEdges yEdges radiusRange windowSize factorNbPick
-        
-    drawEllipse img (List.head ellipses) (Bgr(0.0, 255.0, 255.0))
-    saveImg img "ellipses.png" 
+    let factorNbPick = 1.5
+    let ellipses = logTime "Finding ellipses" (fun () ->
+        Ellipse.find edges xEdges yEdges radiusRange windowSize factorNbPick)
+                
+    drawEllipses img ellipses (Bgr(0.0, 255.0, 255.0))
+    //saveImg img "ellipses.png"
 
     { RBCPositions = []; infectedRBCPositions = []; img = img }
 
 
     { RBCPositions = []; infectedRBCPositions = []; img = img }