X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FParasitesMarker2.fs;h=6afef44a77d5b7feb9239a7c1de484cd507abdaf;hp=17a032d81efc42a8c1435a0c2659e577364f9c03;hb=ca3f764fc93defb480bb9b1c34e9c41447cc07e0;hpb=21ce317bce2e1b58803bbb1be439161251478568 diff --git a/Parasitemia/Parasitemia/ParasitesMarker2.fs b/Parasitemia/Parasitemia/ParasitesMarker2.fs index 17a032d..6afef44 100644 --- a/Parasitemia/Parasitemia/ParasitesMarker2.fs +++ b/Parasitemia/Parasitemia/ParasitesMarker2.fs @@ -5,6 +5,8 @@ open System.Drawing open Emgu.CV open Emgu.CV.Structure +open Utils + type Result = { darkStain: Image infection: Image @@ -14,31 +16,38 @@ 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) (threshold: 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 valueThreshold = if (!max).[0] * threshold < 0.1 * (median_bg - median_fg) then 0.1 * (median_bg - median_fg) else (!max).[0] * threshold + let limitThreshold = 0.1 + let valueThreshold = (*if max < limitThreshold * (median_bg - median_fg) then max / 2. else *) max * threshold 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