1 // This is core/vil/algo/tests/test_algo_colour_space.cxx
2 #include <cmath>
3 #include "testlib/testlib_test.h"
4 #include <vil/algo/vil_colour_space.h>
5 // not used? #include <iostream>
6 #ifdef _MSC_VER
7 # include "vcl_msvc_warnings.h"
8 #endif
9
10 static void
test_algo_colour_space()11 test_algo_colour_space()
12 {
13 double red_rgb[3] = { 1.0, 0.0, 0.0 };
14 double green_rgb[3] = { 0.0, 1.0, 0.0 };
15 double blue_rgb[3] = { 0.0, 0.0, 1.0 };
16
17 double color1[3], color2[3];
18 // test on red
19 vil_colour_space_RGB_to_YUV(red_rgb, color1);
20 vil_colour_space_YUV_to_RGB(color1, color2);
21 TEST("Test RGB/YUV on red",
22 std::abs(red_rgb[0] - color2[0]) < 1e-12 && std::abs(red_rgb[1] - color2[1]) < 1e-12 &&
23 std::abs(red_rgb[2] - color2[2]) < 1e-12,
24 true);
25
26 // test on green
27 vil_colour_space_RGB_to_YUV(green_rgb, color1);
28 vil_colour_space_YUV_to_RGB(color1, color2);
29 TEST("Test RGB/YUV on green",
30 std::abs(green_rgb[0] - color2[0]) < 1e-12 && std::abs(green_rgb[1] - color2[1]) < 1e-12 &&
31 std::abs(green_rgb[2] - color2[2]) < 1e-12,
32 true);
33
34 // test on blue
35 vil_colour_space_RGB_to_YUV(blue_rgb, color1);
36 vil_colour_space_YUV_to_RGB(color1, color2);
37 TEST("Test RGB/YUV on blue",
38 std::abs(blue_rgb[0] - color2[0]) < 1e-12 && std::abs(blue_rgb[1] - color2[1]) < 1e-12 &&
39 std::abs(blue_rgb[2] - color2[2]) < 1e-12,
40 true);
41
42
43 //// Test YPbPr ////
44
45 // test on red
46 vil_colour_space_RGB_to_YPbPr_601(red_rgb, color1);
47 vil_colour_space_YPbPr_601_to_RGB(color1, color2);
48 TEST("Test RGB/YPbPr on red",
49 std::abs(red_rgb[0] - color2[0]) < 1e-6 && std::abs(red_rgb[1] - color2[1]) < 1e-6 &&
50 std::abs(red_rgb[2] - color2[2]) < 1e-6,
51 true);
52
53 // test on green
54 vil_colour_space_RGB_to_YPbPr_601(green_rgb, color1);
55 vil_colour_space_YPbPr_601_to_RGB(color1, color2);
56 TEST("Test RGB/YPbPr on green",
57 std::abs(green_rgb[0] - color2[0]) < 1e-6 && std::abs(green_rgb[1] - color2[1]) < 1e-6 &&
58 std::abs(green_rgb[2] - color2[2]) < 1e-6,
59 true);
60
61 // test on blue
62 vil_colour_space_RGB_to_YPbPr_601(blue_rgb, color1);
63 vil_colour_space_YPbPr_601_to_RGB(color1, color2);
64 TEST("Test RGB/YPbPr on blue",
65 std::abs(blue_rgb[0] - color2[0]) < 1e-6 && std::abs(blue_rgb[1] - color2[1]) < 1e-6 &&
66 std::abs(blue_rgb[2] - color2[2]) < 1e-6,
67 true);
68
69 // Test YIQ
70 // test on red
71 vil_colour_space_RGB_to_YIQ(red_rgb, color1);
72 vil_colour_space_YIQ_to_RGB(color1, color2);
73 TEST("Test RGB/YIQ on red",
74 std::abs(red_rgb[0] - color2[0]) < 1e-6 && std::abs(red_rgb[1] - color2[1]) < 1e-6 &&
75 std::abs(red_rgb[2] - color2[2]) < 1e-6,
76 true);
77
78 // test on green
79 vil_colour_space_RGB_to_YIQ(green_rgb, color1);
80 vil_colour_space_YIQ_to_RGB(color1, color2);
81 TEST("Test RGB/YIQ on green",
82 std::abs(green_rgb[0] - color2[0]) < 1e-6 && std::abs(green_rgb[1] - color2[1]) < 1e-6 &&
83 std::abs(green_rgb[2] - color2[2]) < 1e-6,
84 true);
85
86 // test on blue
87 vil_colour_space_RGB_to_YIQ(blue_rgb, color1);
88 vil_colour_space_YIQ_to_RGB(color1, color2);
89 TEST("Test RGB/YIQ on blue",
90 std::abs(blue_rgb[0] - color2[0]) < 1e-6 && std::abs(blue_rgb[1] - color2[1]) < 1e-6 &&
91 std::abs(blue_rgb[2] - color2[2]) < 1e-6,
92 true);
93
94 //// Test YCbCr ////
95
96 unsigned char unsigned_red_rgb[3] = { 255, 0, 0 };
97 unsigned char unsigned_green_rgb[3] = { 0, 255, 0 };
98 unsigned char unsigned_blue_rgb[3] = { 0, 0, 255 };
99
100 unsigned char unsigned_color1[3], unsigned_color2[3];
101
102 // test on red
103 vil_colour_space_RGB_to_YCbCr_601(unsigned_red_rgb, unsigned_color1);
104 vil_colour_space_YCbCr_601_to_RGB(unsigned_color1, unsigned_color2);
105 TEST("Test RGB/YCbCr on red",
106 unsigned_red_rgb[0] - unsigned_color2[0] < 1 && unsigned_red_rgb[1] - unsigned_color2[1] < 1 &&
107 unsigned_red_rgb[2] - unsigned_color2[2] < 1,
108 true);
109
110 // test on green
111 vil_colour_space_RGB_to_YCbCr_601(unsigned_green_rgb, unsigned_color1);
112 vil_colour_space_YCbCr_601_to_RGB(unsigned_color1, unsigned_color2);
113 TEST("Test RGB/YCbCr on green",
114 unsigned_green_rgb[0] - unsigned_color2[0] < 1 && unsigned_green_rgb[1] - unsigned_color2[1] < 1 &&
115 unsigned_green_rgb[2] - unsigned_color2[2] < 1,
116 true);
117
118 // test on blue
119 vil_colour_space_RGB_to_YCbCr_601(unsigned_blue_rgb, unsigned_color1);
120 vil_colour_space_YCbCr_601_to_RGB(unsigned_color1, unsigned_color2);
121 TEST("Test RGB/YCbCr on blue",
122 unsigned_blue_rgb[0] - unsigned_color2[0] < 1 && unsigned_blue_rgb[1] - unsigned_color2[1] < 1 &&
123 unsigned_blue_rgb[2] - unsigned_color2[2] < 1,
124 true);
125 }
126
127 TESTMAIN(test_algo_colour_space);
128