30 #ifndef APPS_GENERIC_SKEL_IMAGE3D_SKEL_HH
31 # define APPS_GENERIC_SKEL_IMAGE3D_SKEL_HH
33 #include <mln/version.hh>
35 #include <mln/core/image/image3d.hh>
37 #include <mln/math/sqr.hh>
38 #include <mln/math/sqrt.hh>
54 load_pgm_3d(
const std::string&
filename)
56 std::ifstream
file(filename.c_str());
59 std::getline(file, magic);
60 mln_assertion(magic ==
"P5");
62 const size_t ncomments = 3;
63 std::string comment[ncomments];
64 std::string expected[ncomments] = {
"#xdim 1",
"#ydim 1",
"#zdim 1" };
67 for (
size_t i = 0; i < ncomments; ++i)
69 std::getline(file, comment[i]);
70 mln_assertion(comment[i] == expected[i]);
103 std::ofstream
file(filename.c_str());
106 file << static_cast<
char>(ima(p) ? 0xff : 0x00);
117 save_vtk_polygons(const mln::image3d<
bool>& ima,
118 const std::
string& filename)
120 std::ofstream
file(filename.c_str());
124 <<
"# vtk DataFile Version 2.0" << std::endl
125 <<
"Generated by " OLN_PACKAGE_STRING
" (" OLN_PACKAGE_URL
")" << std::endl
126 <<
"ASCII" << std::endl
140 file << "DATASET POLYDATA" << std::endl;
142 file << "POINTS " << ncubes * 8 << "
float" << std::endl;
150 file << p[0] - r << ' ' << p[1] - r << ' ' << p[2] - r << " "
151 << p[0] + r << ' ' << p[1] - r << ' ' << p[2] - r << " "
152 << p[0] + r << ' ' << p[1] + r << ' ' << p[2] - r << " "
153 << p[0] - r << ' ' << p[1] + r << ' ' << p[2] - r << " "
154 << p[0] - r << ' ' << p[1] - r << ' ' << p[2] + r << " "
155 << p[0] + r << ' ' << p[1] - r << ' ' << p[2] + r << " "
156 << p[0] + r << ' ' << p[1] + r << ' ' << p[2] + r << " "
157 << p[0] - r << ' ' << p[1] + r << ' ' << p[2] + r
171 << ncubes * 6 * (1 + 4) << std::endl;
174 for (
unsigned i = 0; i < ncubes; ++i)
179 { 8 * i + 0, 8 * i + 1, 8 * i + 2, 8 * i + 3,
180 8 * i + 4, 8 * i + 5, 8 * i + 6, 8 * i + 7 };
183 <<
"4 " << v[0] <<
' ' << v[1] <<
' ' << v[2] <<
' ' << v[3] <<
'\n'
184 <<
"4 " << v[4] <<
' ' << v[5] <<
' ' << v[6] <<
' ' << v[7] <<
'\n'
185 <<
"4 " << v[0] <<
' ' << v[1] <<
' ' << v[5] <<
' ' << v[4] <<
'\n'
186 <<
"4 " << v[2] <<
' ' << v[3] <<
' ' << v[7] <<
' ' << v[6] <<
'\n'
187 <<
"4 " << v[0] <<
' ' << v[4] <<
' ' << v[7] <<
' ' << v[3] <<
'\n'
188 <<
"4 " << v[1] <<
' ' << v[2] <<
' ' << v[6] <<
' ' << v[5] <<
'\n'
199 const std::string& filename)
201 std::ofstream
file(filename.c_str());
205 <<
"# vtk DataFile Version 2.0" << std::endl
206 <<
"Generated by " OLN_PACKAGE_STRING
" (" OLN_PACKAGE_URL
")" << std::endl
207 <<
"ASCII" << std::endl
221 file << "DATASET UNSTRUCTURED_GRID" << std::endl;
223 file << "POINTS " << ncubes * 8 << "
float" << std::endl;
231 file << p[0] - r << ' ' << p[1] - r << ' ' << p[2] - r << " "
232 << p[0] + r << ' ' << p[1] - r << ' ' << p[2] - r << " "
233 << p[0] + r << ' ' << p[1] + r << ' ' << p[2] - r << " "
234 << p[0] - r << ' ' << p[1] + r << ' ' << p[2] - r << " "
235 << p[0] - r << ' ' << p[1] - r << ' ' << p[2] + r << " "
236 << p[0] + r << ' ' << p[1] - r << ' ' << p[2] + r << " "
237 << p[0] + r << ' ' << p[1] + r << ' ' << p[2] + r << " "
238 << p[0] - r << ' ' << p[1] + r << ' ' << p[2] + r
243 file << "CELLS " << ncubes << ' '
247 << ncubes * (1 + 8) << std::endl;
250 for (
unsigned i = 0; i < ncubes; ++i)
255 { 8 * i + 0, 8 * i + 1, 8 * i + 2, 8 * i + 3,
256 8 * i + 4, 8 * i + 5, 8 * i + 6, 8 * i + 7 };
260 << v[0] <<
' ' << v[1] <<
' ' << v[3] <<
' ' << v[2] <<
' '
261 << v[4] <<
' ' << v[5] <<
' ' << v[7] <<
' ' << v[6]
267 file <<
"CELL_TYPES " << ncubes << std::endl;
268 for (
unsigned i = 0; i < ncubes; ++i)
270 file << 11 << std::endl;
289 I output(input.
nslis() / factor,
290 input.
nrows() / factor,
291 input.
ncols() / factor);
292 mln_piter_(I) po(output.domain());
296 point3d pi_min(po.sli() * factor,
299 point3d pi_max((po.sli() + 1) * factor - 1,
300 (po.row() + 1) * factor - 1,
301 (po.col() + 1) * factor - 1);
302 box3d sample_box(pi_min, pi_max);
303 size_t sample_size = sample_box.nsites();
307 unsigned ntrue_vals = 0;
308 unsigned nfalse_vals = 0;
309 mln_piter_(
box3d)
pi(sample_box);
318 if ( ntrue_vals > sample_size / 2
319 || nfalse_vals > sample_size / 2)
322 output(po) = (ntrue_vals >= nfalse_vals);
337 unsigned int_radius,
unsigned ext_radius)
342 mln_precondition(0 <= axis_dim && axis_dim < 3);
344 unsigned dim1 = (axis_dim + 1) % 3;
345 unsigned dim2 = (axis_dim + 2) % 3;
348 const unsigned mid_radius = (ext_radius + int_radius) / 2;
350 const unsigned torus_radius = (ext_radius - int_radius) / 2 ;
353 bb_min[axis_dim] = -torus_radius;
354 bb_min[dim1] = -ext_radius;
355 bb_min[dim2] = -ext_radius;
358 bb_max[axis_dim] = torus_radius;
359 bb_max[dim1] = ext_radius;
360 bb_max[dim2] = ext_radius;
363 mln_assertion(ima.
has(bb_min));
364 mln_assertion(ima.
has(bb_max));
366 box3d bb(bb_min, bb_max);
367 mln_piter_(
box3d) p(bb);
371 unsigned lo_radius = mid_radius - x;
372 unsigned hi_radius = mid_radius + x;
387 +half_len, +half_len, +half_len);
393 draw_torus(ima, 0, int_radius, ext_radius);
394 draw_torus(ima, 1, int_radius, ext_radius);
395 draw_torus(ima, 2, int_radius, ext_radius);
399 #endif // ! APPS_GENERIC_SKEL_IMAGE3D_SKEL_HH