8d976ff0710b7b25bbdf86ac07455a937dea7a68
1
module ParasitemiaCore.Otsu
5 let otsu (hist
: Histogram) : float32
* float32
* float32
=
8 let mutable maximum = 0.0
10 let sum = hist
.data
|> Array.mapi
(fun i v
-> i
* v
|> float) |> Array.sum
12 for i
= 0 to hist
.data
.Length - 1 do
13 wB <- wB + hist
.data
.[i
]
15 let wF = hist
.total
- wB
17 sumB <- sumB + i
* hist
.data
.[i
]
18 let mB = (float sumB) / (float wB)
19 let mF = (sum - float sumB) / (float wF)
20 let between = (float wB) * (float wF) * (mB - mF) ** 2.;
21 if between >= maximum then
28 for i
= 0 to level - 1 do
29 sum <- sum + i
* hist
.data
.[i
]
30 nb <- nb + hist
.data
.[i
]
31 (sum + level * hist
.data
.[level] / 2) / (nb + hist
.data
.[level] / 2)
36 for i
= level + 1 to hist
.data
.Length - 1 do
37 sum <- sum + i
* hist
.data
.[i
]
38 nb <- nb + hist
.data
.[i
]
39 (sum + level * hist
.data
.[level] / 2) / (nb + hist
.data
.[level] / 2)
42 float32 l
/ float32 hist
.data
.Length * (hist
.max
- hist
.min
) + hist
.min
44 toFloat level, toFloat mean1, toFloat mean2