1 // This is core/vil/algo/tests/test_algo_exp_grad_filter_1d.cxx
2 #include <vector>
3 #include <iostream>
4 #include "testlib/testlib_test.h"
5 #ifdef _MSC_VER
6 #  include "vcl_msvc_warnings.h"
7 #endif
8 #include "vxl_config.h" // for vxl_byte
9 #include <vil/algo/vil_exp_grad_filter_1d.h>
10 #include "vil/vil_print.h"
11 
12 static void
test_algo_exp_grad_filter_1d_byte_float()13 test_algo_exp_grad_filter_1d_byte_float()
14 {
15   std::cout << "************************************************\n"
16             << " Testing vil_algo_exp_grad_filter_1d byte-float\n"
17             << "************************************************\n";
18 
19   constexpr int n = 100;
20   std::vector<vxl_byte> src(n);
21   for (int i = 0; i < n; ++i)
22     src[i] = 0;
23   src[50] = 100;
24 
25   float k = 0.25;
26   std::vector<float> dest_block(n + 2);
27   float * dest = &dest_block[1];
28   dest[-1] = 9876;
29   dest[n] = 9876; // Marks to check for over-runs
30   vil_exp_grad_filter_1d(&src[0], 1, &dest[0], 1, n, k);
31 
32   double half_sum = k / (1 - k);
33   TEST_NEAR("Central value", dest[50], 0, 1e-6);
34   TEST_NEAR("Left value", dest[49], 100 * k / half_sum, 1e-4);
35   TEST_NEAR("Right value", dest[51], -100 * k / half_sum, 1e-4);
36   TEST_NEAR("Neighbours", dest[54] * k, dest[55], 1e-6);
37   TEST_NEAR("Neighbours", dest[47] * k, dest[46], 1e-6);
38   TEST_NEAR("No start over-run", dest[-1], 9876, 1e-6);
39   TEST_NEAR("No end over-run", dest[n], 9876, 1e-6);
40 
41   double sum = 0;
42   for (int i = 0; i < n; ++i)
43     sum += dest[i];
44   TEST_NEAR("Sum zero", sum, 0, 1e-6);
45 
46   for (int i = 0; i < 10; ++i)
47     src[i] = static_cast<vxl_byte>(i);
48   vil_exp_grad_filter_1d(&src[0], 1, &dest[0], 1, 10, float(k));
49   std::cout << "Applying to 0 1 2 3 ..\n";
50   for (int i = 0; i < 10; ++i)
51     std::cout << ' ' << dest[i];
52   std::cout << std::endl;
53 
54   // Test application to whole images
55   vil_image_view<vxl_byte> src_im(10, 10);
56   vil_image_view<float> dest_im;
57   src_im.fill(10);
58   for (unsigned j = 0; j < 10; ++j)
59     for (unsigned i = 5; i < 10; ++i)
60       src_im(i, j) = 20;
61   vil_exp_grad_filter_i(src_im, dest_im, double(0.25));
62 
63   TEST("Width", dest_im.ni(), src_im.ni());
64   TEST("Height", dest_im.nj(), src_im.nj());
65   TEST_NEAR("dest_im(5,5)", dest_im(5, 5), 10, 1e-2);
66 
67   src_im.fill(10);
68   for (unsigned j = 0; j < 10; ++j)
69     for (unsigned i = 5; i < 10; ++i)
70       src_im(j, i) = 20;
71   vil_exp_grad_filter_j(src_im, dest_im, double(0.25));
72 
73   TEST("Width", dest_im.ni(), src_im.ni());
74   TEST("Height", dest_im.nj(), src_im.nj());
75   TEST_NEAR("dest_im(5,5)", dest_im(5, 5), 10, 1e-2);
76 
77   vil_print_all(std::cout, dest_im);
78 }
79 
80 static void
test_algo_exp_grad_filter_1d()81 test_algo_exp_grad_filter_1d()
82 {
83   test_algo_exp_grad_filter_1d_byte_float();
84 }
85 
86 TESTMAIN(test_algo_exp_grad_filter_1d);
87