X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FMatchingEllipses.fs;h=2022c2644789f64947f0c99e3f6da33e17f94a6d;hp=7a4c51b46395fbbde788278750ab4917c01c5c28;hb=53440e757b4a4ab2a81b0f6a5dd1a2002c0133ba;hpb=21ce317bce2e1b58803bbb1be439161251478568 diff --git a/Parasitemia/Parasitemia/MatchingEllipses.fs b/Parasitemia/Parasitemia/MatchingEllipses.fs index 7a4c51b..2022c26 100644 --- a/Parasitemia/Parasitemia/MatchingEllipses.fs +++ b/Parasitemia/Parasitemia/MatchingEllipses.fs @@ -12,8 +12,7 @@ open Utils // Do not take in account matching score below this when two ellipses are matched. let matchingScoreThreshold1 = 0.6 -// All ellipses with a score below this are removed. -let matchingScoreThreshold2 = 2. +let scaleOverlapTest = 0.8 type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = let mutable matchingScore = matchingScore @@ -36,6 +35,9 @@ type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = type MatchingEllipses (radiusMin: float) = let ellipses = List() + // All ellipses with a score below this are removed. + let matchingScoreThreshold2 = 20. * radiusMin + member this.Add (e: Ellipse) = ellipses.Add(EllipseScoreFlaggedKd(0.0, e)) @@ -69,14 +71,14 @@ type MatchingEllipses (radiusMin: float) = let matchingScore = 2.0 * commonArea / (areaE + areaOther) if matchingScore >= matchingScoreThreshold1 then - other.AddMatchingScore(matchingScore) - e.AddMatchingScore(matchingScore) + other.AddMatchingScore(matchingScore * e.Ellipse.Perimeter) + e.AddMatchingScore(matchingScore * other.Ellipse.Perimeter) | _ -> () // 3) Sort ellipses by their score. ellipses.Sort(fun e1 e2 -> e2.MatchingScore.CompareTo(e1.MatchingScore)) - // 4) Remove ellipses wich have a low score. + // 4) Remove ellipses with a low score. let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.0, 0.0, 0.0, 0.0, 0.0)), { new IComparer with member this.Compare(e1, e2) = e2.MatchingScore.CompareTo(e1.MatchingScore) }) |> abs @@ -98,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.Scale(0.8).Contains other.Ellipse.Cx other.Ellipse.Cy + if e.Ellipse.Scale(scaleOverlapTest).Contains other.Ellipse.Cx other.Ellipse.Cy then other.Removed <- true ellipses.RemoveAll(fun e -> e.Removed) |> ignore