Output logs to AppUser/Roaming/Parasitemia/Logs
[master-thesis.git] / Parasitemia / ParasitemiaCore / Config.fs
index 3089953..e5b853c 100644 (file)
@@ -9,82 +9,79 @@ type Debug =
     | DebugOff
     | DebugOn of string // Output directory.
 
-type Parameters = {
-    rbcDiameter: float<μm>
-    resolution: float<ppi>
+type Parameters =
+    {
+        rbcDiameter : float<μm>
+        resolution : float<ppi>
 
-    averageColor_BG: float32 * float32 * float32 // R * G * B.
-    averageColor_RBC: float32 * float32 * float32 // R * G * B.
-    averageColor_Parasite: float32 * float32 * float32 // R * G * B.
+        ratioAreaPaleCenter : float32 // The area of the second opening is 'ratioSecondAreaOpen' * mean RBC area. It's applied only if greater than 'initialAreaOpen'.
 
-    ratioAreaPaleCenter: float32 // The area of the second opening is 'ratioSecondAreaOpen' * mean RBC area. It's applied only if greater than 'initialAreaOpen'.
+        granulometryRange : float32 // The radius will be seeked from radius - granulometryRange * radius to radius + granulometryRange * radius.
 
-    granulometryRange: float32 // The radius will be seeked from radius - granulometryRange * radius to radius + granulometryRange * radius.
+        minRbcRadius : float32 // Factor of the mean RBC radius.
+        maxRbcRadius : float32 // Factor of the mean RBC radius.
 
-    minRbcRadius: float32 // Factor of the mean RBC radius.
-    maxRbcRadius: float32 // Factor of the mean RBC radius.
+        LPFStandardDeviationParasite : float<μm> // Sigma parameter of the gaussian to remove the high frequency noise.
+        LPFStandardDeviationRBC : float<μm>
 
-    LPFStandardDeviationParasite: float<μm> // Sigma parameter of the gaussian to remove the high frequency noise.
-    LPFStandardDeviationRBC: float<μm>
+        // Ellipse.
+        nbPickElementsMin : int
+        factorNbValidPick : float // The number of computed ellipse per edge pixel.
+        factorNbMaxPick : float
 
-    // Ellipse.
-    factorNbPick: float // The number of computed ellipse per edge pixel.
+        // Parasites detection.
+        darkStainLevel : float // Lower -> more sensitive. Careful about illumination on the borders.
+        maxDarkStainRatio : float // When a cell must own less than this ratio to be a RBC.
 
-    // Parasites detection.
-    darkStainLevel: float // Lower -> more sensitive. Careful about illumination on the borders.
-    maxDarkStainRatio: float // When a cell must own less than this ratio to be a RBC.
+        parasiteRadiusRatio : float32 // The ratio of the parasite radius of the RBC radius.
+        minimumParasiteAreaRatio : float32 // Factor of a RBC area. 0.5 means the half of RBC area.
 
-    parasiteRadiusRatio: float32 // The ratio of the parasite radius of the RBC radius.
-    minimumParasiteAreaRatio: float32 // Factor of a RBC area. 0.5 means the half of RBC area.
+        cytoplasmSizeRatio : float32
+        cytoplasmSensitivity : float // between 0 (the least sensitive) and 1 (the most sensitive).
 
-    cytoplasmSensitivity: float // between 0 (the least sensitive) and 1 (the most sensitive).
+        nucleusAreaRatio : float32 // Factor of a RBC area. 0.5 means the half of RBC area.
+        infectionSensitivity : float // between 0 (the least sensitive) and 1 (the most sensitive).
 
-    nucleusAreaRatio: float32 // Factor of a RBC area. 0.5 means the half of RBC area.
-    infectionSensitivity: float // between 0 (the least sensitive) and 1 (the most sensitive).
+        // [<Obsolete>] standardDeviationMaxRatio: float // The standard deviation of the pixel values of a cell can't be greater than standardDeviationMaxRatio * global standard deviation
+        minimumCellAreaFactor : float32 // Factor of the mean RBC area. A cell with an area below this will be rejected.
+    }
 
-    standardDeviationMaxRatio: float // The standard deviation of the pixel values of a cell can't be greater than standardDeviationMaxRatio * global standard deviation
-    minimumCellAreaFactor: float32 // Factor of the mean RBC area. A cell with an area below this will be rejected.
-}
+let defaultParameters =
+    {
+        rbcDiameter = 7.5<μm>
+        resolution = 230.e3<ppi> // 230.e3<ppi> Correspond to 50X.
 
-let defaultParameters = {
-    rbcDiameter = 8.<μm>
-    resolution = 220.e3<ppi> // 220.e3<ppi> Correspond to 50X.
+        ratioAreaPaleCenter = 2.f / 5.f // The ratio between an RBC area and the area of the its pale center.
 
-    averageColor_BG = 113.3f, 135.3f, 150.3f
-    averageColor_RBC = 94.7f, 80.7f, 99.3f
-    averageColor_Parasite = 76.f, 58.f, 94.f
+        granulometryRange = 0.5f
 
-    (*averageColor_BG = 179.f, 148.f, 121.f
-    averageColor_RBC = 141.f, 96.f, 83.f
-    averageColor_Parasite = 123.f, 89.f, 83.f*)
+        minRbcRadius = -0.23f
+        maxRbcRadius = 0.23f
 
-    ratioAreaPaleCenter = 2.f / 5.f // The ratio between an RBC area and the area of the its pale center.
+        LPFStandardDeviationParasite = 0.15<μm>
+        LPFStandardDeviationRBC = 0.22<μm>
 
-    granulometryRange = 0.5f
+        nbPickElementsMin = 10
+        factorNbValidPick = 0.06 //1.0
+        factorNbMaxPick = 4.
 
-    minRbcRadius = -0.3f
-    maxRbcRadius = 0.3f
+        darkStainLevel = 1.
+        maxDarkStainRatio = 0.1 // 10 %
 
-    LPFStandardDeviationParasite = 0.15<μm>
-    LPFStandardDeviationRBC = 0.2<μm>
+        parasiteRadiusRatio = 0.5f // 50 %
+        minimumParasiteAreaRatio = 0.02f // 2 %
 
-    factorNbPick = 1.0
+        cytoplasmSizeRatio = 1.f / 5.f
+        cytoplasmSensitivity = 0.96
 
-    darkStainLevel = 0.25
-    maxDarkStainRatio = 0.1 // 10 %
+        nucleusAreaRatio = 0.01f // 1.0 %
+        infectionSensitivity = 0.92
 
-    parasiteRadiusRatio = 0.5f // 40 %
+        // standardDeviationMaxRatio = 0.6 // Obsolete.
+        minimumCellAreaFactor = 0.4f
+    }
 
-    minimumParasiteAreaRatio = 0.02f // 2 %
-    cytoplasmSensitivity = 0.96 //  1) 0.91, 2) 0.92
-
-    nucleusAreaRatio = 0.01f // 1.0 %
-    infectionSensitivity = 0.9 // 1) 0.93, 2) 0.94
-
-    standardDeviationMaxRatio = 0.5 // 0.5
-    minimumCellAreaFactor = 0.4f }
-
-type RBCRadius (radius: float32, parameters: Parameters) =
+type RBCRadius (radius : float32, parameters : Parameters) =
     member this.Pixel = radius
     member this.μm : float<μm> =
         1.<px> * (float radius) / parameters.resolution |> inchToμm
