let infection = parasites.infection.Copy() // To avoid to modify the parameter.
// This is the minimum window size to check if other ellipses touch 'e'.
- let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCMax) * config.Parameters.scale
- KdTree.maxX = e.Cx + (e.A + config.RBCMax) * config.Parameters.scale
- KdTree.minY = e.Cy - (e.A + config.RBCMax) * config.Parameters.scale
- KdTree.maxY = e.Cy + (e.A + config.RBCMax) * config.Parameters.scale }
+ let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCMaxRadius) * config.Parameters.scale
+ KdTree.maxX = e.Cx + (e.A + config.RBCMaxRadius) * config.Parameters.scale
+ KdTree.minY = e.Cy - (e.A + config.RBCMaxRadius) * config.Parameters.scale
+ KdTree.maxY = e.Cy + (e.A + config.RBCMaxRadius) * config.Parameters.scale }
// The minimum window to contain a given ellipse.
let ellipseWindow (e: Ellipse) =
let c = PointD(e.Cx, e.Cy)
for d1 in lines do
let d2 = Utils.lineFromTwoPoints c p
- let p' = Utils.pointFromTwoLines d1 d2
- yield sign (c.X - p.X) <> sign (c.X - p'.X) || Utils.squaredDistanceTwoPoints c p' > Utils.squaredDistanceTwoPoints c p // 'false' -> the point is owned by another ellipse.
+ if d2.Valid
+ then
+ let p' = Utils.pointFromTwoLines d1 d2
+ yield sign (c.X - p.X) <> sign (c.X - p'.X) || Utils.squaredDistanceTwoPoints c p' > Utils.squaredDistanceTwoPoints c p // 'false' -> the point is owned by another ellipse.
+ else
+ yield true
} |> Seq.forall id
ellipsesWithNeigbors
sqrt (((float sumCoords_x) / (float nbElement) - e.Cx) ** 2.0 + ((float sumCoords_y) / (float nbElement) - e.Cy) ** 2.0) > e.A * config.maxOffcenter *)
then
Peculiar
- elif infectedPixels.Count > config.Parameters.infectionPixelsRequired
+ elif infectedPixels.Count > config.Parameters.parasitePixelsRequired
then
let infectionToRemove = ImgTools.connectedComponents parasites.stain infectedPixels
for p in infectionToRemove do