1 #include "testlib/testlib_test.h"
2 #include "vil/vil_print.h"
3 #include <bil/algo/bil_finite_differences.h>
4 
5 
test_bil_finite_differences()6 static void test_bil_finite_differences()
7 {
8   int dim = 6;
9   vil_image_view<float> testim(dim,dim);
10   vil_image_view<float> dxp,dxm,dxc,dyp,dym,dyc;
11 
12   testim.fill(1);
13   bil_finite_differences(testim, dxp, dxm, dxc, dyp, dym, dyc);
14 
15   float dxpsum=0;
16   float dxmsum=0;
17   float dxcsum=0;
18   float dypsum=0;
19   float dymsum=0;
20   float dycsum=0;
21   for (unsigned j = 0 ; j < testim.nj(); j++) {
22     for (unsigned i = 0 ; i < testim.ni(); i++) {
23       dxpsum += dxp(i,j);
24       dxmsum += dxm(i,j);
25       dxcsum += dxc(i,j);
26       dypsum += dyp(i,j);
27       dymsum += dym(i,j);
28       dycsum += dyc(i,j);
29     }
30   }
31 
32   TEST_NEAR("D_x_plus", dxpsum,0, 0.001);
33   TEST_NEAR("D_x_minus", dxmsum,0, 0.001);
34   TEST_NEAR("D_x_center", dxcsum,0, 0.001);
35   TEST_NEAR("D_y_plus", dypsum,0, 0.001);
36   TEST_NEAR("D_y_minus", dymsum,0, 0.001);
37   TEST_NEAR("D_y_center", dycsum,0, 0.001);
38 
39   for (unsigned j = 0 ; j < testim.nj(); j++) {
40     for (unsigned i = 0 ; i < testim.ni(); i++) {
41       if (i < static_cast<unsigned>(dim/2)) {
42         testim(i,j) = 1;
43       }
44       else {
45         testim(i,j) = 0;
46       }
47     }
48   }
49 
50   bil_finite_differences(testim, dxp, dxm, dxc, dyp, dym, dyc);
51 #if 0
52   vil_print_all(std::cout,dxp);
53   vil_print_all(std::cout,dxm);
54   vil_print_all(std::cout,dxc);
55 #endif // 0
56   for (unsigned j = 0 ; j < testim.nj(); j++) {
57     TEST_NEAR("D_x_plus"    ,     dxp(0,j)    ,    0    ,     0.001);
58     TEST_NEAR("D_x_minus"   ,     dxm(0,j)    ,    0    ,     0.001);
59     TEST_NEAR("D_x_center"  ,     dxc(0,j)    ,    0    ,     0.001);
60     TEST_NEAR("D_y_plus"    ,     dyp(0,j)    ,    0    ,     0.001);
61     TEST_NEAR("D_y_minus"   ,     dym(0,j)    ,    0    ,     0.001);
62     TEST_NEAR("D_y_center"  ,     dyc(0,j)    ,    0    ,     0.001);
63 
64     TEST_NEAR("D_x_plus"    ,     dxp(dim/2 - 1,j)    ,   -1    ,     0.001);
65     TEST_NEAR("D_x_minus"   ,     dxm(dim/2 - 1,j)    ,    0    ,     0.001);
66     TEST_NEAR("D_x_center"  ,     dxc(dim/2 - 1,j)    ,   -0.5  ,     0.001);
67     TEST_NEAR("D_y_plus"    ,     dyp(dim/2 - 1,j)    ,    0    ,     0.001);
68     TEST_NEAR("D_y_minus"   ,     dym(dim/2 - 1,j)    ,    0    ,     0.001);
69     TEST_NEAR("D_y_center"  ,     dyc(dim/2 - 1,j)    ,    0    ,     0.001);
70 
71     TEST_NEAR("D_x_plus"    ,     dxp(dim/2,j)    ,    0    ,     0.001);
72     TEST_NEAR("D_x_minus"   ,     dxm(dim/2,j)    ,   -1    ,     0.001);
73     TEST_NEAR("D_x_center"  ,     dxc(dim/2,j)    ,   -0.5  ,     0.001);
74     TEST_NEAR("D_y_plus"    ,     dyp(dim/2,j)    ,    0    ,     0.001);
75     TEST_NEAR("D_y_minus"   ,     dym(dim/2,j)    ,    0    ,     0.001);
76     TEST_NEAR("D_y_center"  ,     dyc(dim/2,j)    ,    0    ,     0.001);
77   }
78 
79   for (unsigned j = 0 ; j < testim.nj(); j++) {
80     for (unsigned i = 0 ; i < testim.ni(); i++) {
81       if (j < static_cast<unsigned>(dim/2)) {
82         testim(i,j) = 1;
83       }
84       else {
85         testim(i,j) = 0;
86       }
87     }
88   }
89 
90   bil_finite_differences(testim, dxp, dxm, dxc, dyp, dym, dyc);
91 
92   /*
93   vil_print_all(std::cout,dyp);
94   vil_print_all(std::cout,dym);
95   vil_print_all(std::cout,dyc);
96   */
97   for (unsigned i = 0 ; i < testim.ni(); i++) {
98     TEST_NEAR("D_x_plus"    ,     dxp(i,0)    ,    0    ,     0.001);
99     TEST_NEAR("D_x_minus"   ,     dxm(i,0)    ,    0    ,     0.001);
100     TEST_NEAR("D_x_center"  ,     dxc(i,0)    ,    0    ,     0.001);
101     TEST_NEAR("D_y_plus"    ,     dyp(i,0)    ,    0    ,     0.001);
102     TEST_NEAR("D_y_minus"   ,     dym(i,0)    ,    0    ,     0.001);
103     TEST_NEAR("D_y_center"  ,     dyc(i,0)    ,    0    ,     0.001);
104 
105     TEST_NEAR("D_x_plus"    ,     dxp(i,dim/2 - 1)    ,    0    ,     0.001);
106     TEST_NEAR("D_x_minus"   ,     dxm(i,dim/2 - 1)    ,    0    ,     0.001);
107     TEST_NEAR("D_x_center"  ,     dxc(i,dim/2 - 1)    ,    0    ,     0.001);
108     TEST_NEAR("D_y_plus"    ,     dyp(i,dim/2 - 1)    ,   -1    ,     0.001);
109     TEST_NEAR("D_y_minus"   ,     dym(i,dim/2 - 1)    ,    0    ,     0.001);
110     TEST_NEAR("D_y_center"  ,     dyc(i,dim/2 - 1)    ,   -0.5  ,     0.001);
111 
112     TEST_NEAR("D_x_plus"    ,     dxp(i,dim/2)    ,    0    ,     0.001);
113     TEST_NEAR("D_x_minus"   ,     dxm(i,dim/2)    ,    0    ,     0.001);
114     TEST_NEAR("D_x_center"  ,     dxc(i,dim/2)    ,    0    ,     0.001);
115     TEST_NEAR("D_y_plus"    ,     dyp(i,dim/2)    ,    0    ,     0.001);
116     TEST_NEAR("D_y_minus"   ,     dym(i,dim/2)    ,   -1    ,     0.001);
117     TEST_NEAR("D_y_center"  ,     dyc(i,dim/2)    ,   -0.5  ,     0.001);
118   }
119 
120 
121   for (unsigned j = 0 ; j < testim.nj(); j++) {
122   for (unsigned i = 0 ; i < testim.ni(); i++) {
123     if (j == testim.nj()-1) {
124       testim(i,j) = 1;
125     }
126     else {
127       testim(i,j) = 0;
128     }
129   }
130   }
131 
132   bil_finite_differences(testim, dxp, dxm, dxc, dyp, dym, dyc);
133 
134   /*
135   vil_print_all(std::cout,dyp);
136   vil_print_all(std::cout,dym);
137   vil_print_all(std::cout,dyc);
138   */
139   for (unsigned i = 0 ; i < testim.ni(); i++) {
140     TEST_NEAR("D_x_plus"    ,     dxp(i,0)    ,    0    ,     0.001);
141     TEST_NEAR("D_x_minus"   ,     dxm(i,0)    ,    0    ,     0.001);
142     TEST_NEAR("D_x_center"  ,     dxc(i,0)    ,    0    ,     0.001);
143     TEST_NEAR("D_y_plus"    ,     dyp(i,0)    ,    0    ,     0.001);
144     TEST_NEAR("D_y_minus"   ,     dym(i,0)    ,    0    ,     0.001);
145     TEST_NEAR("D_y_center"  ,     dyc(i,0)    ,    0    ,     0.001);
146 
147     TEST_NEAR("D_x_plus"    ,     dxp(i,testim.nj() - 2)    ,    0    ,     0.001);
148     TEST_NEAR("D_x_minus"   ,     dxm(i,testim.nj() - 2)    ,    0    ,     0.001);
149     TEST_NEAR("D_x_center"  ,     dxc(i,testim.nj() - 2)    ,    0    ,     0.001);
150     TEST_NEAR("D_y_plus"    ,     dyp(i,testim.nj() - 2)    ,    1    ,     0.001);
151     TEST_NEAR("D_y_minus"   ,     dym(i,testim.nj() - 2)    ,    0    ,     0.001);
152     TEST_NEAR("D_y_center"  ,     dyc(i,testim.nj() - 2)    ,   0.5   ,     0.001);
153 
154     TEST_NEAR("D_x_plus"    ,     dxp(i,testim.nj() - 1)    ,    0    ,     0.001);
155     TEST_NEAR("D_x_minus"   ,     dxm(i,testim.nj() - 1)    ,    0    ,     0.001);
156     TEST_NEAR("D_x_center"  ,     dxc(i,testim.nj() - 1)    ,    0    ,     0.001);
157     TEST_NEAR("D_y_plus"    ,     dyp(i,testim.nj() - 1)    ,    0    ,     0.001);
158     TEST_NEAR("D_y_minus"   ,     dym(i,testim.nj() - 1)    ,    1    ,     0.001);
159     TEST_NEAR("D_y_center"  ,     dyc(i,testim.nj() - 1)    ,   0.5   ,     0.001);
160   }
161 
162   for (unsigned j = 0 ; j < testim.nj(); j++) {
163     for (unsigned i = 0 ; i < testim.ni(); i++) {
164       if (i == testim.ni()-1) {
165         testim(i,j) = 1;
166       }
167       else {
168         testim(i,j) = 0;
169       }
170     }
171   }
172 
173   bil_finite_differences(testim, dxp, dxm, dxc, dyp, dym, dyc);
174 
175 #if 0
176   vil_print_all(std::cout,dxp);
177   vil_print_all(std::cout,dxm);
178   vil_print_all(std::cout,dxc);
179 #endif // 0
180   for (unsigned j = 0 ; j < testim.nj(); j++) {
181     TEST_NEAR("D_x_plus"    ,     dxp(0,j)    ,    0    ,     0.001);
182     TEST_NEAR("D_x_minus"   ,     dxm(0,j)    ,    0    ,     0.001);
183     TEST_NEAR("D_x_center"  ,     dxc(0,j)    ,    0    ,     0.001);
184     TEST_NEAR("D_y_plus"    ,     dyp(0,j)    ,    0    ,     0.001);
185     TEST_NEAR("D_y_minus"   ,     dym(0,j)    ,    0    ,     0.001);
186     TEST_NEAR("D_y_center"  ,     dyc(0,j)    ,    0    ,     0.001);
187 
188     TEST_NEAR("D_x_plus"    ,     dxp(testim.ni() - 2,j)    ,    1    ,     0.001);
189     TEST_NEAR("D_x_minus"   ,     dxm(testim.ni() - 2,j)    ,    0    ,     0.001);
190     TEST_NEAR("D_x_center"  ,     dxc(testim.ni() - 2,j)    ,   0.5   ,     0.001);
191     TEST_NEAR("D_y_plus"    ,     dyp(testim.ni() - 2,j)    ,    0    ,     0.001);
192     TEST_NEAR("D_y_minus"   ,     dym(testim.ni() - 2,j)    ,    0    ,     0.001);
193     TEST_NEAR("D_y_center"  ,     dyc(testim.ni() - 2,j)    ,    0    ,     0.001);
194 
195     TEST_NEAR("D_x_plus"    ,     dxp(testim.ni() - 1,j)    ,    0    ,     0.001);
196     TEST_NEAR("D_x_minus"   ,     dxm(testim.ni() - 1,j)    ,    1    ,     0.001);
197     TEST_NEAR("D_x_center"  ,     dxc(testim.ni() - 1,j)    ,   0.5   ,     0.001);
198     TEST_NEAR("D_y_plus"    ,     dyp(testim.ni() - 1,j)    ,    0    ,     0.001);
199     TEST_NEAR("D_y_minus"   ,     dym(testim.ni() - 1,j)    ,    0    ,     0.001);
200     TEST_NEAR("D_y_center"  ,     dyc(testim.ni() - 1,j)    ,    0    ,     0.001);
201   }
202 }
203 
204 TESTMAIN(test_bil_finite_differences);
205