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