• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2013 Christian Henning
3 // Copyright 2013 Davide Anastasia <davideanastasia@users.sourceforge.net>
4 // Copyright 2020 Mateusz Loskot <mateusz at loskot dot net>
5 //
6 // Distributed under the Boost Software License, Version 1.0
7 // See accompanying file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt
9 //
10 #include <boost/gil.hpp>
11 #include <boost/gil/extension/toolbox/color_spaces/lab.hpp>
12 
13 #include <boost/core/lightweight_test.hpp>
14 
15 #include <cmath>
16 
17 namespace gil = boost::gil;
18 
19 // FIXME: Remove when https://github.com/boostorg/core/issues/38 happens
20 #define BOOST_GIL_TEST_IS_CLOSE(a, b) BOOST_TEST_LT(std::fabs((a) - (b)), (0.0005f))
21 
test_lab_to_xyz()22 void test_lab_to_xyz()
23 {
24     {
25         gil::lab32f_pixel_t lab_pixel(40.366198f, 53.354489f, 26.117702f);
26         gil::xyz32f_pixel_t xyz_pixel;
27         gil::color_convert(lab_pixel, xyz_pixel);
28         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[0]), 0.197823f);
29         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[1]), 0.114731f);
30         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[2]), 0.048848f);
31     }
32     {
33         gil::lab32f_pixel_t lab_pixel(50, 0, 0);
34         gil::xyz32f_pixel_t xyz_pixel;
35         gil::color_convert(lab_pixel, xyz_pixel);
36         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[0]), 0.175064f);
37         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[1]), 0.184187f);
38         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(xyz_pixel[2]), 0.200548f);
39     }
40 }
41 
test_xyz_to_lab()42 void test_xyz_to_lab()
43 {
44     gil::lab32f_pixel_t lab_pixel;
45     gil::xyz32f_pixel_t xyz_pixel(0.085703f, 0.064716f, 0.147082f);
46     gil::color_convert(xyz_pixel, lab_pixel);
47     BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 30.572438f);
48     BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 23.4674f);
49     BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), -22.322275f);
50 }
51 
test_rgb_to_lab()52 void test_rgb_to_lab()
53 {
54     {
55         gil::rgb32f_pixel_t rgb_pixel(0.75f, 0.5f, 0.25f);
56         gil::lab32f_pixel_t lab_pixel;
57         gil::color_convert(rgb_pixel, lab_pixel);
58         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 58.7767f);
59         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 18.5851f);
60         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 43.7975f);
61     }
62     {
63         gil::rgb32f_pixel_t rgb_pixel(1.f, 0.f, 0.f);
64         gil::lab32f_pixel_t lab_pixel;
65         gil::color_convert(rgb_pixel, lab_pixel);
66         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 53.2408f);
67         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 80.0925f);
68         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 67.2032f);
69     }
70     {
71         gil::rgb32f_pixel_t rgb_pixel(0.f, 1.f, 0.f);
72         gil::lab32f_pixel_t lab_pixel;
73         gil::color_convert(rgb_pixel, lab_pixel);
74         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 87.7347f);
75         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), -86.1827f);
76         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 83.1793f);
77     }
78     {
79         gil::rgb32f_pixel_t rgb_pixel(0.f, 0.f, 1.f);
80         gil::lab32f_pixel_t lab_pixel;
81         gil::color_convert(rgb_pixel, lab_pixel);
82         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 32.2970f);
83         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 79.1875f);
84         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), -107.8602f);
85     }
86     {
87         gil::rgb32f_pixel_t rgb_pixel(1.f, 1.f, 1.f);
88         gil::lab32f_pixel_t lab_pixel;
89         gil::color_convert(rgb_pixel, lab_pixel);
90         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[0]), 100.f);
91         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[1]), 0.f);
92         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(lab_pixel[2]), 0.f);
93     }
94 }
95 
test_lab_to_rgb()96 void test_lab_to_rgb()
97 {
98     {
99         gil::lab32f_pixel_t lab_pixel(75.f, 20.f, 40.f);
100         gil::rgb32f_pixel_t rgb_pixel;
101         gil::color_convert(lab_pixel, rgb_pixel);
102         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.943240f);
103         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.663990f);
104         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.437893f);
105     }
106     {
107         gil::lab32f_pixel_t lab_pixel(100.f, 0.f, 0.f);
108         gil::rgb32f_pixel_t rgb_pixel;
109         gil::color_convert(lab_pixel, rgb_pixel);
110         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 1.f);
111         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 1.f);
112         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 1.f);
113     }
114     {
115         gil::lab32f_pixel_t lab_pixel(56.8140f, -42.3665f, 10.6728f);
116         gil::rgb32f_pixel_t rgb_pixel;
117         gil::color_convert(lab_pixel, rgb_pixel);
118         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.099999f);
119         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.605568f);
120         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.456662f);
121     }
122     {
123         gil::lab32f_pixel_t lab_pixel(50.5874f, 4.0347f, 50.5456f);
124         gil::rgb32f_pixel_t rgb_pixel;
125         gil::color_convert(lab_pixel, rgb_pixel);
126         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[0]), 0.582705f);
127         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[1]), 0.454891f);
128         BOOST_GIL_TEST_IS_CLOSE(static_cast<float>(rgb_pixel[2]), 0.1f);
129     }
130 }
131 
main()132 int main()
133 {
134     test_lab_to_xyz();
135     test_xyz_to_lab();
136     test_rgb_to_lab();
137     test_lab_to_rgb();
138 
139     return ::boost::report_errors();
140 }
141