- let neighbors (e: Ellipse) : (EllipseFlaggedKd * PointD * PointD) list =
- tree.Search (searchRegion e)
- // We only keep the ellipses touching 'e'.
- |> List.choose (fun otherE ->
- match EEOver.EEOverlapArea e otherE with
- | Some (area, px, py) when area > 0.0 && px.Length >= 2 && py.Length >= 2 ->
- Some (otherE, PointD(px.[0], py.[0]), PointD(px.[1], py.[1]))
- | _ ->
- None )
-
- let ellipsesWithNeigbors = ellipses |> List.map (fun e -> e, neighbors e)
-
- // 2) Remove ellipses with a high standard deviation (high contrast).
- let globalStdDiviation = MathNet.Numerics.Statistics.StreamingStatistics.StandardDeviation(seq {
- for y in 0 .. h - 1 do
- for x in 0 .. w - 1 do
- yield img.Data.[y, x, 0] |> float })
-
- for e, neighbors in List.rev ellipsesWithNeigbors do
- let minX, minY, maxX, maxY = ellipseWindow e
-
- let stdDiviation = MathNet.Numerics.Statistics.StreamingStatistics.StandardDeviation(seq {
- for y in (if minY < 0 then 0 else minY) .. (if maxY >= h then h - 1 else maxY) do
- for x in (if minX < 0 then 0 else minX) .. (if maxX >= w then w - 1 else maxX) do
- let p = PointD(float x, float y)
- if pixelOwnedByE p e (neighbors |> List.choose (fun (otherE, p1, p2) -> if otherE.Removed then None else Some (Utils.lineFromTwoPoints p1 p2)))
+ let neighbors (e: EllipseFlaggedKd) : (EllipseFlaggedKd * PointD * PointD) list =
+ if not e.Removed
+ then
+ tree.Search (searchRegion e)
+ // We only keep the ellipses touching 'e'.
+ |> List.choose (fun otherE ->
+ if e <> otherE