+ ellipsesWithNeigbors
+ |> List.choose (
+ fun (e, neighbors) ->
+ if e.State = CellState.Removed then
+ None
+ else
+ let minX, minY, maxX, maxY = ellipseWindow e
+
+ let nucleusPixels = List<Point>()
+ let parasitePixels = List<Point>()
+
+ let mutable nbElement = 0
+
+ let elements = new Matrix<byte>(maxY - minY + 1, maxX - minX + 1)
+ for y = minY to maxY do
+ for x = minX to maxX do
+ let p = PointF(float32 x, float32 y)
+ if pixelOwnedByE p e neighbors then
+ elements.[y - minY, x - minX] <- 1uy
+ nbElement <- nbElement + 1
+
+ if nucleusData.[y, x, 0] > 0uy then
+ nucleusPixels.Add(Point(x, y))
+
+ if parasiteData.[y, x, 0] > 0uy then
+ parasitePixels.Add(Point(x, y))
+
+ let parasiteArea =
+ if nucleusPixels.Count > 0 then
+ seq {
+ for parasitePixel in parasitePixels do
+ if nucleusPixels.Exists(fun p -> pown (p.X - parasitePixel.X) 2 + pown (p.Y - parasitePixel.Y) 2 <= diameterParasiteSquared) then
+ yield 1
+ } |> Seq.sum
+ else
+ 0
+
+ let cellClass =
+ if e.State = CellState.Peculiar then
+ Peculiar
+
+ elif nucleusPixels.Count > 0 && parasiteArea >= minimumParasiteArea then
+ let infectionToRemove = Morpho.connectedComponents parasites.parasite nucleusPixels
+ for p in infectionToRemove do
+ nucleusData.[p.Y, p.X, 0] <- 0uy
+ InfectedRBC
+
+ else
+ HealthyRBC
+
+ Some
+ {
+ cellClass = cellClass
+ center = Point(roundInt e.Cx, roundInt e.Cy)
+ nucleusArea = if cellClass = InfectedRBC then nucleusPixels.Count else 0
+ parasiteArea = parasiteArea
+ elements = elements
+ }
+ )