Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
a5aaab6
Add weighted images
lrineau Apr 8, 2021
71b85f4
Fix license
lrineau Apr 8, 2021
76d2fcd
Missing header
lrineau Apr 13, 2021
a9c2e07
Fix the runtime error without arguments
lrineau Apr 13, 2021
d831724
convert a CGAL::Image_3 to ITK format to generate weights for weighte…
janetournois Jun 14, 2021
b47cf8e
compute indicator images and fit them to [0; 255]
janetournois Jun 14, 2021
293b28d
perform gaussian smoothing
janetournois Jun 14, 2021
16db150
fix allocation of image
janetournois Jun 15, 2021
c07c712
duplicate image before application of filters
janetournois Jun 15, 2021
83c40f2
fix return type
janetournois Jun 21, 2021
3b23b56
generate_weights is now working
janetournois Jun 21, 2021
5828996
the Weights_type is unsigned char, not Image_word_type
janetournois Jun 24, 2021
ee6f2f8
wrap debug code in macro CGAL_MESH_3_WEIGHTED_IMAGES_DEBUG
janetournois Jun 24, 2021
445378f
remove writeImage from example
janetournois Jun 24, 2021
89a227a
make 'weights' a boost named parameter of create_labeled_image_mesh_d…
janetournois Jun 25, 2021
89e9269
use using instead of typedef and remove unused typedefs
janetournois Jul 5, 2021
d069c07
remove Image_word_type template parameter
janetournois Jul 5, 2021
ba95896
add doc for weighted images
janetournois Jul 6, 2021
5edf9d4
improve example for doc
janetournois Jul 26, 2021
255ded5
do not compile weighted images example if ITK not found
janetournois Jul 26, 2021
a2a9261
do not compile weighted images example if ITK not found
janetournois Jul 26, 2021
85c2c20
doc tiny fixes
janetournois Jul 26, 2021
fc9aed7
doc
janetournois Jul 26, 2021
c5a6838
add missing typename
janetournois Jul 26, 2021
2637bf6
add weighted images to the demo
janetournois Jul 27, 2021
f46caac
WIP fix weighted images in demo
janetournois Jul 27, 2021
ecdb873
move weights to the image_item so that it does not get prematurely de…
janetournois Jul 28, 2021
77327b5
(re)compute weights only if sigma has changed
janetournois Jul 28, 2021
d41a8f4
add tooltip to c3t3 generated from image
janetournois Jul 28, 2021
a7a9699
fix tab order
janetournois Jul 28, 2021
53cd9a0
fix DoubleEdit content
janetournois Jul 28, 2021
720d1a7
fix types and do not skip label 0
janetournois Jul 28, 2021
834c9d4
Whitelist CGAL/Mesh_3/generate_weights_from_labeled_image.h
lrineau Jul 29, 2021
b2d7622
add missing id increment
janetournois Jul 29, 2021
c133042
refine less the surface
janetournois Jul 29, 2021
d1de29d
improve debug code
janetournois Jul 29, 2021
3d240e6
Merge branch 'Mesh_3-weighted_images-GF' of github.com:lrineau/cgal i…
janetournois Jul 29, 2021
438422e
fix outdated code
janetournois Jul 29, 2021
b4932e3
add weighted images figure
janetournois Jul 29, 2021
f9f2889
Merge branch 'Mesh_3-weighted_images-GF' of github.com:lrineau/cgal i…
janetournois Jul 29, 2021
4b84c4b
move dump to debug code
janetournois Jul 29, 2021
868e158
improve figure caption
janetournois Jul 29, 2021
77152be
uncomment the use of weights in example
janetournois Jul 29, 2021
e1d4c0d
rename generate_weights() to generate_label_weights()
janetournois Aug 31, 2021
2a4090b
rename header in doc
janetournois Aug 31, 2021
4bcbcfd
Change the name of whitelisted header
lrineau Sep 14, 2021
666a540
documents weights size
janetournois Sep 20, 2021
e516b19
use Parallel_if_available_tag
janetournois Sep 20, 2021
8bfb4e4
avoid all triple for loops on i,j,k
janetournois Sep 21, 2021
4427415
Merge branch 'Mesh_3-weighted_images-GF' of github.com:lrineau/cgal i…
janetournois Sep 21, 2021
0bc25f9
doc (add dependency and new link)
janetournois Sep 21, 2021
4fdd584
fix indentation
janetournois Sep 21, 2021
1721570
create CGAL::Image_3 for weights before counting non-white pixels
janetournois Sep 23, 2021
6be3be6
make constructor explicit to avoid implicit conversions
janetournois Sep 23, 2021
4a65ce0
Merge branch 'Mesh_3-weighted_images-GF' of github.com:lrineau/cgal i…
janetournois Sep 23, 2021
bddb4fc
remove debug code
janetournois Sep 23, 2021
8a882ad
Cmake : use only the required modules of ITK
janetournois Sep 23, 2021
95a4613
Merge branch 'Mesh_3-weighted_images-GF' of github.com:lrineau/cgal i…
janetournois Sep 23, 2021
9c02c24
add missing cmake module requirement
janetournois Sep 23, 2021
3df8c33
Merge remote-tracking branch 'cgal/master' into Mesh_3-weighted_image…
janetournois Sep 23, 2021
4b3fee8
ITK is not needed in c3t3_item, and find with the required components…
janetournois Sep 23, 2021
96ff627
fix CMakeLists.txt
janetournois Sep 23, 2021
cf4edab
user manual
janetournois Oct 4, 2021
38122ce
disable the weights menu when ITK is not available
janetournois Oct 4, 2021
992f55b
fix warning
janetournois Oct 4, 2021
dd493fd
loop on i because label is not used
janetournois Oct 4, 2021
8a6d92f
use "image of weights" in doc
janetournois Oct 4, 2021
a6d486f
add missing cast
janetournois Oct 4, 2021
509ecfa
smoothing/smoother
janetournois Oct 4, 2021
9beac5e
hide menu when the input is not a labeled image
janetournois Oct 4, 2021
5b2e4d1
replace std::unary_function, that is deprecated in C++11
janetournois Oct 4, 2021
f5eeffb
remove unnecessary inheritance
janetournois Oct 4, 2021
ac7b637
make types consistent with non-weighted label images
janetournois Oct 5, 2021
c8918a9
fix conversion warning
janetournois Oct 11, 2021
fab7c36
function is in the IO namespace
sloriot Oct 13, 2021
b664ee5
workaround deprecation warning of versions < 5 of ITK
janetournois Oct 21, 2021
0498cac
add and use CGAL_ITK_support.cmake
janetournois Oct 26, 2021
70ad367
add CMake warning when ITK is not found
janetournois Oct 27, 2021
caa8c74
remove "and" from regex for blue testsuite boxes
janetournois Oct 29, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions BGL/include/CGAL/boost/parameter.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ BOOST_PARAMETER_NAME( (pointer_to_stop_atomic_boolean, tag ) pointer_to_stop_ato
BOOST_PARAMETER_NAME( (function, tag ) function_)
BOOST_PARAMETER_NAME( (bounding_object, tag ) bounding_object_)
BOOST_PARAMETER_NAME( (relative_error_bound, tag ) relative_error_bound_)
BOOST_PARAMETER_NAME( (weights, tag) weights_)
BOOST_PARAMETER_NAME( (p_rng, tag ) p_rng_)
BOOST_PARAMETER_NAME( (null_subdomain_index, tag ) null_subdomain_index_)
BOOST_PARAMETER_NAME( (construct_surface_patch_index, tag ) construct_surface_patch_index_)
Expand Down
13 changes: 9 additions & 4 deletions CGAL_ImageIO/include/CGAL/Image_3.h
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ class CGAL_IMAGEIO_EXPORT Image_3
// std::cerr << "Image_3::copy_constructor\n";
}

