Add some GUI elements :
[master-thesis.git] / Parasitemia / ParasitemiaCore / MatchingEllipses.fs
index c7a0627..3ed8ad6 100644 (file)
@@ -9,6 +9,12 @@ open System.Collections.Generic
 open Types
 open Utils
 
+// All ellipses with a score below this are removed.
+let matchingScoreThreshold = 0.4f
+let matchingScorePower = 20.f
+let windowSizeRadiusFactor = 1.f / 2.f
+let minimumDistanceFromCenterRadiusFactor = 1.f / 3.f
+
 type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) =
     let mutable matchingScore = matchingScore
 
@@ -29,9 +35,6 @@ type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) =
 type MatchingEllipses (radius: float32) =
     let ellipses = List<EllipseScoreFlaggedKd>()
 
-    // All ellipses with a score below this are removed.
-    let matchingScoreThreshold = 0.4f
-
     member this.Add (e: Ellipse) =
         ellipses.Add(EllipseScoreFlaggedKd(0.f, e))
 
@@ -47,7 +50,7 @@ type MatchingEllipses (radius: float32) =
             let tree = KdTree.Tree.BuildTree (List.ofSeq ellipses)
 
             // 2) Compute the matching score of each ellipses.
-            let windowSize = radius / 3.f
+            let windowSize = radius * windowSizeRadiusFactor
             for e in ellipses do
                 e.Processed <- true
                 let areaE = e.Ellipse.Area
@@ -63,7 +66,7 @@ type MatchingEllipses (radius: float32) =
                         | Some (overlapArea, _, _)
                             // Because of approximation error, see https://github.com/chraibi/EEOver/issues/4
                             when overlapArea - areaE < 1.f && overlapArea - areaOther < 1.f ->
-                                let matchingScore = (2.f * overlapArea / (areaE + areaOther)) ** 30.f
+                                let matchingScore = (2.f * overlapArea / (areaE + areaOther)) ** matchingScorePower
                                 other.AddMatchingScore(matchingScore)
                                 e.AddMatchingScore(matchingScore)
                         | _ -> ()
@@ -82,7 +85,7 @@ type MatchingEllipses (radius: float32) =
                         if not other.Removed && e.MatchingScore > other.MatchingScore
                         then
                             // Case where ellipses are too close.
-                            if distanceTwoPoints (PointF(e.Ellipse.Cx, e.Ellipse.Cy)) (PointF(other.Ellipse.Cx, other.Ellipse.Cy)) < 0.3f * e.Ellipse.B
+                            if distanceTwoPoints (PointF(e.Ellipse.Cx, e.Ellipse.Cy)) (PointF(other.Ellipse.Cx, other.Ellipse.Cy)) < minimumDistanceFromCenterRadiusFactor * e.Ellipse.B
                             then
                                 other.Removed <- true
                             else