X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FMatchingEllipses.fs;h=3ed8ad6ac06bd6fda61bcd4bde7d7b5723a99878;hp=c7a06279be6c7bb375098543ad3993bc743dbe5a;hb=c4a76a01f62568c6353396ff85551a3151fc5236;hpb=94fbffc758bf0299b077e344ebcbecca408ae564 diff --git a/Parasitemia/ParasitemiaCore/MatchingEllipses.fs b/Parasitemia/ParasitemiaCore/MatchingEllipses.fs index c7a0627..3ed8ad6 100644 --- a/Parasitemia/ParasitemiaCore/MatchingEllipses.fs +++ b/Parasitemia/ParasitemiaCore/MatchingEllipses.fs @@ -9,6 +9,12 @@ open System.Collections.Generic open Types open Utils +// All ellipses with a score below this are removed. +let matchingScoreThreshold = 0.4f +let matchingScorePower = 20.f +let windowSizeRadiusFactor = 1.f / 2.f +let minimumDistanceFromCenterRadiusFactor = 1.f / 3.f + type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) = let mutable matchingScore = matchingScore @@ -29,9 +35,6 @@ type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) = type MatchingEllipses (radius: float32) = let ellipses = List() - // All ellipses with a score below this are removed. - let matchingScoreThreshold = 0.4f - member this.Add (e: Ellipse) = ellipses.Add(EllipseScoreFlaggedKd(0.f, e)) @@ -47,7 +50,7 @@ type MatchingEllipses (radius: float32) = let tree = KdTree.Tree.BuildTree (List.ofSeq ellipses) // 2) Compute the matching score of each ellipses. - let windowSize = radius / 3.f + let windowSize = radius * windowSizeRadiusFactor for e in ellipses do e.Processed <- true let areaE = e.Ellipse.Area @@ -63,7 +66,7 @@ type MatchingEllipses (radius: float32) = | 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 + let matchingScore = (2.f * overlapArea / (areaE + areaOther)) ** matchingScorePower other.AddMatchingScore(matchingScore) e.AddMatchingScore(matchingScore) | _ -> () @@ -82,7 +85,7 @@ type MatchingEllipses (radius: float32) = if not other.Removed && e.MatchingScore > other.MatchingScore then // Case where ellipses are too close. - if distanceTwoPoints (PointF(e.Ellipse.Cx, e.Ellipse.Cy)) (PointF(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)) < minimumDistanceFromCenterRadiusFactor * e.Ellipse.B then other.Removed <- true else