X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemiaCore%2FParasitesMarker.fs;h=e3c3ca2b3c8e17c2ddf8f5b381192a3c3bb41fe2;hp=73f9fe1da720cc9fe8bb215c823ebee636f87ee5;hb=828e126c88524d3dc123abc966a132532aed118b;hpb=3b645f8ff5259f88a33ffbd9a63b10a8640c439f diff --git a/Parasitemia/ParasitemiaCore/ParasitesMarker.fs b/Parasitemia/ParasitemiaCore/ParasitesMarker.fs index 73f9fe1..e3c3ca2 100644 --- a/Parasitemia/ParasitemiaCore/ParasitesMarker.fs +++ b/Parasitemia/ParasitemiaCore/ParasitesMarker.fs @@ -9,61 +9,23 @@ open Emgu.CV.Structure open Utils type Result = { - darkStain: Image - infection: Image - stain: Image } + darkStain: Image // Colored pixel, it's independent of the size of the areas. It corresponds to white cells, schizontes, gametocytes, throphozoites. + nucleus: Image // Parasite nucleus. It may contain some debris. It shouldn't contain thrombocytes or larger elements. + cytoplasm: Image } // Parasite cytoplasm. -// Create three binary markers : -// * '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 findMa (green: Image) (filteredGreen: Image) (config: Config.Config) : Result * Image * Image = - // We use the filtered image to find the dark stain. - let kmediansResults = 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 * float config.Parameters.darkStainLevel, CvEnum.CmpType.GreaterThan) - darkStain._And(filteredGreen.Cmp(median_fg, CvEnum.CmpType.LessThan)) - darkStain._And(fg) - - let fgFloat = (fg / 255.0).Convert() - use greenWithoutBg = ImgTools.gaussianFilter green 1.0 - greenWithoutBg.SetValue(Gray(0.0), fg.Not()) - - let findSmears (sigma: float) (level: float) : Image = - use greenWithoutBgSmoothed = ImgTools.gaussianFilter greenWithoutBg sigma - use fgSmoothed = ImgTools.gaussianFilter fgFloat sigma - let smears = (greenWithoutBg.Mul(fgSmoothed)).Cmp(greenWithoutBgSmoothed.Mul(level), CvEnum.CmpType.LessThan) - smears._And(fg) - smears - - let tmp = filteredGreen.Convert() - - { darkStain = darkStain; - stain = findSmears 10. 0.9 - infection = findSmears 2.2 0.87 }, - tmp, - tmp - -// Create three binary markers : -// * '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 (img: Image) (config: Config.Config) : Result * Image * Image = - let imgFilteredInfection = ImgTools.gaussianFilter img config.LPFStandardDeviationParasite - let filteredGreenWithoutInfection = imgFilteredInfection.Copy() - ImgTools.areaCloseF filteredGreenWithoutInfection (roundInt config.RBCRadius.NucleusArea) + let imgFilteredParasite = ImgTools.gaussianFilter img config.LPFStandardDeviationParasite - (* - let filteredGreenWithoutStain = filteredGreenWithoutInfection.Copy() - ImgTools.areaCloseF filteredGreenWithoutStain (int config.RBCRadius.StainArea) *) + let filteredGreenWithoutNucleus = imgFilteredParasite.Copy() + ImgTools.areaCloseF filteredGreenWithoutNucleus (roundInt config.RBCRadius.NucleusArea) let darkStain = // We use the filtered image to find the dark stain. let _, mean_fg, mean_bg = - let hist = ImgTools.histogramImg filteredGreenWithoutInfection 300 + let hist = ImgTools.histogramImg filteredGreenWithoutNucleus 300 ImgTools.otsu hist - filteredGreenWithoutInfection.Cmp(-(float mean_bg) * config.Parameters.darkStainLevel + (float mean_fg), CvEnum.CmpType.LessThan) + filteredGreenWithoutNucleus.Cmp(-(float mean_bg) * config.Parameters.darkStainLevel + (float mean_fg), CvEnum.CmpType.LessThan) let marker (img: Image) (closed: Image) (level: float) : Image = let diff = img.Copy() @@ -72,13 +34,9 @@ let find (img: Image) (config: Config.Config) : Result * Image() - let infectionMarker = marker imgFilteredInfection filteredGreenWithoutInfection (1. / config.Parameters.infectionSensitivity) - - let imgFilteredStain = ImgTools.gaussianFilter img config.LPFStandardDeviationStain - let areaOpening = int <| config.RBCRadius.Area * config.Parameters.ratioAreaPaleCenter - //ImgTools.areaOpenF imgFilteredStain areaOpening + let nucleusMarker = marker imgFilteredParasite filteredGreenWithoutNucleus (1. / config.Parameters.infectionSensitivity) - let filteredGreenWithoutStain = imgFilteredStain.CopyBlank() + let filteredGreenWithoutCytoplasm = imgFilteredParasite.CopyBlank() let kernelSize = let size = roundInt (config.RBCRadius.Pixel / 5.f) if size % 2 = 0 then size + 1 else size @@ -89,18 +47,13 @@ let find (img: Image) (config: Config.Config) : Result * Image