1 // This is mul/vil3d/tests/test_resample.cxx
2 #include <iostream>
3 #include "testlib/testlib_test.h"
4 #ifdef _MSC_VER
5 #  include "vcl_msvc_warnings.h"
6 #endif
7 #include <vil3d/vil3d_resample_simple.h>
8 #include <vil3d/vil3d_resample_trilinear.h>
9 #include <vil3d/vil3d_resample_tricubic.h>
10 #include <vil3d/vil3d_print.h>
11 #include "vxl_config.h"
12 
13 
14 //==============================================================================
15 //==============================================================================
test_resample_simple()16 static void test_resample_simple()
17 {
18   std::cout << "*******************************\n"
19            << " Testing vil3d_resample_simple\n"
20            << "*******************************\n";
21 
22   int sni=3;
23   int snj=3;
24   int snk=3;
25   vil3d_image_view<int> src(sni, snj, snk);
26   for (int i=0; i<sni; ++i)
27     for (int j=0; j<snj; ++j)
28       for (int k=0; k<snk; ++k)
29         src(i,j,k) = 10*k;
30       //src(i,j,k) = k*snj + j*sni + i;
31 
32   int dni=6;
33   int dnj=6;
34   int dnk=6;
35   vil3d_image_view<int> dst(dni, dnj, dnj);
36 
37   vil3d_resample_simple(src, dst, 2, 2, 2);
38 
39   // Testing
40   vil3d_print_all(std::cout, src);
41   vil3d_print_all(std::cout, dst);
42   ///
43 
44   bool all_voxs_correct = true;
45   for (int i=0; i<dni; ++i)
46     for (int j=0; j<dnj; ++j)
47       for (int k=0; k<dnk; ++k)
48         all_voxs_correct = all_voxs_correct && (src(i/2, j/2, k/2)==dst(i,j,k));
49 
50   TEST("All voxel values correct", all_voxs_correct, true);
51 }
52 
test_resample_tricubic()53 static void test_resample_tricubic()
54 {
55   std::cout << "*******************************\n"
56            << " Testing vil3d_resample_tricubic\n"
57            << "*******************************\n";
58 
59   unsigned sni=6;
60   unsigned snj=6;
61   unsigned snk=6;
62   vil3d_image_view<vxl_uint_32> src(sni, snj, snk);
63   for (unsigned int i=0; i<sni; ++i)
64     for (unsigned int j=0; j<snj; ++j)
65       for (unsigned int k=0; k<snk; ++k)
66         src(i,j,k) = 10*k + 100*j + 1000*i;
67 
68   vil3d_image_view<vxl_uint_32> dst;
69   vil3d_resample_tricubic_edge_trilin_extend(src, dst, 11, 11, 11);
70   unsigned dni = dst.ni();
71   unsigned dnj = dst.nj();
72   unsigned dnk = dst.nk();
73 
74   // Testing
75   std::cout << "src image:" << std::endl;
76   vil3d_print_all(std::cout, src);
77   std::cout << "dst image:" << std::endl;
78   vil3d_print_all(std::cout, dst);
79   ///
80 
81   bool all_voxs_correct = true;
82   for (unsigned int k=0; k<dnk; ++k)
83     for (unsigned int j=0; j<dnj; ++j)
84       for (unsigned int i=0; i<dni; ++i)
85       {
86         all_voxs_correct = all_voxs_correct && 10*k+100*j+1000*i==2*dst(i,j,k);
87       }
88 
89   TEST("All voxel values correct", all_voxs_correct, true);
90 }
91 
92 //==============================================================================
test_resample_trilinear()93 static void test_resample_trilinear()
94 {
95   std::cout << "**********************************\n"
96            << " Testing vil3d_resample_trilinear\n"
97            << "**********************************\n";
98 
99   unsigned sni=3;
100   unsigned snj=3;
101   unsigned snk=3;
102   vil3d_image_view<int> src(sni, snj, snk);
103   for (unsigned i=0; i<sni; ++i)
104     for (unsigned j=0; j<snj; ++j)
105       for (unsigned k=0; k<snk; ++k)
106         src(i,j,k) = 10*k + 100*j + 1000*i;
107 
108   vil3d_image_view<int> dst;
109   vil3d_resample_trilinear(src, dst, 2.0, 2.0, 2.0);
110   unsigned dni = dst.ni();
111   unsigned dnj = dst.nj();
112   unsigned dnk = dst.nk();
113 
114   // Testing
115   vil3d_print_all(std::cout, src);
116   vil3d_print_all(std::cout, dst);
117   ///
118 
119   bool all_voxs_correct = true;
120   for (unsigned i=0; i+1<dni; ++i)
121     for (unsigned j=0; j+1<dnj; ++j)
122       for (unsigned k=0; k+1<dnk; ++k)
123         all_voxs_correct = all_voxs_correct && dst(i,j,k)==int(5*k + 50*j + 500*i);
124 
125   TEST("Voxel values correct", all_voxs_correct, true);
126 }
127 
128 
129 //==============================================================================
test_resample_trilinear_edge_extend()130 static void test_resample_trilinear_edge_extend()
131 {
132   std::cout << "**********************************************\n"
133            << " Testing vil3d_resample_trilinear_edge_extend\n"
134            << "**********************************************\n";
135 
136   unsigned sni=3;
137   unsigned snj=3;
138   unsigned snk=3;
139   vil3d_image_view<int> src(sni, snj, snk);
140   for (unsigned i=0; i<sni; ++i)
141     for (unsigned j=0; j<snj; ++j)
142       for (unsigned k=0; k<snk; ++k)
143         src(i,j,k) = 10*k + 100*j + 1000*i;
144 
145   vil3d_image_view<int> dst;
146   vil3d_resample_trilinear_edge_extend(src, dst,
147                                        0.0, 0.0, 0.0,
148                                        0.5, 0.0, 0.0,
149                                        0.0, 0.5, 0.0,
150                                        0.0, 0.0, 0.5,
151                                        5, 5, 6);
152 
153   unsigned dni = dst.ni();
154   unsigned dnj = dst.nj();
155   unsigned dnk = dst.nk();
156 
157   // Testing
158   vil3d_print_all(std::cout, src);
159   vil3d_print_all(std::cout, dst);
160   ///
161 
162   bool all_voxs_correct = true;
163   for (unsigned i=0; i<dni; ++i)
164     for (unsigned j=0; j<dnj; ++j)
165       for (unsigned k=0; k<dnk; ++k)
166         all_voxs_correct = all_voxs_correct &&
167         ((k < 5 && dst(i,j,k)==int(5*k + 50*j + 500*i)) ||
168         (k == 5 && dst(i,j,k)==int(5*4 + 50*j + 500*i)) );
169 
170   TEST("Voxel values correct", all_voxs_correct, true);
171 }
172 
173 //==============================================================================
test_resample_trilinear_scale_2()174 static void test_resample_trilinear_scale_2()
175 {
176   std::cout << "******************************************\n"
177            << " Testing vil3d_resample_trilinear_scale_2\n"
178            << "******************************************\n";
179 
180   unsigned sni=3;
181   unsigned snj=3;
182   unsigned snk=3;
183   vil3d_image_view<int> src(sni, snj, snk);
184   for (unsigned i=0; i<sni; ++i)
185     for (unsigned j=0; j<snj; ++j)
186       for (unsigned k=0; k<snk; ++k)
187         src(i,j,k) = 10000 + 10*k + 100*j + 1000*i;
188 
189   vil3d_image_view<int> dst;
190   vil3d_resample_trilinear_scale_2(src, dst);
191   unsigned dni = dst.ni();
192   unsigned dnj = dst.nj();
193   unsigned dnk = dst.nk();
194 
195   // Testing
196   vil3d_print_all(std::cout, src);
197   vil3d_print_all(std::cout, dst);
198   ///
199 
200   bool all_voxs_correct = true;
201   for (unsigned i=0; i<dni; ++i)
202     for (unsigned j=0; j<dnj; ++j)
203       for (unsigned k=0; k<dnk; ++k)
204         all_voxs_correct = all_voxs_correct && dst(i,j,k)==int(10000 + 5*k + 50*j + 500*i);
205 
206   TEST("Voxel values correct", all_voxs_correct, true);
207 }
208 
209 
210 //==============================================================================
211 //==============================================================================
test_resample()212 static void test_resample()
213 {
214   test_resample_simple();
215   test_resample_trilinear();
216   test_resample_trilinear_edge_extend();
217   test_resample_trilinear_scale_2();
218   test_resample_tricubic();
219 }
220 
221 
222 //==============================================================================
223 //==============================================================================
224 TESTMAIN(test_resample);
225