Cleaning syntax.
[master-thesis.git] / Parasitemia / ParasitemiaCore / ImgTools / Otsu.fs
1 module ParasitemiaCore.Otsu
2
3 open Histogram
4
5 let otsu (hist : Histogram) : float32 * float32 * float32 =
6 let mutable sumB = 0
7 let mutable wB = 0
8 let mutable maximum = 0.0
9 let mutable level = 0
10 let sum = hist.data |> Array.mapi (fun i v -> i * v |> float) |> Array.sum
11
12 for i = 0 to hist.data.Length - 1 do
13 wB <- wB + hist.data.[i]
14 if wB <> 0 then
15 let wF = hist.total - wB
16 if wF <> 0 then
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
22 level <- i
23 maximum <- between
24
25 let mean1 =
26 let mutable sum = 0
27 let mutable nb = 0
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)
32
33 let mean2 =
34 let mutable sum = 0
35 let mutable nb = 0
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)
40
41 let toFloat l =
42 float32 l / float32 hist.data.Length * (hist.max - hist.min) + hist.min
43
44 toFloat level, toFloat mean1, toFloat mean2