X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FMatchingEllipses.fs;h=6e571995c0548da9486d8bd2b2e3201b03e65775;hp=2022c2644789f64947f0c99e3f6da33e17f94a6d;hb=044b0ae69df3ac565432545b2fa934589016f9bd;hpb=53440e757b4a4ab2a81b0f6a5dd1a2002c0133ba diff --git a/Parasitemia/Parasitemia/MatchingEllipses.fs b/Parasitemia/Parasitemia/MatchingEllipses.fs index 2022c26..6e57199 100644 --- a/Parasitemia/Parasitemia/MatchingEllipses.fs +++ b/Parasitemia/Parasitemia/MatchingEllipses.fs @@ -10,18 +10,20 @@ open Utils // Do not take in account matching score below this when two ellipses are matched. -let matchingScoreThreshold1 = 0.6 +[] +let matchingScoreThreshold1 = 0.6f -let scaleOverlapTest = 0.8 +[] +let scaleOverlapTest = 0.8f -type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = +type private EllipseScoreFlaggedKd (matchingScore: float32, e: Ellipse) = let mutable matchingScore = matchingScore member this.Ellipse = e member this.MatchingScore = matchingScore - member this.AddMatchingScore(score: float) = + member this.AddMatchingScore(score: float32) = matchingScore <- matchingScore + score member val Processed = false with get, set @@ -32,14 +34,14 @@ type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = member this.Y = this.Ellipse.Cy -type MatchingEllipses (radiusMin: float) = +type MatchingEllipses (radiusMin: float32) = let ellipses = List() // All ellipses with a score below this are removed. - let matchingScoreThreshold2 = 20. * radiusMin + let matchingScoreThreshold2 = 20.f * radiusMin member this.Add (e: Ellipse) = - ellipses.Add(EllipseScoreFlaggedKd(0.0, e)) + ellipses.Add(EllipseScoreFlaggedKd(0.f, e)) member this.Ellipses : Ellipse list = List.ofSeq ellipses |> List.map (fun e -> e.Ellipse) @@ -58,17 +60,17 @@ type MatchingEllipses (radiusMin: float) = for e in ellipses do e.Processed <- true let areaE = e.Ellipse.Area - let window = { KdTree.minX = e.Ellipse.Cx - windowSize / 2.0 - KdTree.maxX = e.Ellipse.Cx + windowSize / 2.0 - KdTree.minY = e.Ellipse.Cy - windowSize / 2.0 - KdTree.maxY = e.Ellipse.Cy + windowSize / 2.0 } + let window = { KdTree.minX = e.Ellipse.Cx - windowSize / 2.f + KdTree.maxX = e.Ellipse.Cx + windowSize / 2.f + KdTree.minY = e.Ellipse.Cy - windowSize / 2.f + KdTree.maxY = e.Ellipse.Cy + windowSize / 2.f } for other in tree.Search window do if not other.Processed then let areaOther = other.Ellipse.Area match EEOver.EEOverlapArea e.Ellipse other.Ellipse with | Some (commonArea, _, _) -> - let matchingScore = 2.0 * commonArea / (areaE + areaOther) + let matchingScore = 2.f * commonArea / (areaE + areaOther) if matchingScore >= matchingScoreThreshold1 then other.AddMatchingScore(matchingScore * e.Ellipse.Perimeter) @@ -79,7 +81,7 @@ type MatchingEllipses (radiusMin: float) = ellipses.Sort(fun e1 e2 -> e2.MatchingScore.CompareTo(e1.MatchingScore)) // 4) Remove ellipses with a low score. - let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.0, 0.0, 0.0, 0.0, 0.0)), + let i = ellipses.BinarySearch(EllipseScoreFlaggedKd(matchingScoreThreshold2, Ellipse(0.f, 0.f, 0.f, 0.f, 0.f)), { new IComparer with member this.Compare(e1, e2) = e2.MatchingScore.CompareTo(e1.MatchingScore) }) |> abs let nbToRemove = ellipses.Count - i