2 // Copyright 2013 Krzysztof Czainski
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
8 #include <boost/gil/image.hpp>
9 #include <boost/gil/typedefs.hpp>
11 #include <boost/gil/extension/numeric/resample.hpp>
12 #include <boost/gil/extension/numeric/sampler.hpp>
14 #include <boost/assert.hpp>
16 #define BOOST_TEST_MODULE test_ext_numeric_numeric
17 #include "unit_test.hpp"
19 using namespace boost
;
22 template < class F
, class I
>
25 using point_t
= point
<F
>;
26 using result_type
= point_t
;
27 result_type
operator()(point
<I
> const& src
) const
29 F x
= static_cast<F
>( src
.x
) - 0.5;
30 F y
= static_cast<F
>( src
.y
) - 0.5;
35 namespace boost
{ namespace gil
{
37 // NOTE: I suggest this could be the default behavior:
39 template <typename T
> struct mapping_traits
;
41 template < class F
, class I
>
42 struct mapping_traits
<TestMapFn
<F
, I
>>
44 using result_type
= typename TestMapFn
<F
, I
>::result_type
;
47 template <class F
, class I
>
48 inline point
<F
> transform(TestMapFn
<F
, I
> const& mf
, point
<I
> const& src
)
56 BOOST_AUTO_TEST_SUITE(Numeric_Tests
)
58 BOOST_AUTO_TEST_CASE( pixel_numeric_operations_plus
)
60 rgb8_pixel_t
a( 10, 20, 30 );
61 bgr8_pixel_t
b( 30, 20, 10 );
63 pixel_plus_t
< rgb8_pixel_t
67 rgb8_pixel_t c
= op( a
, b
);
69 BOOST_ASSERT( get_color( c
, red_t() ) == 20 );
70 BOOST_ASSERT( get_color( c
, green_t() ) == 40 );
71 BOOST_ASSERT( get_color( c
, blue_t() ) == 60 );
73 pixel_plus_t
< rgb8_pixel_t
77 bgr8_pixel_t d
= op2( a
, b
);
79 BOOST_ASSERT( get_color( d
, red_t() ) == 20 );
80 BOOST_ASSERT( get_color( d
, green_t() ) == 40 );
81 BOOST_ASSERT( get_color( d
, blue_t() ) == 60 );
84 BOOST_AUTO_TEST_CASE( pixel_numeric_operations_multiply
)
86 rgb32f_pixel_t
a( 1.f
, 2.f
, 3.f
);
87 bgr32f_pixel_t
b( 2.f
, 2.f
, 2.f
);
89 pixel_multiply_t
< rgb32f_pixel_t
93 rgb32f_pixel_t c
= op( a
, b
);
95 float epsilon
= 1e-6f
;
96 BOOST_CHECK_CLOSE( static_cast<float>( get_color( c
, red_t() )), 2.f
, epsilon
);
97 BOOST_CHECK_CLOSE( static_cast<float>( get_color( c
, green_t() )), 4.f
, epsilon
);
98 BOOST_CHECK_CLOSE( static_cast<float>( get_color( c
, blue_t() )), 6.f
, epsilon
);
101 BOOST_AUTO_TEST_CASE( pixel_numeric_operations_divide
)
105 rgb8_pixel_t
a( 10, 20, 30 );
106 bgr8_pixel_t
b( 2, 2, 2 );
108 pixel_divide_t
< rgb8_pixel_t
112 rgb32f_pixel_t c
= op( a
, b
);
114 BOOST_ASSERT( get_color( c
, red_t() ) == 5 );
115 BOOST_ASSERT( get_color( c
, green_t() ) == 10 );
116 BOOST_ASSERT( get_color( c
, blue_t() ) == 15 );
121 rgb32f_pixel_t
a( 1.f
, 2.f
, 3.f
);
122 bgr32f_pixel_t
b( 2.f
, 2.f
, 2.f
);
124 pixel_divide_t
< rgb32f_pixel_t
128 rgb32f_pixel_t c
= op( a
, b
);
130 float epsilon
= 1e-6f
;
131 BOOST_CHECK_CLOSE( static_cast< float >( get_color( c
, red_t() )), 0.5f
, epsilon
);
132 BOOST_CHECK_CLOSE( static_cast< float >( get_color( c
, green_t() )), 1.f
, epsilon
);
133 BOOST_CHECK_CLOSE( static_cast< float >( get_color( c
, blue_t() )), 1.5f
, epsilon
);
137 BOOST_AUTO_TEST_CASE(bilinear_sampler_test
)
142 rgb8_image_t
img(3,3);
143 rgb8_view_t v
= view(img
);
144 v(0,0) = v(1,2) = v(2,1) = rgb8_pixel_t(128,0,0);
145 v(0,1) = v(1,0) = v(2,2) = rgb8_pixel_t(0,128,0);
146 v(0,2) = v(2,0) = rgb8_pixel_t(0,0,128);
147 v(1,1) = rgb8_pixel_t(128,128,128);
149 rgb8_image_t
dimg(4,4);
150 rgb8c_view_t dv
= const_view(dimg
);
152 TestMapFn
<double,rgb8_image_t::coord_t
> mf
;
154 resample_pixels(const_view(img
), view(dimg
), mf
, bilinear_sampler());
156 BOOST_ASSERT(rgb8_pixel_t(128,0,0) == dv(0,0));
157 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(0,1));
158 BOOST_ASSERT(rgb8_pixel_t(0,64,64) == dv(0,2));
159 BOOST_ASSERT(rgb8_pixel_t(0,0,128) == dv(0,3));
161 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(1,0));
162 BOOST_ASSERT(rgb8_pixel_t(64,96,32) == dv(1,1));
163 BOOST_ASSERT(rgb8_pixel_t(64,64,64) == dv(1,2));
164 BOOST_ASSERT(rgb8_pixel_t(64,0,64) == dv(1,3));
166 BOOST_ASSERT(rgb8_pixel_t(0,64,64) == dv(2,0));
167 BOOST_ASSERT(rgb8_pixel_t(64,64,64) == dv(2,1));
168 BOOST_ASSERT(rgb8_pixel_t(96,64,32) == dv(2,2));
169 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(2,3));
171 BOOST_ASSERT(rgb8_pixel_t(0,0,128) == dv(3,0));
172 BOOST_ASSERT(rgb8_pixel_t(64,0,64) == dv(3,1));
173 BOOST_ASSERT(rgb8_pixel_t(64,64,0) == dv(3,2));
174 BOOST_ASSERT(rgb8_pixel_t(0,128,0) == dv(3,3));
177 BOOST_AUTO_TEST_SUITE_END()