Finding ellipses and parasites.
[master-thesis.git] / Parasitemia / Parasitemia / ParasitesMarker.fs
diff --git a/Parasitemia/Parasitemia/ParasitesMarker.fs b/Parasitemia/Parasitemia/ParasitesMarker.fs
new file mode 100644 (file)
index 0000000..44da901
--- /dev/null
@@ -0,0 +1,39 @@
+module ParasitesMarker
+
+open System.Drawing
+
+open Emgu.CV
+open Emgu.CV.Structure
+
+type Result = {
+    darkStain: Image<Gray, byte>
+    stain: Image<Gray, byte>
+    infection: Image<Gray, byte> }
+
+let find (green: Image<Gray, float32>) (filteredGreen: Image<Gray, float32>) (config: Config.Config) : Result =
+
+    // We use the filtered image to find the dark stain.
+    let { KMedians.fg = fg; KMedians.median_bg = median_bg; KMedians.median_fg = median_fg; KMedians.d_fg = d_fg } = KMedians.kmedians filteredGreen 1.0
+    let darkStain = d_fg.Cmp(median_bg * config.darkStainLevel, CvEnum.CmpType.GreaterThan)
+    darkStain._And(filteredGreen.Cmp(median_fg, CvEnum.CmpType.LessThan))
+    darkStain._And(fg)
+    
+    let fgFloat = (fg / 255.0).Convert<Gray, float32>()
+    let greenWithoutBg = green.Copy()
+    greenWithoutBg.SetValue(Gray(0.0), fg.Not())
+
+    let findSmears (sigma: float) (level: float) : Image<Gray, byte> =       
+        let greenWithoutBgSmoothed = ImgTools.gaussianFilter greenWithoutBg sigma
+        let fgSmoothed = ImgTools.gaussianFilter fgFloat sigma
+
+        let smears = (greenWithoutBg.Mul(fgSmoothed)).Cmp(greenWithoutBgSmoothed.Mul(level), CvEnum.CmpType.LessThan)
+        smears._And(fg)
+        smears    
+
+    { darkStain = darkStain;
+      stain = findSmears config.stainSigma config.stainLevel
+      infection = findSmears config.infectionSigma config.infectionLevel }
+    
+
+
+