Change the way the parasites are detected.
[master-thesis.git] / Parasitemia / Parasitemia / ParasitesMarker2.fs
index 6afef44..42645b4 100644 (file)
@@ -1,6 +1,7 @@
 module ParasitesMarker2
 
 open System.Drawing
+open System.Linq
 
 open Emgu.CV
 open Emgu.CV.Structure
@@ -30,7 +31,7 @@ let find (filteredGreen: Image<Gray, byte>) (filteredGreenFloat: Image<Gray, flo
     let darkStain = d_fg.Cmp(median_bg * config.Parameters.darkStainLevel, CvEnum.CmpType.GreaterThan)
     darkStain._And(filteredGreenWithoutInfection.Cmp(median_fg, CvEnum.CmpType.LessThan))
 
-    let marker (img: Image<Gray, byte>) (closed: Image<Gray, byte>) (threshold: float) : Image<Gray, byte> =
+    let marker (img: Image<Gray, byte>) (closed: Image<Gray, byte>) (level: float) : Image<Gray, byte> =
         let diff = closed - img
 
         let min = ref [| 0. |]
@@ -40,8 +41,15 @@ let find (filteredGreen: Image<Gray, byte>) (filteredGreenFloat: Image<Gray, flo
         diff.MinMax(min, max, minLocation, maxLocation)
         let max = (!max).[0]
 
-        let limitThreshold = 0.1
-        let valueThreshold = (*if max < limitThreshold * (median_bg - median_fg) then max / 2. else *) max * threshold
+        let threshold = 0.2 * max
+        let diff' = diff - threshold
+
+        let m = MathNet.Numerics.Statistics.StreamingStatistics.Mean(seq {
+                for m in ImgTools.findMaxima diff' do
+                    let p = m.First()
+                    yield diff'.Data.[p.Y, p.X, 0] |> float }) + threshold
+
+        let valueThreshold = m * level
 
         diff._ThresholdBinary(Gray(valueThreshold), Gray(255.))
         diff