module ParasitemiaCore.MatchingEllipses
open System
+open System.Drawing
open System.Linq
open System.Collections
open System.Collections.Generic
let ellipses = List<EllipseScoreFlaggedKd>()
// All ellipses with a score below this are removed.
- let matchingScoreThreshold = 0.8f
+ let matchingScoreThreshold = 0.4f
member this.Add (e: Ellipse) =
ellipses.Add(EllipseScoreFlaggedKd(0.f, e))
let tree = KdTree.Tree.BuildTree (List.ofSeq ellipses)
// 2) Compute the matching score of each ellipses.
- let windowSize = radius / 2.f
+ let windowSize = radius / 3.f
for e in ellipses do
e.Processed <- true
let areaE = e.Ellipse.Area
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)
| _ -> ()
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
other.Removed <- true
| _ ->
()
-
ellipses
|> List.ofSeq
|> List.filter (fun e -> not e.Removed)