X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FClassifier.fs;h=9b247f43db4599e702ce0b469659d5e881773765;hp=36e285182920e8fd1384f912bdaf7b460e142b82;hb=2d712781def419c9acc98368f7102b19b064f16d;hpb=d715615d0b1da40fd10e9dbabbd4530cd5125a19 diff --git a/Parasitemia/ParasitemiaCore/Classifier.fs b/Parasitemia/ParasitemiaCore/Classifier.fs index 36e2851..9b247f4 100644 --- a/Parasitemia/ParasitemiaCore/Classifier.fs +++ b/Parasitemia/ParasitemiaCore/Classifier.fs @@ -45,7 +45,7 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi 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 @@ -58,7 +58,7 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi )) 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 @@ -91,18 +91,19 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi 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 [] @@ -117,7 +118,7 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi // 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] }) @@ -145,7 +146,7 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi 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 @@ -155,22 +156,24 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi // 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) @@ -191,30 +194,30 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi else let minX, minY, maxX, maxY = ellipseWindow e - let nucleusPixels = List() - let parasitePixels = List() + let nucleusPixels = List () + let parasitePixels = List () let mutable nbElement = 0 - let elements = new Matrix(maxY - minY + 1, maxX - minX + 1) + let elements = new Matrix (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 @@ -236,7 +239,7 @@ let findCells (ellipses : Ellipse list) (parasites : ParasitesMarker.Result) (wi 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