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.RBCMaxRadius)
- KdTree.maxX = e.Cx + (e.A + config.RBCMaxRadius)
- KdTree.minY = e.Cy - (e.A + config.RBCMaxRadius)
- KdTree.maxY = e.Cy + (e.A + config.RBCMaxRadius) }
+ let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCRadius.Max)
+ KdTree.maxX = e.Cx + (e.A + config.RBCRadius.Max)
+ KdTree.minY = e.Cy - (e.A + config.RBCRadius.Max)
+ KdTree.maxY = e.Cy + (e.A + config.RBCRadius.Max) }
// The minimum window to contain a given ellipse.
let ellipseWindow (e: Ellipse) =
// We reverse the list to get the lower score ellipses first.
let ellipsesWithNeigbors = ellipses |> List.map (fun e -> e, neighbors e) |> List.rev
-
// 2) Remove ellipses touching the edges.
for e in ellipses do
if e.isOutside w_f h_f then e.Removed <- true
// 3) Remove ellipses with a high standard deviation (high contrast).
-
- // CvInvoke.Normalize(img, img, 0.0, 255.0, CvEnum.NormType.MinMax) // Not needed.
let imgData = img.Data
- let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.StandardDeviation(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] })
if stdDeviation > globalStdDeviation * config.Parameters.standardDeviationMaxRatio then
e.Removed <- true
+
// 4) Remove ellipses with little area.
- let minArea = config.RBCMinArea
+ let minArea = config.RBCRadius.MinArea
for e, neighbors in ellipsesWithNeigbors do
if not e.Removed
then
Some { cellClass = cellClass
center = Point(roundInt e.Cx, roundInt e.Cy)
+ infectedArea = infectedPixels.Count
+ stainArea = stainPixels
elements = elements })