Use two radius in the configuration, one computed with the image resolution and one...
[master-thesis.git] / Parasitemia / Parasitemia / Classifier.fs
index 1a22129..121a7f5 100644 (file)
@@ -29,10 +29,10 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img:
         let infection = parasites.infection.Copy() // To avoid to modify the parameter.
 
         // This is the minimum window size to check if other ellipses touch 'e'.
-        let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCMaxRadius)
-                                          KdTree.maxX = e.Cx + (e.A + config.RBCMaxRadius)
-                                          KdTree.minY = e.Cy - (e.A + config.RBCMaxRadius)
-                                          KdTree.maxY = e.Cy + (e.A + config.RBCMaxRadius) }
+        let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCRadius.Max)
+                                          KdTree.maxX = e.Cx + (e.A + config.RBCRadius.Max)
+                                          KdTree.minY = e.Cy - (e.A + config.RBCRadius.Max)
+                                          KdTree.maxY = e.Cy + (e.A + config.RBCRadius.Max) }
 
         // The minimum window to contain a given ellipse.
         let ellipseWindow (e: Ellipse) =
@@ -97,7 +97,6 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img:
         // We reverse the list to get the lower score ellipses first.
         let ellipsesWithNeigbors = ellipses |> List.map (fun e -> e, neighbors e) |> List.rev
 
-
         // 2) Remove ellipses touching the edges.
         for e in ellipses do
             if e.isOutside w_f h_f then e.Removed <- true
@@ -125,42 +124,9 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img:
                 if stdDeviation > globalStdDeviation * config.Parameters.standardDeviationMaxRatio then
                     e.Removed <- true
 
-(*
-        let imgData = img.Data
-                let stdDeviations = [
-                    for e in ellipses do
-                        if not e.Removed
-                        then
-                            let shrinkedE = e.Scale 0.9f
-                            let minX, minY, maxX, maxY = ellipseWindow shrinkedE
-
-                            let stdDeviation = float32 <| MathNet.Numerics.Statistics.Statistics.StandardDeviation (seq {
-                                for y in (if minY < 0 then 0 else minY) .. (if maxY >= h then h - 1 else maxY) do
-                                    for x in (if minX < 0 then 0 else minX) .. (if maxX >= w then w - 1 else maxX) do
-                                        if shrinkedE.Contains (float32 x) (float32 y)
-                                        then
-                                            yield float imgData.[y, x, 0] })
-
-                            e.StdDeviation <- stdDeviation
-                            yield stdDeviation ]
-
-                // We use Otsu and eliminate some cells only if the curve may be bimodal.
-                // See https://en.wikipedia.org/wiki/Multimodal_distribution#Bimodality_coefficient
-                let skewness, kurtosis = MathNet.Numerics.Statistics.Statistics.PopulationSkewnessKurtosis (stdDeviations |> List.map float)
-                let n = float stdDeviations.Length
-                let bimodalityCoefficient = (skewness ** 2. + 1.) / (kurtosis + 3. * (n - 1.) ** 2. / ((n - 2.) * (n - 3.)))
-
-                if bimodalityCoefficient > 5. / 9.
-                then
-                    let hist = ImgTools.histogram stdDeviations 200
-                    let thresh, _, _ = ImgTools.otsu hist
-                    for e in ellipses do
-                        if not e.Removed && e.StdDeviation > thresh
-                        then e.Removed <- true
-*)
 
         // 4) Remove ellipses with little area.
-        let minArea = config.RBCMinArea
+        let minArea = config.RBCRadius.MinArea
         for e, neighbors in ellipsesWithNeigbors do
             if not e.Removed
             then