]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
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 | ||
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 | ||
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 | ||
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 | ||
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 | ||
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 | } |