X-Git-Url: http://git.euphorik.ch/?p=master-thesis.git;a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FImageAnalysis.fs;h=feb427dff9567383629c46fb359efdd333883835;hp=1215965e961deb67086d2b339cf74f88be0199e3;hb=d9a6e072ecf299db691c05bb559a71265f812ba3;hpb=ba64921fb9a0c36cd8cf802cbf1b2c0f79bc25f6 diff --git a/Parasitemia/Parasitemia/ImageAnalysis.fs b/Parasitemia/Parasitemia/ImageAnalysis.fs index 1215965..feb427d 100644 --- a/Parasitemia/Parasitemia/ImageAnalysis.fs +++ b/Parasitemia/Parasitemia/ImageAnalysis.fs @@ -11,13 +11,13 @@ open ImgTools open Config open Types -type Result = { +(*type Result = { RBCPositions : Point list infectedRBCPositions : Point list img: Image -} +}*) -let doAnalysis (img: Image) (config: Config) : Result = +let doAnalysis (img: Image) (config: Config) : Classifier.Cell list = let imgFloat = img.Convert() use scaledImg = if config.scale = 1.0 then imgFloat else imgFloat.Resize(config.scale, CvEnum.Inter.Area) @@ -41,7 +41,7 @@ let doAnalysis (img: Image) (config: Config) : Result = //let test = greenMatrix.[10, 10] use filteredGreen = (gaussianFilter green config.doGSigma1) - config.doGLowFreqPercentageReduction * (gaussianFilter green config.doGSigma2) - + use sobelKernel = new ConvolutionKernelF(array2D [[ 1.0f; 0.0f; -1.0f ] [ 2.0f; 0.0f; -2.0f ] @@ -75,21 +75,38 @@ let doAnalysis (img: Image) (config: Config) : Result = use magnitudesByte = ((magnitudes / !max) * 255.0).Convert() // Otsu from OpenCV only support 'byte'. use edges = new Matrix(xEdges.Size) - let threshold = CvInvoke.Threshold(magnitudesByte, edges, 0.0, 1.0, CvEnum.ThresholdType.Otsu ||| CvEnum.ThresholdType.Binary) - thin edges - removeArea edges 12 + CvInvoke.Threshold(magnitudesByte, edges, 0.0, 1.0, CvEnum.ThresholdType.Otsu ||| CvEnum.ThresholdType.Binary) |> ignore + + logTime "Finding edges" (fun() -> + thin edges) + + logTime "Removing small connected components" (fun () -> + removeArea edges 12) saveMat (edges * 255.0) "edges.png" + + let kmediansResults = KMedians.kmedians filteredGreen 1.0 + + let parasites = ParasitesMarker.find green filteredGreen kmediansResults config + + saveImg parasites.darkStain "parasites_dark_stain.png" + saveImg parasites.stain "parasites_stain.png" + saveImg parasites.infection "parasites_infection.png" + let radiusRange = config.scale * 20.0, config.scale * 40.0 let windowSize = roundInt (1.6 * (snd radiusRange)) - let factorNbPick = 1.0; - let ellipses = Ellipse.find edges xEdges yEdges radiusRange windowSize factorNbPick - - drawEllipse img (List.head ellipses) (Bgr(0.0, 255.0, 255.0)) - saveImg img "ellipses.png" - - { RBCPositions = []; infectedRBCPositions = []; img = img } + let factorNbPick = 1.5 + let ellipses = logTime "Finding ellipses" (fun () -> + Ellipse.find edges xEdges yEdges radiusRange windowSize factorNbPick) |> List.filter (fun e -> not (e.CutAVericalLine 0.0) && + not (e.CutAVericalLine (float img.Width)) && + not (e.CutAnHorizontalLine 0.0) && + not (e.CutAnHorizontalLine (float img.Height))) + + drawEllipses img ellipses (Bgr(0.0, 255.0, 255.0)) + //saveImg img "ellipses.png" + + Classifier.findCells ellipses parasites kmediansResults.fg //