X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FMatchingEllipses.fs;h=c7a06279be6c7bb375098543ad3993bc743dbe5a;hp=b9b4b83197446ef151598bfa07fda09d25135d11;hb=94fbffc758bf0299b077e344ebcbecca408ae564;hpb=4bfa3cbdc6145e6944f02e24829ab2ef3a851ac1 diff --git a/Parasitemia/ParasitemiaCore/MatchingEllipses.fs b/Parasitemia/ParasitemiaCore/MatchingEllipses.fs index b9b4b83..c7a0627 100644 --- a/Parasitemia/ParasitemiaCore/MatchingEllipses.fs +++ b/Parasitemia/ParasitemiaCore/MatchingEllipses.fs @@ -1,6 +1,7 @@ module ParasitemiaCore.MatchingEllipses open System +open System.Drawing open System.Linq open System.Collections open System.Collections.Generic @@ -29,7 +30,7 @@ type MatchingEllipses (radius: float32) = let ellipses = List() // 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)) @@ -46,7 +47,7 @@ type MatchingEllipses (radius: float32) = 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 @@ -59,10 +60,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 +82,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 +92,6 @@ type MatchingEllipses (radius: float32) = other.Removed <- true | _ -> () - ellipses |> List.ofSeq |> List.filter (fun e -> not e.Removed)