//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 ]
use magnitudesByte = ((magnitudes / !max) * 255.0).Convert<byte>() // Otsu from OpenCV only support 'byte'.
use edges = new Matrix<byte>(xEdges.Size)
- let threshold = CvInvoke.Threshold(magnitudesByte, edges, 0.0, 1.0, CvEnum.ThresholdType.Otsu ||| CvEnum.ThresholdType.Binary)
- thin edges
- removeArea edges 12
+ let threshold = CvInvoke.Threshold(magnitudesByte, edges, 0.0, 1.0, CvEnum.ThresholdType.Otsu ||| CvEnum.ThresholdType.Binary)
+
+// let filteredGreenMat = new Matrix<float32>(filteredGreen.Size)
+// filteredGreen.CopyTo(filteredGreenMat)
+ let parasites = ParasitesMarker.find green filteredGreen config
+
+ saveImg parasites.darkStain "parasites_dark_stain.png"
+ saveImg parasites.stain "parasites_stain.png"
+ saveImg parasites.infection "parasites_infection.png"
+
+ logTime "Finding edges" (fun() ->
+ thin edges)
+
+ logTime "Removing small connected components" (fun () ->
+ removeArea edges 12)
saveMat (edges * 255.0) "edges.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"
+ let factorNbPick = 1.5
+ let ellipses = logTime "Finding ellipses" (fun () ->
+ Ellipse.find edges xEdges yEdges radiusRange windowSize factorNbPick)
+
+ drawEllipses img ellipses (Bgr(0.0, 255.0, 255.0))
+ //saveImg img "ellipses.png"
{ RBCPositions = []; infectedRBCPositions = []; img = img }