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