X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FMatchingEllipses.fs;h=92a767ad19d14907c890fc23315852853eb24af6;hp=da74c65655c396bba8a4bd241ccee4ddf2283ddb;hb=b070295cf67b2025164a34b6594e84f0d771cdc9;hpb=8cf3b0a302943312c588690b4e4c90af17b3e87a diff --git a/Parasitemia/Parasitemia/MatchingEllipses.fs b/Parasitemia/Parasitemia/MatchingEllipses.fs index da74c65..92a767a 100644 --- a/Parasitemia/Parasitemia/MatchingEllipses.fs +++ b/Parasitemia/Parasitemia/MatchingEllipses.fs @@ -9,17 +9,23 @@ open Types open Utils +// Do not take in account matching score below this when two ellipses are matched. let matchingScoreThreshold1 = 0.6 -let matchingScoreThreshold2 = 1. + +// All ellipsee with a score below this is removed. +let matchingScoreThreshold2 = 1. / 50. type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = let mutable matchingScore = matchingScore + let perimeter = e.Perimeter member this.Ellipse = e member this.MatchingScore = matchingScore + + // The score is proportional to the perimeter because large ellipse will receive more votes. member this.AddMatchingScore(score: float) = - matchingScore <- matchingScore + score + matchingScore <- matchingScore + score / perimeter member val Processed = false with get, set member val Removed = false with get, set @@ -38,6 +44,7 @@ type MatchingEllipses (radiusMin: float) = member this.Ellipses : Ellipse list = List.ofSeq ellipses |> List.map (fun e -> e.Ellipse) + // Process all ellipses and return ellipses ordered from the best score to the worst. member this.PrunedEllipses : Ellipse list = if ellipses.Count = 0 then @@ -93,7 +100,7 @@ type MatchingEllipses (radiusMin: float) = for other in tree.Search window do if not other.Removed && other.MatchingScore < e.MatchingScore then - if e.Ellipse.Contains other.Ellipse.Cx other.Ellipse.Cy + if e.Ellipse.Scale(0.8).Contains other.Ellipse.Cx other.Ellipse.Cy then other.Removed <- true ellipses.RemoveAll(fun e -> e.Removed) |> ignore