X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FParasitesMarker.fs;h=720488d8bcc61e9322f061e651d6f20a539d90cb;hb=6b550c3faf4dea77738fa5c27cd9af277f45549c;hp=b50f7e9b3544729f7c2e318c0865466cf28afdd4;hpb=dcf3645b3426991237567e90bab9806a9c111cd1;p=master-thesis.git diff --git a/Parasitemia/Parasitemia/ParasitesMarker.fs b/Parasitemia/Parasitemia/ParasitesMarker.fs index b50f7e9..720488d 100644 --- a/Parasitemia/Parasitemia/ParasitesMarker.fs +++ b/Parasitemia/Parasitemia/ParasitesMarker.fs @@ -18,11 +18,10 @@ type Result = { // * 'Stain' corresponds to the stain around the parasites. // * 'Infection' corresponds to the parasite. It shouldn't contain thrombocytes. let findMa (green: Image) (filteredGreen: Image) (config: Config.Config) : Result * Image * Image = - // We use the filtered image to find the dark stain. - let kmediansResults = logTime "Finding fg/bg (k-medians)" (fun () -> KMedians.kmedians filteredGreen 1.0) + let kmediansResults = logTime "Finding fg/bg (k-medians)" (fun () -> KMedians.kmedians filteredGreen) 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) + let darkStain = d_fg.Cmp(median_bg * float config.Parameters.darkStainLevel, CvEnum.CmpType.GreaterThan) darkStain._And(filteredGreen.Cmp(median_fg, CvEnum.CmpType.LessThan)) darkStain._And(fg) @@ -50,31 +49,26 @@ let findMa (green: Image) (filteredGreen: Image) ( // * '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) (config: Config.Config) : Result * Image * Image = - - let filteredGreenWithoutInfection = filteredGreen.Copy() - ImgTools.areaClose filteredGreenWithoutInfection (int config.InfectionArea) +let find (filteredGreen: Image) (config: Config.Config) : Result * Image = + use filteredGreenWithoutInfection = filteredGreen.Copy() + ImgTools.areaCloseF filteredGreenWithoutInfection (int config.InfectionArea) let filteredGreenWithoutStain = filteredGreenWithoutInfection.Copy() - ImgTools.areaClose filteredGreenWithoutStain (int config.StainArea) + ImgTools.areaCloseF filteredGreenWithoutStain (int config.StainArea) // We use the filtered image to find the dark stain. + let _, mean_fg, mean_bg = + let hist = ImgTools.histogramImg filteredGreenWithoutInfection 300 + ImgTools.otsu hist - // With K-Means. - let kmeansResults = logTime "Finding fg/bg (k-means)" (fun () -> KMeans.kmeans (filteredGreenWithoutInfection.Convert()) 1.0) - let { KMeans.mean_bg = value_bg; KMeans.mean_fg = value_fg; KMeans.d_fg = d_fg } = kmeansResults - - // With K-Medians. - (* let kmediansResults = logTime "Finding fg/bg (k-medians)" (fun () -> KMedians.kmedians (filteredGreenWithoutInfection.Convert()) 1.0) // FIXME: avoid converting this again in MainAnalysis - let { KMedians.median_bg = value_bg; KMedians.median_fg = value_fg; KMedians.d_fg = d_fg } = kmediansResults *) + let darkStain = filteredGreenWithoutInfection.Cmp(-(float mean_bg) * config.Parameters.darkStainLevel + (float mean_fg), CvEnum.CmpType.LessThan) - let darkStain = d_fg.Cmp(value_bg * config.Parameters.darkStainLevel, CvEnum.CmpType.GreaterThan) - darkStain._And(filteredGreenWithoutInfection.Cmp(value_fg, CvEnum.CmpType.LessThan)) - - let marker (img: Image) (closed: Image) (level: float) : Image = - let diff = closed - (img * level) + let marker (img: Image) (closed: Image) (level: float) : Image = + let diff = img.Copy() + diff._Mul(level) + CvInvoke.Subtract(closed, diff, diff) diff._ThresholdBinary(Gray(0.0), Gray(255.)) - diff + diff.Convert() let infectionMarker = marker filteredGreen filteredGreenWithoutInfection config.Parameters.infectionLevel let stainMarker = marker filteredGreenWithoutInfection filteredGreenWithoutStain config.Parameters.stainLevel @@ -82,13 +76,6 @@ let find (filteredGreen: Image) (filteredGreenFloat: Image