To .NET 5 (lot of refactoring)
[master-thesis.git] / Parasitemia / ParasitemiaCore / ImgTools / Drawing.fs
1 module ParasitemiaCore.Drawing
2
3 open System.Drawing
4
5 open Emgu.CV
6 open Emgu.CV.Structure
7
8 open Const
9 open Types
10
11 let drawPoints (img : Image<Gray, 'TDepth>) (points : Points) (intensity : 'TDepth) =
12 for p in points do
13 img.Data.[p.Y, p.X, 0] <- intensity
14
15 let drawLine (img : Image<'TColor, 'TDepth>) (color : 'TColor) (x0 : int) (y0 : int) (x1 : int) (y1 : int) (thickness : int) =
16 img.Draw (LineSegment2D (Point (x0, y0), Point (x1, y1)), color, thickness);
17
18 let drawLineF (img : Image<'TColor, 'TDepth>) (color : 'TColor) (x0 : float) (y0 : float) (x1 : float) (y1 : float) (thickness : int) =
19 img.Draw (LineSegment2DF (PointF (float32 x0, float32 y0), PointF (float32 x1, float32 y1)), color, thickness, CvEnum.LineType.AntiAlias);
20
21 let drawEllipse (img : Image<'TColor, 'TDepth>) (e : Ellipse) (color : 'TColor) (alpha : float) =
22 if alpha >= 1.0 then
23 img.Draw (Emgu.CV.Structure.Ellipse (PointF (e.Cx, e.Cy), SizeF (2.f * e.B, 2.f * e.A), e.Alpha / PI * 180.f), color, 1, CvEnum.LineType.AntiAlias)
24 else
25 let windowPosX = e.Cx - e.A - 5.f
26 let gapX = windowPosX - (float32 (int windowPosX))
27
28 let windowPosY = e.Cy - e.A - 5.f
29 let gapY = windowPosY - (float32 (int windowPosY))
30
31 let roi = Rectangle (int windowPosX, int windowPosY, 2.f * (e.A + 5.f) |> int, 2.f * (e.A + 5.f) |> int)
32
33 img.ROI <- roi
34 if roi = img.ROI then // We do not display ellipses touching the edges (FIXME)
35 use i = new Image<'TColor, 'TDepth> (img.ROI.Size)
36 i.Draw (Emgu.CV.Structure.Ellipse(PointF(e.A + 5.f + gapX, e.A + 5.f + gapY), SizeF(2.f * e.B, 2.f * e.A), e.Alpha / PI * 180.f), color, 1, CvEnum.LineType.AntiAlias)
37 CvInvoke.AddWeighted (img, 1.0, i, alpha, 0.0, img)
38 img.ROI <- Rectangle.Empty
39
40 let drawEllipses (img : Image<'TColor, 'TDepth>) (ellipses : Ellipse list) (color : 'TColor) (alpha : float) =
41 List.iter (fun e -> drawEllipse img e color alpha) ellipses
42
43 let rngCell = System.Random ()
44 let drawCell (img : Image<Bgr, byte>) (drawCellContent : bool) (c : Cell) =
45 if drawCellContent then
46 let colorB = rngCell.Next (20, 70)
47 let colorG = rngCell.Next (20, 70)
48 let colorR = rngCell.Next (20, 70)
49
50 for y = 0 to c.elements.Height - 1 do
51 for x = 0 to c.elements.Width - 1 do
52 if c.elements.[y, x] > 0uy then
53 let dx, dy = c.center.X - c.elements.Width / 2, c.center.Y - c.elements.Height / 2
54 let b = img.Data.[y + dy, x + dx, 0] |> int
55 let g = img.Data.[y + dy, x + dx, 1] |> int
56 let r = img.Data.[y + dy, x + dx, 2] |> int
57 img.Data.[y + dy, x + dx, 0] <- if b + colorB > 255 then 255uy else byte (b + colorB)
58 img.Data.[y + dy, x + dx, 1] <- if g + colorG > 255 then 255uy else byte (g + colorG)
59 img.Data.[y + dy, x + dx, 2] <- if r + colorR > 255 then 255uy else byte (r + colorR)
60
61 let crossColor, crossColor2 =
62 match c.cellClass with
63 | HealthyRBC -> Bgr (255., 0., 0.), Bgr (255., 255., 255.)
64 | InfectedRBC -> Bgr (0., 0., 255.), Bgr (120., 120., 255.)
65 | Peculiar -> Bgr (0., 0., 0.), Bgr (80., 80., 80.)
66
67 drawLine img crossColor2 (c.center.X - 3) c.center.Y (c.center.X + 3) c.center.Y 2
68 drawLine img crossColor2 c.center.X (c.center.Y - 3) c.center.X (c.center.Y + 3) 2
69
70 drawLine img crossColor (c.center.X - 3) c.center.Y (c.center.X + 3) c.center.Y 1
71 drawLine img crossColor c.center.X (c.center.Y - 3) c.center.X (c.center.Y + 3) 1
72
73 let drawCells (img : Image<Bgr, byte>) (drawCellContent : bool) (cells : Cell list) =
74 List.iter (fun c -> drawCell img drawCellContent c) cells