X-Git-Url: http://git.euphorik.ch/?a=blobdiff_plain;f=Parasitemia%2FParasitemia%2FClassifier.fs;h=121a7f53d3bbfaddebee7ba2265602c9950d12e7;hb=81d1b86719a1ebaf649c1de4c1364603155a53e1;hp=f0c9d01e4f6ce399df9ed3cde1815e5b8f6afd05;hpb=044b0ae69df3ac565432545b2fa934589016f9bd;p=master-thesis.git diff --git a/Parasitemia/Parasitemia/Classifier.fs b/Parasitemia/Parasitemia/Classifier.fs index f0c9d01..121a7f5 100644 --- a/Parasitemia/Parasitemia/Classifier.fs +++ b/Parasitemia/Parasitemia/Classifier.fs @@ -29,10 +29,10 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img: let infection = parasites.infection.Copy() // To avoid to modify the parameter. // This is the minimum window size to check if other ellipses touch 'e'. - let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCMaxRadius) - KdTree.maxX = e.Cx + (e.A + config.RBCMaxRadius) - KdTree.minY = e.Cy - (e.A + config.RBCMaxRadius) - KdTree.maxY = e.Cy + (e.A + config.RBCMaxRadius) } + let searchRegion (e: Ellipse) = { KdTree.minX = e.Cx - (e.A + config.RBCRadius.Max) + KdTree.maxX = e.Cx + (e.A + config.RBCRadius.Max) + KdTree.minY = e.Cy - (e.A + config.RBCRadius.Max) + KdTree.maxY = e.Cy + (e.A + config.RBCRadius.Max) } // The minimum window to contain a given ellipse. let ellipseWindow (e: Ellipse) = @@ -97,16 +97,13 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img: // We reverse the list to get the lower score ellipses first. let ellipsesWithNeigbors = ellipses |> List.map (fun e -> e, neighbors e) |> List.rev - // 2) Remove ellipses touching the edges. for e in ellipses do if e.isOutside w_f h_f then e.Removed <- true // 3) Remove ellipses with a high standard deviation (high contrast). - - // CvInvoke.Normalize(img, img, 0.0, 255.0, CvEnum.NormType.MinMax) // Not needed. let imgData = img.Data - let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.StandardDeviation(seq { + let globalStdDeviation = MathNet.Numerics.Statistics.Statistics.PopulationStandardDeviation(seq { for y in 0 .. h - 1 do for x in 0 .. w - 1 do yield float imgData.[y, x, 0] }) @@ -127,8 +124,9 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img: if stdDeviation > globalStdDeviation * config.Parameters.standardDeviationMaxRatio then e.Removed <- true + // 4) Remove ellipses with little area. - let minArea = config.RBCMinArea + let minArea = config.RBCRadius.MinArea for e, neighbors in ellipsesWithNeigbors do if not e.Removed then @@ -197,4 +195,6 @@ let findCells (ellipses: Ellipse list) (parasites: ParasitesMarker.Result) (img: Some { cellClass = cellClass center = Point(roundInt e.Cx, roundInt e.Cy) + infectedArea = infectedPixels.Count + stainArea = stainPixels elements = elements })