let pixelOwnedByE (p : PointF) (e : EllipseFlaggedKd) (neighbors : (EllipseFlaggedKd * PointF * PointF) list) =
e.Contains p.X p.Y &&
seq {
- let c = PointF(e.Cx, e.Cy)
+ let c = PointF (e.Cx, e.Cy)
for e', d1 in
(neighbors
)) do
if e'.State = e.State then // Peculiar vs peculiar or RBC vs RBC.
let d2 = lineFromTwoPoints c p
- let c' = PointF(e'.Cx, e'.Cy)
+ let c' = PointF (e'.Cx, e'.Cy)
let v = pointFromTwoLines d1 (lineFromTwoPoints c c')
let case1 = sign (v.X - c.X) <> sign (v.X - c'.X) || Utils.squaredDistanceTwoPoints v c > Utils.squaredDistanceTwoPoints v c'
if not (Single.IsInfinity d2.A) then
if e.State <> CellState.Removed then
tree.Search (searchRegion e)
// We only keep the ellipses touching 'e'.
- |> List.choose (fun otherE ->
- if e <> otherE then
- match EEOver.EEOverlapArea e otherE with
- | Some (_, px, _) when px.Length > 2 ->
- otherE.State <- CellState.Removed
- None
- | Some (area, px, py) when area > 0.f && px.Length = 2 ->
- Some (otherE, PointF(px.[0], py.[0]), PointF(px.[1], py.[1]))
- | _ ->
+ |> List.choose (
+ fun otherE ->
+ if e <> otherE then
+ match EEOver.EEOverlapArea e otherE with
+ | Some (_, px, _) when px.Length > 2 ->
+ otherE.State <- CellState.Removed
+ None
+ | Some (area, px, py) when area > 0.f && px.Length = 2 ->
+ Some (otherE, PointF (px.[0], py.[0]), PointF (px.[1], py.[1]))
+ | _ ->
+ None
+ else
None
- else
- None
)
else
[]
// 3) Remove ellipses with a high standard deviation (high contrast).
// Obsolete. It was useful when the ellipses result quality wasn't good.
(* let imgData = img.Data
- let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.PopulationStandardDeviation(seq {
+ let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.PopulationStandardDeviation (seq {
for y in 0 .. h - 1 do
for x in 0 .. w - 1 do
yield float imgData.[y, x, 0] })
let mutable area = 0
for y = (if minY < 0 then 0 else minY) to (if maxY >= height then height - 1 else maxY) do
for x = (if minX < 0 then 0 else minX) to (if maxX >= width then width - 1 else maxX) do
- let p = PointF(float32 x, float32 y)
+ let p = PointF (float32 x, float32 y)
if pixelOwnedByE p e neighbors then
area <- area + 1
// 5) Define non-rbc (peculiar) cells.
let darkStainData = parasites.darkStain.Data
ellipsesWithNeigbors
- |> List.choose (fun (e, neighbors) ->
- if e.State = CellState.Removed then
- None
- else
- let mutable darkStainPixels = 0
- let mutable nbElement = 0
- let minX, minY, maxX, maxY = ellipseWindow e
- 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
- nbElement <- nbElement + 1
- if darkStainData.[y, x, 0] > 0uy then
- darkStainPixels <- darkStainPixels + 1
+ |> List.choose (
+ fun (e, neighbors) ->
+ if e.State = CellState.Removed then
+ None
+ else
+ let mutable darkStainPixels = 0
+ let mutable nbElement = 0
+ let minX, minY, maxX, maxY = ellipseWindow e
+ 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
+ nbElement <- nbElement + 1
+ if darkStainData.[y, x, 0] > 0uy then
+ darkStainPixels <- darkStainPixels + 1
- if float darkStainPixels > config.Parameters.maxDarkStainRatio * (float nbElement) then Some e else None)
+ if float darkStainPixels > config.Parameters.maxDarkStainRatio * (float nbElement) then Some e else None
+ )
// We do not change the state during the process to avoid to have peculiar neighbors which change the behavior of 'pixelOwnedByE'.
|> List.iter (fun e -> e.State <- CellState.Peculiar)
else
let minX, minY, maxX, maxY = ellipseWindow e
- let nucleusPixels = List<Point>()
- let parasitePixels = List<Point>()
+ let nucleusPixels = List<Point> ()
+ let parasitePixels = List<Point> ()
let mutable nbElement = 0
- let elements = new Matrix<byte>(maxY - minY + 1, maxX - minX + 1)
+ 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)
+ 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))
+ nucleusPixels.Add (Point (x, y))
if parasiteData.[y, x, 0] > 0uy then
- parasitePixels.Add(Point(x, y))
+ 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
+ if nucleusPixels.Exists (fun p -> pown (p.X - parasitePixel.X) 2 + pown (p.Y - parasitePixel.Y) 2 <= diameterParasiteSquared) then
yield 1
} |> Seq.sum
else
Some
{
cellClass = cellClass
- center = Point(roundInt e.Cx, roundInt e.Cy)
+ center = Point (roundInt e.Cx, roundInt e.Cy)
nucleusArea = if cellClass = InfectedRBC then nucleusPixels.Count else 0
parasiteArea = parasiteArea
elements = elements