X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;ds=sidebyside;f=Parasitemia%2FParasitemia%2FMatchingEllipses.fs;h=da74c65655c396bba8a4bd241ccee4ddf2283ddb;hb=10afa9a402eb88c8e073fe8b0d607faa25230eef;hp=8a1b4f8e89ffc26139e7024bc2cba1baad59ca32;hpb=5b68d946369f998865d2dd330fd3b374b2b9a0ad;p=master-thesis.git diff --git a/Parasitemia/Parasitemia/MatchingEllipses.fs b/Parasitemia/Parasitemia/MatchingEllipses.fs index 8a1b4f8..da74c65 100644 --- a/Parasitemia/Parasitemia/MatchingEllipses.fs +++ b/Parasitemia/Parasitemia/MatchingEllipses.fs @@ -10,7 +10,7 @@ open Utils let matchingScoreThreshold1 = 0.6 -let matchingScoreThreshold2 = 1.0 +let matchingScoreThreshold2 = 1. type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = let mutable matchingScore = matchingScore @@ -24,18 +24,21 @@ type private EllipseScoreFlaggedKd (matchingScore: float, e: Ellipse) = member val Processed = false with get, set member val Removed = false with get, set - interface KdTree.I2DCoords with + interface KdTree.I2DCoords with member this.X = this.Ellipse.Cx member this.Y = this.Ellipse.Cy - + type MatchingEllipses (radiusMin: float) = let ellipses = List() - - member this.Add (e: Ellipse) = + + member this.Add (e: Ellipse) = ellipses.Add(EllipseScoreFlaggedKd(0.0, e)) member this.Ellipses : Ellipse list = + List.ofSeq ellipses |> List.map (fun e -> e.Ellipse) + + member this.PrunedEllipses : Ellipse list = if ellipses.Count = 0 then [] @@ -43,13 +46,13 @@ type MatchingEllipses (radiusMin: float) = // 1) Create a kd-tree from the ellipses list. let tree = KdTree.Tree.BuildTree (List.ofSeq ellipses) - // 2) Compute the matching score of each ellipses. + // 2) Compute the matching score of each ellipses. let windowSize = radiusMin 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.maxX = e.Ellipse.Cx + windowSize / 2.0 KdTree.minY = e.Ellipse.Cy - windowSize / 2.0 KdTree.maxY = e.Ellipse.Cy + windowSize / 2.0 } for other in tree.Search window do @@ -68,7 +71,7 @@ type MatchingEllipses (radiusMin: float) = // 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 wich have 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 @@ -84,12 +87,12 @@ type MatchingEllipses (radiusMin: float) = if not e.Removed then let window = { KdTree.minX = e.Ellipse.Cx - e.Ellipse.A - KdTree.maxX = e.Ellipse.Cx + e.Ellipse.A + KdTree.maxX = e.Ellipse.Cx + e.Ellipse.A KdTree.minY = e.Ellipse.Cy - e.Ellipse.A KdTree.maxY = e.Ellipse.Cy + e.Ellipse.A } for other in tree.Search window do if not other.Removed && other.MatchingScore < e.MatchingScore - then + then if e.Ellipse.Contains other.Ellipse.Cx other.Ellipse.Cy then other.Removed <- true @@ -97,5 +100,5 @@ type MatchingEllipses (radiusMin: float) = List.ofSeq ellipses |> List.map (fun e -> e.Ellipse) - +