Image_3(_image* im, Own own_the_data = OWN_THE_DATA)
explicit Image_3(_image* im, Own own_the_data = OWN_THE_DATA)
{
private_read(im, own_the_data);
}
Expand Down Expand Up @@ -146,9 +146,9 @@ class CGAL_IMAGEIO_EXPORT Image_3
double vy() const { return image_ptr->vy; }
double vz() const { return image_ptr->vz; }

double tx() const { return image_ptr->tx; }
double ty() const { return image_ptr->ty; }
double tz() const { return image_ptr->tz; }
float tx() const { return image_ptr->tx; }
float ty() const { return image_ptr->ty; }
float tz() const { return image_ptr->tz; }

float value(const std::size_t i,
const std::size_t j,
Expand All @@ -157,6 +157,11 @@ class CGAL_IMAGEIO_EXPORT Image_3
return ::evaluate(image(),i,j,k);
}

bool is_valid() const
{
return image_ptr.get() != nullptr;
}

public:

bool read(const char* file)
Expand Down
6 changes: 6 additions & 0 deletions Documentation/doc/biblio/cgal_manual.bib
Original file line number Diff line number Diff line change
Expand Up @@ -3256,6 +3256,12 @@ @article{cgal:Wwshap-eepec-20
publisher = {ACM}
}

