Use real unit (um and ppi) instead of pixel in the parameters.
[master-thesis.git] / Parasitemia / Parasitemia / Config.fs
1 module Config
2
3 open System
4
5 open Const
6 open UnitsOfMeasure
7
8 type Debug =
9 | DebugOff
10 | DebugOn of string // Output directory.
11
12 type Parameters = {
13 rbcDiameter: float<μm>
14 resolution: float<ppi>
15
16 ratioAreaPaleCenter: float32 // The area of the second opening is 'ratioSecondAreaOpen' * mean RBC area. It's applied only if greater than 'initialAreaOpen'.
17
18 granulometryRange: float32 // The radius will be seeked from radius - granulometryRange * radius to radius + granulometryRange * radius.
19
20 minRbcRadius: float32 // Factor of the mean RBC radius.
21 maxRbcRadius: float32 // Factor of the mean RBC radius.
22
23 LPFStandardDeviation: float<μm> // Sigma parameter of the gaussian to remove the high frequency noise.
24
25 // Ellipse.
26 factorNbPick: float // The number of computed ellipse per edge pixel.
27
28 // Parasites detection.
29 darkStainLevel: float // Lower -> more sensitive. Careful about illumination on the borders.
30 maxDarkStainRatio: float // When a cell must own less than this ratio to be a RBC.
31
32 stainArea: float32 // Factor of a RBC area. 0.5 means the half of RBC area.
33 stainLevel: float // > 1
34 maxStainRatio: float // When a cell must own less than this ratio to be a RBC.
35
36 infectionArea: float32 // Factor of a RBC area. 0.5 means the half of RBC area.
37 infectionLevel: float // > 1
38
39 standardDeviationMaxRatio: float // The standard deviation of the pixel values of a cell can't be greater than standardDeviationMaxRatio * global standard deviation
40 minimumCellAreaFactor: float32 // Factor of the mean RBC area.
41 }
42
43 let defaultParameters = {
44 rbcDiameter = 8.<μm>
45 resolution = 200.e3<ppi> // Correspond to 50X.
46
47 ratioAreaPaleCenter = 1.f / 3.f // The ratio between an RBC area and the area of the its pale center.
48
49 granulometryRange = 0.5f
50
51 minRbcRadius = -0.3f
52 maxRbcRadius = 0.3f
53
54 LPFStandardDeviation = 0.2<μm> // 8.5e-6<inch>.
55
56 factorNbPick = 1.0
57
58 darkStainLevel = 0.25 // 0.3
59 maxDarkStainRatio = 0.1 // 10 %
60
61 infectionArea = 0.012f // 1.2 %
62 infectionLevel = 1.12 // Lower -> more sensitive.
63
64 stainArea = 0.08f // 8 %
65 stainLevel = 1.1 // Lower -> more sensitive.
66 maxStainRatio = 0.12 // 12 %
67
68 standardDeviationMaxRatio = 0.5 // 0.5
69 minimumCellAreaFactor = 0.4f }
70
71 type Config (param: Parameters) =
72 let initialRBCRadius : float32 =
73 let rbcRadiusInch: float<inch> = μm.ConvertToInch(param.rbcDiameter) / 2.
74 let rbcRadiusPx: float<px> = param.resolution * rbcRadiusInch
75 float32 rbcRadiusPx
76
77 member this.Parameters = param
78 member val Debug = DebugOff with get, set
79
80 member this.LPFStandardDeviation =
81 let stdDeviation: float<px> = μm.ConvertToInch(param.LPFStandardDeviation) * param.resolution
82 float stdDeviation
83
84 // Mean RBC radius.
85 member val RBCRadius : float32 = initialRBCRadius with get, set
86
87 member this.RBCMinRadius = this.RBCRadius + param.minRbcRadius * this.RBCRadius
88 member this.RBCMaxRadius = this.RBCRadius + param.maxRbcRadius * this.RBCRadius
89
90 member this.RBCArea = PI * this.RBCRadius ** 2.f
91 member this.RBCMinArea = param.minimumCellAreaFactor * this.RBCArea
92
93 member this.InfectionArea = param.infectionArea * this.RBCArea
94 member this.StainArea = param.stainArea * this.RBCArea
95
96 member this.Copy () =
97 this.MemberwiseClone() :?> Config
98