X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FParasitesMarker2.fs;h=42645b4899f6a6ae55d4d7a02bb027d2dca1a65d;hb=785a7ea4885e87d76f0b1fb1c715230a08389558;hp=17a032d81efc42a8c1435a0c2659e577364f9c03;hpb=6d99ab0dadc57e91cd846844b620fc90b52a2f96;p=master-thesis.git diff --git a/Parasitemia/Parasitemia/ParasitesMarker2.fs b/Parasitemia/Parasitemia/ParasitesMarker2.fs index 17a032d..42645b4 100644 --- a/Parasitemia/Parasitemia/ParasitesMarker2.fs +++ b/Parasitemia/Parasitemia/ParasitesMarker2.fs @@ -1,10 +1,13 @@ module ParasitesMarker2 open System.Drawing +open System.Linq open Emgu.CV open Emgu.CV.Structure +open Utils + type Result = { darkStain: Image infection: Image @@ -14,31 +17,45 @@ type Result = { // * 'Dark stain' corresponds to the colored pixel, it's independent of the size of the areas. // * 'Stain' corresponds to the stain around the parasites. // * 'Infection' corresponds to the parasite. It shouldn't contain thrombocytes. -let find (filteredGreen: Image) (filteredGreenFloat: Image) (kmediansResult: KMedians.Result) (config: Config.Config) : Result * Image * Image = +let find (filteredGreen: Image) (filteredGreenFloat: Image) (config: Config.Config) : Result * Image * Image = + + let filteredGreenWithoutInfection = filteredGreen.Copy() + ImgTools.areaClose filteredGreenWithoutInfection (int config.InfectionArea) + + let filteredGreenWithoutStain = filteredGreenWithoutInfection.Copy() + ImgTools.areaClose filteredGreenWithoutStain (int config.StainArea) // We use the filtered image to find the dark stain. - let { KMedians.fg = fg; KMedians.median_bg = median_bg; KMedians.median_fg = median_fg; KMedians.d_fg = d_fg } = kmediansResult + let kmediansResults = logTime "Finding fg/bg (k-medians)" (fun () -> KMedians.kmedians (filteredGreenWithoutInfection.Convert()) 1.0) // FIXME: avoid converting again this in MainAnalysis + let { KMedians.fg = fg; KMedians.median_bg = median_bg; KMedians.median_fg = median_fg; KMedians.d_fg = d_fg } = kmediansResults let darkStain = d_fg.Cmp(median_bg * config.Parameters.darkStainLevel, CvEnum.CmpType.GreaterThan) - darkStain._And(filteredGreenFloat.Cmp(median_fg, CvEnum.CmpType.LessThan)) + darkStain._And(filteredGreenWithoutInfection.Cmp(median_fg, CvEnum.CmpType.LessThan)) - let marker (area: int) (threshold: float) : Image * Image = - let closed = filteredGreen.Copy() - ImgTools.areaClose closed area - let diff = closed - filteredGreen + let marker (img: Image) (closed: Image) (level: float) : Image = + let diff = closed - img let min = ref [| 0. |] let minLocation = ref <| [| Point() |] let max = ref [| 0. |] let maxLocation = ref <| [| Point() |] diff.MinMax(min, max, minLocation, maxLocation) + let max = (!max).[0] + + let threshold = 0.2 * max + let diff' = diff - threshold + + let m = MathNet.Numerics.Statistics.StreamingStatistics.Mean(seq { + for m in ImgTools.findMaxima diff' do + let p = m.First() + yield diff'.Data.[p.Y, p.X, 0] |> float }) + threshold - let valueThreshold = if (!max).[0] * threshold < 0.1 * (median_bg - median_fg) then 0.1 * (median_bg - median_fg) else (!max).[0] * threshold + let valueThreshold = m * level diff._ThresholdBinary(Gray(valueThreshold), Gray(255.)) - diff, closed + diff - let infectionMarker, filteredGreenWithoutInfection = marker (int config.InfectionArea) config.Parameters.infectionLevel - let stainMarker, filteredGreenWithoutStain = marker (int config.StainArea) config.Parameters.stainLevel + let infectionMarker = marker filteredGreen filteredGreenWithoutInfection config.Parameters.infectionLevel + let stainMarker = marker filteredGreenWithoutInfection filteredGreenWithoutStain config.Parameters.stainLevel { darkStain = darkStain infection = infectionMarker