Use two radius in the configuration, one computed with the image resolution and one...
[master-thesis.git] / Parasitemia / Parasitemia / Classifier.fs
index f0c9d01..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,16 +97,13 @@ 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
 
         // 3) Remove ellipses with a high standard deviation (high contrast).
-
-        // CvInvoke.Normalize(img, img, 0.0, 255.0, CvEnum.NormType.MinMax) // Not needed.
         let imgData = img.Data
-        let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.StandardDeviation(seq {
+        let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.PopulationStandardDeviation(seq {
             for y in 0 .. h - 1 do
                 for x in 0 .. w - 1 do
                     yield float imgData.[y, x, 0] })
@@ -127,8 +124,9 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img:
                 if stdDeviation > globalStdDeviation * config.Parameters.standardDeviationMaxRatio 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
@@ -197,4 +195,6 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img:
 
                 Some { cellClass = cellClass
                        center = Point(roundInt e.Cx, roundInt e.Cy)
+                       infectedArea = infectedPixels.Count
+                       stainArea = stainPixels
                        elements = elements })