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