@article{stalling1998weighted,
title={Weighted labels for 3D image segmentation},
author={Stalling, Detlev and Z{\"o}ckler, Malte and Sander, Oliver and Hege, Hans-Christian},
year={1998}
}

% ----------------------------------------------------------------------------
% END OF BIBFILE
% ----------------------------------------------------------------------------
7 changes: 7 additions & 0 deletions Installation/cmake/modules/CGAL_ITK_support.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
if(ITK_FOUND AND NOT TARGET CGAL::ITK_support)
add_library(CGAL::ITK_support INTERFACE IMPORTED)
set_target_properties(CGAL::ITK_support PROPERTIES
INTERFACE_COMPILE_DEFINITIONS "CGAL_USE_ITK"
INTERFACE_INCLUDE_DIRECTORIES "${ITK_INCLUDE_DIRS}"
INTERFACE_LINK_LIBRARIES "${ITK_LIBRARIES}")
endif()
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ set(list_of_whitelisted_headers_txt [=[
CGAL/IO/Triangulation_geomview_ostream_3.h
CGAL/IO/Triangulation_geomview_ostream_2.h
CGAL/IO/Polyhedron_geomview_ostream.h

CGAL/Mesh_3/generate_label_weights.h
]=])

separate_arguments(list_of_whitelisted_headers UNIX_COMMAND ${list_of_whitelisted_headers_txt})
11 changes: 11 additions & 0 deletions Mesh_3/doc/Mesh_3/CGAL/Labeled_mesh_domain_3.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,12 @@ The parameters are optional unless otherwise specified.
<li> <b>`parameters::image` (mandatory)</b> the input 3D image. Must
be a `CGAL::Image_3` object.

<li> <b>`parameters::weights`</b> an input 3D image that provides
weights associated to each voxel (the word type is `unsigned char`,
and the voxels values are integers between 0 and 255).
The weights image can be generated with `CGAL::Mesh_3::generate_label_weights()`.
Its dimensions must be the same as the dimensions of `parameters::image`.

<li><b>`parameter::value_outside`</b> the value attached to voxels
outside of the domain to be meshed. Its default value is `0`.

Expand All @@ -246,6 +252,11 @@ From the example (\ref Mesh_3/mesh_3D_image.cpp):

\snippet Mesh_3/mesh_3D_image.cpp Domain creation

From the example (\ref Mesh_3/mesh_3D_weighted_image.cpp),
where the labeled image is used with a precomputed 3D image of weights :

\snippet Mesh_3/mesh_3D_weighted_image.cpp Domain creation

*/
template <typename ... A_i>
static
Expand Down
3 changes: 2 additions & 1 deletion Mesh_3/doc/Mesh_3/Doxyfile.in
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ ALIASES += "cgalDescribePolylineType=A polyline is defined as a sequence of poin

INPUT += \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Polyhedral_complex_mesh_domain_3.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_domain_with_polyline_features_3.h \
${CGAL_PACKAGE_INCLUDE_DIR}/CGAL/Mesh_3/generate_label_weights.h

PROJECT_NAME = "CGAL ${CGAL_DOC_VERSION} - 3D Mesh Generation"
HTML_EXTRA_FILES = ${CGAL_PACKAGE_DOC_DIR}/fig/implicit_domain_3.jpg \
Expand Down
18 changes: 18 additions & 0 deletions Mesh_3/doc/Mesh_3/Mesh_3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,24 @@ The resulting mesh is shown in \cgalFigureRef{figureliver_3d_image_mesh}.
Cut view of a 3D mesh produced from a segmented liver image. Code from subsection \ref Mesh_3_subsection_examples_3d_image generates this file.
\cgalFigureEnd

\subsubsection Mesh_3DomainsFrom3DImagesWithWeights Domains From Segmented 3D Images, with Weights

When a segmented image is given as input, the generated mesh surface sometimes sticks too closely
to the voxels surface, causing an aliasing effect.
A solution to generate a smooth and accurate output surface was described by Stalling et al in
\cgalCite{stalling1998weighted}. It consists in generating a second input image, made
of integer coefficients called *weights*, and use those weights to define smoother domain boundaries.
The 3D image of weights can be generated using `CGAL::Mesh_3::generate_weights()` as shown in
the following example.

\cgalExample{Mesh_3/mesh_3D_weighted_image.cpp}

\cgalFigureBegin{figure_weightedImage, weighted_images.jpg}
Surface of the output mesh generated with a very small `facet_distance`
without the weights (left, 25563 vertices) and with the weights (right, 19936 vertices).
\cgalFigureEnd


\subsubsection Mesh_3DomainsFrom3DImagesWithCustomInitialization Domains From 3D Images, with a Custom Initialization

The example \ref Mesh_3/mesh_3D_image_with_custom_initialization.cpp is a modification
Expand Down
1 change: 1 addition & 0 deletions Mesh_3/doc/Mesh_3/PackageDescription.txt
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ and their associated classes:
- `CGAL::lloyd_optimize_mesh_3()`
- `CGAL::odt_optimize_mesh_3()`
- `CGAL::facets_in_complex_3_to_triangle_mesh()`
- `CGAL::Mesh_3::generate_label_weights()`

\cgalCRPSection{CGAL::parameters Functions}

Expand Down
1 change: 1 addition & 0 deletions Mesh_3/doc/Mesh_3/examples.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
\example Mesh_3/mesh_3D_gray_image_with_custom_initialization.cpp
\example Mesh_3/mesh_3D_image_with_features.cpp
\example Mesh_3/mesh_3D_image_with_custom_initialization.cpp
\example Mesh_3/mesh_3D_weighted_image.cpp
\example Mesh_3/random_labeled_image.h
\example CGAL/Mesh_3/initialize_triangulation_from_gray_image.h
\example CGAL/Mesh_3/initialize_triangulation_from_labeled_image.h
Expand Down
Binary file added Mesh_3/doc/Mesh_3/fig/weighted_images.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 13 additions & 1 deletion Mesh_3/examples/Mesh_3/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,21 @@ if(TARGET CGAL::CGAL_ImageIO)
create_single_source_cgal_program("mesh_3D_image_variable_size.cpp")
target_link_libraries(mesh_3D_image_variable_size
PUBLIC CGAL::Eigen3_support)

find_package(ITK QUIET COMPONENTS ITKCommon ITKThresholding ITKSmoothing ITKImageIntensity)
if(ITK_FOUND)
include(CGAL_ITK_support)
create_single_source_cgal_program("mesh_3D_weighted_image.cpp")
target_link_libraries(mesh_3D_weighted_image
PUBLIC CGAL::Eigen3_support CGAL::ITK_support)
else(ITK_FOUND)
message(STATUS "NOTICE: The examples that need ITK will not be compiled.")
endif(ITK_FOUND)

else()
message(
STATUS
"NOTICE: The examples mesh_3D_image.cpp, mesh_3D_image_variable_size.cpp, mesh_optimization_example.cpp and mesh_optimization_lloyd_example.cpp need CGAL_ImageIO to be configured with ZLIB support, and will not be compiled."
"NOTICE: The examples mesh_3D_image.cpp, mesh_3D_weighted_image.cpp, mesh_3D_image_variable_size.cpp, mesh_optimization_example.cpp and mesh_optimization_lloyd_example.cpp need CGAL_ImageIO to be configured with ZLIB support, and will not be compiled."
)
endif()

Expand All @@ -179,6 +190,7 @@ if(CGAL_ACTIVATE_CONCURRENT_MESH_3 AND TARGET CGAL::TBB_support)
foreach(
target
mesh_3D_image
mesh_3D_weighted_image
mesh_3D_image_variable_size
mesh_3D_image_with_custom_initialization
mesh_3D_gray_image_with_custom_initialization
Expand Down
67 changes: 67 additions & 0 deletions Mesh_3/examples/Mesh_3/mesh_3D_weighted_image.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>

#include <CGAL/Mesh_triangulation_3.h>
#include <CGAL/Mesh_complex_3_in_triangulation_3.h>
#include <CGAL/Mesh_criteria_3.h>

#include <CGAL/Labeled_mesh_domain_3.h>
#include <CGAL/Mesh_3/generate_label_weights.h>
#include <CGAL/make_mesh_3.h>
#include <CGAL/Image_3.h>
#include <CGAL/IO/File_binary_mesh_3.h>
#include <CGAL/tags.h>

// Domain
using K = CGAL::Exact_predicates_inexact_constructions_kernel;
using Mesh_domain = CGAL::Labeled_mesh_domain_3<K>;

// Triangulation
using Tr = CGAL::Mesh_triangulation_3<Mesh_domain,
CGAL::Default,
CGAL::Parallel_if_available_tag>::type;
using C3t3 = CGAL::Mesh_complex_3_in_triangulation_3<Tr>;

// Criteria
using Mesh_criteria = CGAL::Mesh_criteria_3<Tr>;

// To avoid verbose function and named parameters call
using namespace CGAL::parameters;

int main(int argc, char* argv[])
{
/// [Loads image]
const char* fname = (argc > 1) ? argv[1] : "data/liver.inr.gz";
CGAL::Image_3 image;
if(!image.read(fname)){
std::cerr << "Error: Cannot read file " << fname << std::endl;
return EXIT_FAILURE;
}
/// [Loads image]

/// [Domain creation]
const float sigma = 10.f;
CGAL::Image_3 img_weights =
CGAL::Mesh_3::generate_label_weights(image, sigma);

Mesh_domain domain
= Mesh_domain::create_labeled_image_mesh_domain(image,
weights = img_weights,
relative_error_bound = 1e-6);
/// [Domain creation]

// Mesh criteria
Mesh_criteria criteria(facet_angle=30, facet_size=6, facet_distance=0.5,
cell_radius_edge_ratio=3, cell_size=8);

/// [Meshing]
C3t3 c3t3 = CGAL::make_mesh_3<C3t3>(domain, criteria);
/// [Meshing]

// Output
std::ofstream medit_file("out.mesh");
c3t3.output_to_medit(medit_file);
std::ofstream bin_file("out.binary.cgal", std::ios_base::binary);
CGAL::IO::save_binary_file(bin_file, c3t3);

return 0;
}
87 changes: 78 additions & 9 deletions Mesh_3/include/CGAL/Labeled_mesh_domain_3.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
// support for `CGAL::Image_3`
#include <CGAL/Image_3.h>
#include <CGAL/Mesh_3/Image_to_labeled_function_wrapper.h>
#include <CGAL/Mesh_3/Image_plus_weights_to_labeled_function_wrapper.h>

// support for implicit functions
#include <CGAL/Implicit_to_labeling_function_wrapper.h>
Expand Down Expand Up @@ -418,6 +419,7 @@ class Labeled_mesh_domain_3 :
(optional
(relative_error_bound_, (const FT&),
FT(1e-3))
(weights_, (const CGAL::Image_3&), CGAL::Image_3())
(value_outside_, *, 0)
(p_rng_, (CGAL::Random*), (CGAL::Random*)(0))
(image_values_to_subdomain_indices_, *,
Expand All @@ -429,18 +431,37 @@ class Labeled_mesh_domain_3 :
)
{
namespace p = CGAL::parameters;
return Labeled_mesh_domain_3
(create_labeled_image_wrapper
if (weights_.is_valid())
{
return Labeled_mesh_domain_3
(create_weighted_labeled_image_wrapper
(image_,
weights_,
image_values_to_subdomain_indices_,
value_outside_),
Mesh_3::internal::compute_bounding_box(image_),
p::relative_error_bound = relative_error_bound_,
p::p_rng = p_rng_,
p::null_subdomain_index =
create_null_subdomain_index(null_subdomain_index_),
p::construct_surface_patch_index =
create_construct_surface_patch_index(construct_surface_patch_index_));
Mesh_3::internal::compute_bounding_box(image_),
p::relative_error_bound = relative_error_bound_,
p::p_rng = p_rng_,
p::null_subdomain_index =
create_null_subdomain_index(null_subdomain_index_),
p::construct_surface_patch_index =
create_construct_surface_patch_index(construct_surface_patch_index_));
}
else
{
return Labeled_mesh_domain_3
(create_labeled_image_wrapper
(image_,
image_values_to_subdomain_indices_,
value_outside_),
Mesh_3::internal::compute_bounding_box(image_),
p::relative_error_bound = relative_error_bound_,
p::p_rng = p_rng_,
p::null_subdomain_index =
create_null_subdomain_index(null_subdomain_index_),
p::construct_surface_patch_index =
create_construct_surface_patch_index(construct_surface_patch_index_));
}
}

BOOST_PARAMETER_MEMBER_FUNCTION(
Expand Down Expand Up @@ -866,6 +887,33 @@ class Labeled_mesh_domain_3 :
transform_fct(value_outside));
}

template <typename Image_word_type,
typename FT, typename Functor>
static
Function
create_weighted_labeled_image_wrapper_with_know_word_type
(const CGAL::Image_3& image,
const CGAL::Image_3& weights,
const Functor& image_values_to_subdomain_indices,
const FT& value_outside)
{
using Mesh_3::internal::Create_labeled_image_values_to_subdomain_indices;
typedef Create_labeled_image_values_to_subdomain_indices<Functor> C_i_v_t_s_i;
typedef typename C_i_v_t_s_i::type Image_values_to_subdomain_indices;
Image_values_to_subdomain_indices transform_fct =
C_i_v_t_s_i()(image_values_to_subdomain_indices);

typedef Mesh_3::Image_plus_weights_to_labeled_function_wrapper<
Image_word_type,
int, //interpolation type
unsigned char, // Weights_type,
Subdomain_index> Wrapper;
return Wrapper(image,
weights,
transform_fct,
transform_fct(value_outside));
}

template <typename FT, typename Functor>
static
Function
Expand All @@ -885,6 +933,27 @@ class Labeled_mesh_domain_3 :
return Function();
}

template <typename FT, typename Functor>
static
Function
create_weighted_labeled_image_wrapper(const CGAL::Image_3& image,
const CGAL::Image_3& weights,
const Functor& image_values_to_subdomain_indices,
const FT& value_outside)
{
CGAL_IMAGE_IO_CASE(image.image(),
return create_weighted_labeled_image_wrapper_with_know_word_type<Word>
(image,
weights,
image_values_to_subdomain_indices,
value_outside);
);
CGAL_error_msg("This place should never be reached, because it would mean "
"the image word type is a type that is not handled by "
"CGAL_ImageIO.");
return Function();
}

static
Construct_surface_patch_index
create_construct_surface_patch_index(const Null_functor&) {
Expand Down
Loading