09497133aa03b4316b084bd6b36b89ea4969f5ce
1
module ParasitemiaCore.ImgTools
10 /// Normalize an image between 0 and 'upperLimit'.
11 /// FIXME: use to many memory.
13 /// <param name="img"></param>
14 /// <param name="upperLimit"></param>
15 let normalize (img
: Image<Gray, float32
>) (upperLimit
: float) : Image<Gray, float32
> =
16 let min = ref [| 0.0
|]
17 let minLocation = ref <| [| Point() |]
18 let max = ref [| 0.0
|]
19 let maxLocation = ref <| [| Point() |]
20 img
.MinMax(min, max, minLocation, maxLocation)
21 let normalized = (img
- (!min).[0]) / ((!max).[0] - (!min).[0])
24 else upperLimit * normalized
26 let mergeChannels (img
: Image<Bgr, float32
>) (rgbWeights
: float * float * float) : Image<Gray, float32
> =
28 | 1., 0., 0. -> img
.[2]
29 | 0., 1., 0. -> img
.[1]
30 | 0., 0., 1. -> img
.[0]
31 | redFactor, greenFactor
, blueFactor
->
32 let result = new Image<Gray, float32
>(img
.Size)
33 CvInvoke.AddWeighted(result, 1., img
.[2], redFactor, 0., result)
34 CvInvoke.AddWeighted(result, 1., img
.[1], greenFactor
, 0., result)
35 CvInvoke.AddWeighted(result, 1., img
.[0], blueFactor
, 0., result)
38 let mergeChannelsWithProjection (img
: Image<Bgr, float32
>) (v1r
: float32
, v1g
: float32
, v1b
: float32
) (v2r
: float32
, v2g
: float32
, v2b
: float32
) (upperLimit: float) : Image<Gray, float32
> =
39 let vr, vg
, vb
= v2r
- v1r
, v2g
- v1g
, v2b
- v1b
40 let vMagnitude = sqrt
(vr ** 2.f
+ vg
** 2.f
+ vb
** 2.f
)
41 let project (r
: float32
) (g
: float32
) (b
: float32
) = ((r
- v1r
) * vr + (g
- v1g
) * vg
+ (b
- v1b
) * vb
) / vMagnitude
42 let result = new Image<Gray, float32
>(img
.Size)
43 // TODO: Essayer en bindant Data pour gagner du temps
44 for i
in 0 .. img
.Height - 1 do
45 for j
in 0 .. img
.Width - 1 do
46 result.Data.[i
, j
, 0] <- project img.Data.[i
, j
, 2] img.Data.[i
, j
, 1] img.Data.[i
, j
, 0]
47 normalize result upperLimit
49 // Normalize image values between 0uy and 255uy.
50 let normalizeAndConvert (img: Image<Gray, 'TDepth>) : Image<Gray, byte> =
51 (normalize (img.Convert<Gray, float32>()) 255.).Convert<Gray, byte>()
53 let gaussianFilter (img : Image<'TColor, 'TDepth>) (standardDeviation : float) : Image<'TColor, 'TDepth> =
54 let size = 2 * int (ceil (4.0 * standardDeviation)) + 1
55 img.SmoothGaussian(size, size, standardDeviation, standardDeviation)