@@ -96,48 +93,56 @@ type RBCRadius (radius: float32, parameters: Parameters) =
     member this.MinArea = parameters.minimumCellAreaFactor * this.Area
 
     member this.ParasiteRadius = parameters.parasiteRadiusRatio * radius
+    member this.CytoplasmSize = parameters.cytoplasmSizeRatio * radius
 
     member this.NucleusArea = parameters.nucleusAreaRatio * this.Area
     member this.MinimumParasiteArea = parameters.minimumParasiteAreaRatio * this.Area
 
-    override this.ToString() =
+    override this.ToString () =
         sprintf "%d px (%.1f μm)" (Utils.roundInt <| 2.f * radius) (2. * this.μm)
 
-type Config (param: Parameters) =
-    let RBCadiusInPixels (rbcDiameter: float<μm>) (resolution: float<ppi>) : float32 =
-        let rbcRadiusInch: float<inch> = (μmToInch rbcDiameter) / 2.
-        let rbcRadiusPx: float<px> = resolution * rbcRadiusInch
+type Config (param : Parameters) =
+    let RBCadiusInPixels (rbcDiameter : float<μm>) (resolution : float<ppi>) : float32 =
+        let rbcRadiusInch : float<inch> = (μmToInch rbcDiameter) / 2.
+        let rbcRadiusPx : float<px> = resolution * rbcRadiusInch
         float32 rbcRadiusPx
 
