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