1 // Copyright 2013 Krzysztof Czainski
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
8 /// \brief Unit test for Numeric extension
10 #include <boost/gil/image.hpp>
11 #include <boost/gil/typedefs.hpp>
13 #include <boost/gil/extension/numeric/resample.hpp>
14 #include <boost/gil/extension/numeric/sampler.hpp>
16 #include <boost/assert.hpp>
18 #if defined(BOOST_CLANG)
19 #pragma clang diagnostic push
20 #pragma clang diagnostic ignored "-Wfloat-equal"
23 #if defined(BOOST_GCC) && (BOOST_GCC >= 40600)
24 #pragma GCC diagnostic push
25 #pragma GCC diagnostic ignored "-Wfloat-equal"
28 #define BOOST_TEST_MAIN
29 #include <boost/test/unit_test.hpp>
31 using namespace boost;
34 template < class F, class I >
37 using point_t = point<F>;
38 using result_type = point_t;
39 result_type operator()(point<I> const& src) const
41 F x = static_cast<F>( src.x ) - 0.5;
42 F y = static_cast<F>( src.y ) - 0.5;
47 namespace boost { namespace gil {
49 // NOTE: I suggest this could be the default behavior:
51 template <typename T> struct mapping_traits;
53 template < class F, class I >
54 struct mapping_traits<TestMapFn<F, I>>
56 using result_type = typename TestMapFn<F, I>::result_type;
59 template <class F, class I>
60 inline point<F> transform(TestMapFn<F, I> const& mf, point<I> const& src)
68 BOOST_AUTO_TEST_SUITE(Numeric_Tests)
70 BOOST_AUTO_TEST_CASE( pixel_numeric_operations_plus )
72 rgb8_pixel_t a( 10, 20, 30 );
73 bgr8_pixel_t b( 30, 20, 10 );
75 pixel_plus_t< rgb8_pixel_t
79 rgb8_pixel_t c = op( a, b );
81 BOOST_ASSERT( get_color( c, red_t() ) == 20 );
82 BOOST_ASSERT( get_color( c, green_t() ) == 40 );
83 BOOST_ASSERT( get_color( c, blue_t() ) == 60 );
85 pixel_plus_t< rgb8_pixel_t
89 bgr8_pixel_t d = op2( a, b );
91 BOOST_ASSERT( get_color( d, red_t() ) == 20 );
92 BOOST_ASSERT( get_color( d, green_t() ) == 40 );
93 BOOST_ASSERT( get_color( d, blue_t() ) == 60 );
96 BOOST_AUTO_TEST_CASE( pixel_numeric_operations_multiply )
98 rgb32f_pixel_t a( 1.f, 2.f, 3.f );
99 bgr32f_pixel_t b( 2.f, 2.f, 2.f );
101 pixel_multiply_t< rgb32f_pixel_t
105 rgb32f_pixel_t c = op( a, b );
107 float epsilon = 1e-6f;
108 BOOST_CHECK_CLOSE( static_cast<float>( get_color( c, red_t() )), 2.f, epsilon );
109 BOOST_CHECK_CLOSE( static_cast<float>( get_color( c, green_t() )), 4.f, epsilon );
110 BOOST_CHECK_CLOSE( static_cast<float>( get_color( c, blue_t() )), 6.f, epsilon );
113 BOOST_AUTO_TEST_CASE( pixel_numeric_operations_divide )
117 rgb8_pixel_t a( 10, 20, 30 );
118 bgr8_pixel_t b( 2, 2, 2 );
120 pixel_divide_t< rgb8_pixel_t
124 rgb32f_pixel_t c = op( a, b );
126 BOOST_ASSERT( get_color( c, red_t() ) == 5 );
127 BOOST_ASSERT( get_color( c, green_t() ) == 10 );
128 BOOST_ASSERT( get_color( c, blue_t() ) == 15 );
133 rgb32f_pixel_t a( 1.f, 2.f, 3.f );
134 bgr32f_pixel_t b( 2.f, 2.f, 2.f );
136 pixel_divide_t< rgb32f_pixel_t
140 rgb32f_pixel_t c = op( a, b );
142 float epsilon = 1e-6f;
143 BOOST_CHECK_CLOSE( static_cast< float >( get_color( c, red_t() )), 0.5f, epsilon );
144 BOOST_CHECK_CLOSE( static_cast< float >( get_color( c, green_t() )), 1.f, epsilon );
145 BOOST_CHECK_CLOSE( static_cast< float >( get_color( c, blue_t() )), 1.5f, epsilon );
149 BOOST_AUTO_TEST_CASE(bilinear_sampler_test)
154 rgb8_image_t img(3,3);
155 rgb8_view_t v = view(img);
156 v(0,0) = v(1,2) = v(2,1) = rgb8_pixel_t(128,0,0);
157 v(0,1) = v(1,0) = v(2,2) = rgb8_pixel_t(0,128,0);
158 v(0,2) = v(2,0) = rgb8_pixel_t(0,0,128);
159 v(1,1) = rgb8_pixel_t(128,128,128);
161 rgb8_image_t dimg(4,4);
162 rgb8c_view_t dv = const_view(dimg);
164 TestMapFn<double,rgb8_image_t::coord_t> mf;
166 resample_pixels(const_view(img), view(dimg), mf, bilinear_sampler());
168 BOOST_ASSERT(rgb8_pixel_t(128,0,0) == dv(0,0));
169 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(0,1));
170 BOOST_ASSERT(rgb8_pixel_t(0,64,64) == dv(0,2));
171 BOOST_ASSERT(rgb8_pixel_t(0,0,128) == dv(0,3));
173 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(1,0));
174 BOOST_ASSERT(rgb8_pixel_t(64,96,32) == dv(1,1));
175 BOOST_ASSERT(rgb8_pixel_t(64,64,64) == dv(1,2));
176 BOOST_ASSERT(rgb8_pixel_t(64,0,64) == dv(1,3));
178 BOOST_ASSERT(rgb8_pixel_t(0,64,64) == dv(2,0));
179 BOOST_ASSERT(rgb8_pixel_t(64,64,64) == dv(2,1));
180 BOOST_ASSERT(rgb8_pixel_t(96,64,32) == dv(2,2));
181 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(2,3));
183 BOOST_ASSERT(rgb8_pixel_t(0,0,128) == dv(3,0));
184 BOOST_ASSERT(rgb8_pixel_t(64,0,64) == dv(3,1));
185 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(3,2));
186 BOOST_ASSERT(rgb8_pixel_t(0,128,0) == dv(3,3));
189 BOOST_AUTO_TEST_SUITE_END()