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