Fix some approximation issues.
[master-thesis.git] / Parasitemia / ParasitemiaCore / MatchingEllipses.fs
index b9b4b83..ec10d93 100644 (file)
@@ -29,7 +29,7 @@ type MatchingEllipses (radius: float32) =
     let ellipses = List<EllipseScoreFlaggedKd>()
 
     // All ellipses with a score below this are removed.
-    let matchingScoreThreshold = 0.8f
+    let matchingScoreThreshold = 0.4f // 0.5f
 
     member this.Add (e: Ellipse) =
         ellipses.Add(EllipseScoreFlaggedKd(0.f, e))
@@ -59,10 +59,10 @@ type MatchingEllipses (radius: float32) =
                     then
                         let areaOther = other.Ellipse.Area
                         match EEOver.EEOverlapArea e.Ellipse other.Ellipse with
-                        | Some (overlapArea, _, _) ->
-                            let matchingScore = (2.f * overlapArea / (areaE + areaOther)) ** 30.f
-                            if matchingScore <= 1.f // For approximation error.
-                            then
+                        | 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
                                 other.AddMatchingScore(matchingScore)
                                 e.AddMatchingScore(matchingScore)
                         | _ -> ()
@@ -81,7 +81,7 @@ type MatchingEllipses (radius: float32) =
                         if not other.Removed && e.MatchingScore > other.MatchingScore
                         then
                             // Case where ellipses are too close.
-                            if distanceTwoPoints (PointD(e.Ellipse.Cx, e.Ellipse.Cy)) (PointD(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)) < 0.3f * e.Ellipse.B
                             then
                                 other.Removed <- true
                             else
@@ -91,7 +91,6 @@ type MatchingEllipses (radius: float32) =
                                     other.Removed <- true
                                 | _ ->
                                     ()
-
             ellipses
             |> List.ofSeq
             |> List.filter (fun e -> not e.Removed)