-    let mutable parameters: Parameters = param
-    let mutable rbcRadiusByResolution = RBCRadius(RBCadiusInPixels parameters.rbcDiameter parameters.resolution, parameters)
-    let mutable rbcRadius = RBCRadius(0.f, parameters)
+    let mutable parameters : Parameters = param
+    let mutable rbcRadiusByResolution = RBCRadius (RBCadiusInPixels parameters.rbcDiameter parameters.resolution, parameters)
+    let mutable rbcRadius = RBCRadius (0.f, parameters)
 
-    new () = Config(defaultParameters)
+    new () = Config defaultParameters
 
     member this.Parameters
-        with get() = parameters
-        and set(param) =
+        with get () = parameters
+        and set param =
             parameters <- param
-            rbcRadiusByResolution <- RBCRadius(RBCadiusInPixels parameters.rbcDiameter parameters.resolution, param)
-            rbcRadius <- RBCRadius(rbcRadius.Pixel, param)
+            rbcRadiusByResolution <- RBCRadius (RBCadiusInPixels parameters.rbcDiameter parameters.resolution, param)
+            rbcRadius <- RBCRadius (rbcRadius.Pixel, param)
 
     member val Debug = DebugOff with get, set
 
     member this.LPFStandardDeviationParasite =
-        let stdDeviation: float<px> = (μmToInch parameters.LPFStandardDeviationParasite) * parameters.resolution
+        let stdDeviation : float<px> = (μmToInch parameters.LPFStandardDeviationParasite) * parameters.resolution
         float stdDeviation
 
     member this.LPFStandardDeviationRBC =
-        let stdDeviation: float<px> = (μmToInch parameters.LPFStandardDeviationRBC) * parameters.resolution
+        let stdDeviation : float<px> = (μmToInch parameters.LPFStandardDeviationRBC) * parameters.resolution
         float stdDeviation
 
     member this.RBCRadiusByResolution = rbcRadiusByResolution
     member this.RBCRadius = rbcRadius
 
-    member this.SetRBCRadius (radiusPixel: float32) =
-        rbcRadius <- RBCRadius(radiusPixel, parameters)
+    member this.SetRBCRadius (radiusPixel : float32) =
+        rbcRadius <- RBCRadius (radiusPixel, parameters)
 
     member this.Copy () =
-        this.MemberwiseClone() :?> Config
-
+        this.MemberwiseClone () :?> Config
+
+    override this.ToString () =
+        $"{{{nameof Config}: " +
+        $"{nameof this.LPFStandardDeviationParasite} = {this.LPFStandardDeviationParasite}, " +
+        $"{nameof this.LPFStandardDeviationRBC} = {this.LPFStandardDeviationRBC}, " +
+        $"{nameof this.RBCRadiusByResolution} = {this.RBCRadiusByResolution}, " +
+        $"{nameof this.RBCRadius} = {this.RBCRadius}, " +
+        $"{nameof this.Parameters} = {this.Parameters}}}"