X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FMatchingEllipses.fs;h=d4a6a41c72c9ec96a6c62d5d2358b8311aeb41c7;hb=000e7091983f20ef75d0eba9bf1c865c76483f24;hp=c7a06279be6c7bb375098543ad3993bc743dbe5a;hpb=94fbffc758bf0299b077e344ebcbecca408ae564;p=master-thesis.git diff --git a/Parasitemia/ParasitemiaCore/MatchingEllipses.fs b/Parasitemia/ParasitemiaCore/MatchingEllipses.fs index c7a0627..d4a6a41 100644 --- a/Parasitemia/ParasitemiaCore/MatchingEllipses.fs +++ b/Parasitemia/ParasitemiaCore/MatchingEllipses.fs @@ -9,6 +9,13 @@ open System.Collections.Generic open Types open Utils +// All ellipses with a score below this are removed. +let matchingScoreThresholdPerRadiusUnit = 0.07f // For a radius of 1. // 0.25 +let matchingScorePower = 20.f +let windowSizeRadiusFactor = 1.f / 2.f // Used when searching for neighbor ellipses. +let minimumDistanceFromCenterRadiusFactor = 1.f / 3.f +let minimumAreaFactor = 1.1f; + type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) = let mutable matchingScore = matchingScore @@ -29,9 +36,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 +51,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,12 +67,13 @@ 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) | _ -> () // 3) Remove ellipses whose center is near the center of another ellipse with a better score. + let matchingScoreThreshold = matchingScoreThresholdPerRadiusUnit * radius for e in ellipses do if e.MatchingScore < matchingScoreThreshold then @@ -82,13 +87,13 @@ 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 // Case where ellipses are overlapped. match EEOver.EEOverlapArea e.Ellipse other.Ellipse with - | Some (overlapArea, _, _) when e.Ellipse.Area < 1.1f * overlapArea || other.Ellipse.Area < 1.1f * overlapArea -> + | Some (overlapArea, _, _) when e.Ellipse.Area < minimumAreaFactor * overlapArea || other.Ellipse.Area < minimumAreaFactor * overlapArea -> other.Removed <- true | _ -> ()