94 const std::string & skel_type_str,
95 const std::string & skel_select_type_str,
96 const std::string & tables_folder,
97 const int & persistence = 0,
98 const TDistanceTransform * distance_transform =
nullptr,
99 const bool profile =
false,
100 const bool verbose =
false)
105 trace.
info() <<
"skel_type_str: " << skel_type_str << std::endl;
106 trace.
info() <<
"skel_select_type_str: " << skel_select_type_str << std::endl;
107 if(distance_transform) {
108 trace.
info() <<
" -- provided distance_transform." << std::endl;
110 trace.
info() <<
"persistence: " << persistence << std::endl;
111 trace.
info() <<
"profile: " << profile << std::endl;
112 trace.
info() <<
"verbose: " << verbose << std::endl;
113 trace.
info() <<
"----------" << std::endl;
118 const bool skel_type_str_is_valid =
119 skel_type_str ==
"ultimate" ||
120 skel_type_str ==
"end" ||
121 skel_type_str ==
"isthmus" ||
122 skel_type_str ==
"1isthmus" ||
123 skel_type_str ==
"isthmus1";
124 if(!skel_type_str_is_valid) {
125 throw std::runtime_error(
"skel_type_str is not valid: \"" + skel_type_str +
"\"");
128 const bool skel_select_type_str_is_valid =
129 skel_select_type_str ==
"first" ||
130 skel_select_type_str ==
"random" ||
131 skel_select_type_str ==
"dmax";
132 if(!skel_select_type_str_is_valid) {
133 throw std::runtime_error(
"skel_select_type_str is not valid: \"" + skel_select_type_str +
"\"");
145 using Complex = TComplex;
146 using ComplexCell =
typename Complex::Cell;
147 using ComplexClique =
typename Complex::Clique;
151 boost::dynamic_bitset<> isthmus_table;
152 auto &sk = skel_type_str;
153 if(sk ==
"isthmus") {
154 const std::string tableIsthmus = tables_folder +
"/isthmusicity_table26_6.zlib";
156 }
else if(sk ==
"isthmus1" || sk ==
"1ishtmus") {
157 const std::string tableOneIsthmus = tables_folder +
"/isthmusicityOne_table26_6.zlib";
166 *DGtal::functions::mapZeroPointNeighborhoodToConfigurationMask<Point>();
167 std::function<bool(
const Complex&,
const ComplexCell&)> Skel;
168 if(sk ==
"ultimate") {
169 Skel = DGtal::functions::skelUltimate<Complex>;
170 }
else if(sk ==
"end") {
171 Skel = DGtal::functions::skelEnd<Complex>;
174 }
else if(sk ==
"isthmus1" || sk ==
"1ishtmus") {
175 Skel = [&isthmus_table, &pointMap](
const Complex& fc,
176 const ComplexCell& c) {
179 }
else if(sk ==
"isthmus") {
180 Skel = [&isthmus_table, &pointMap](
const Complex& fc,
181 const ComplexCell& c) {
185 throw std::runtime_error(
"Invalid skel string");
189 std::function<std::pair<typename Complex::Cell, typename Complex::Data>(
190 const ComplexClique&)>
194 auto start = std::chrono::system_clock::now();
197 using DT = TDistanceTransform;
198 using DTDigitalSet =
typename DT::PointPredicate;
199 using DTDigitalSetDomain =
typename DTDigitalSet::Domain;
200 using Metric =
typename DT::SeparableMetric;
202 auto &sel = skel_select_type_str;
203 const bool compute_distance_transform = !distance_transform && sel ==
"dmax";
204 DTDigitalSetDomain vc_domain = compute_distance_transform ?
205 DTDigitalSetDomain(vc.space().lowerBound(), vc.space().upperBound()) :
209 DTDigitalSet image_set = DTDigitalSet(vc_domain);
210 if(compute_distance_transform) {
211 vc.dumpVoxels(image_set);
214 DT dist_map(vc_domain, image_set, l3);
215 if(compute_distance_transform) {
216 distance_transform = &dist_map;
219 if(sel ==
"random") {
220 Select = DGtal::functions::selectRandom<Complex>;
221 }
else if(sel ==
"first") {
222 Select = DGtal::functions::selectFirst<Complex>;
223 }
else if(sel ==
"dmax") {
224 Select = [&distance_transform](
const ComplexClique& clique) {
225 return selectMaxValue<TDistanceTransform, Complex>(*distance_transform, clique);
228 throw std::runtime_error(
"Invalid skel select type");
232 Complex vc_new(vc.space());
233 if(persistence == 0) {
234 vc_new = DGtal::functions::asymetricThinningScheme<Complex>(vc, Select, Skel, verbose);
236 vc_new = DGtal::functions::persistenceAsymetricThinningScheme<Complex>(vc, Select, Skel,
237 persistence, verbose);
241 auto end = std::chrono::system_clock::now();
242 auto elapsed = std::chrono::duration_cast<std::chrono::seconds>(end - start);
244 std::cout <<
"Time elapsed: " << elapsed.count() << std::endl;
TComplex thinningVoxelComplex(TComplex &vc, const std::string &skel_type_str, const std::string &skel_select_type_str, const std::string &tables_folder, const int &persistence=0, const TDistanceTransform *distance_transform=nullptr, const bool profile=false, const bool verbose=false)