36 #ifndef AIMS_MESH_CONNECTIVITY_MESHCC_D_H
37 #define AIMS_MESH_CONNECTIVITY_MESHCC_D_H
51 const Texture<T> & inittex, T threshold,
int mode )
54 const std::vector<Point3df> & vert = mesh.
vertex();
55 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
56 unsigned i, n = vert.size();
63 std::map<unsigned, std::set<unsigned> > neighbours;
68 std::cout <<
"Thresholding: " << threshold << std::endl;
95 std::cerr <<
"AimsMeshLabelConnectedComponent : thresholding mode unknown" << std::endl;
98 std::cout << nnode <<
"/" << n << std::endl;
101 for( i=0; i<poly.size(); ++i )
109 neighbours[v1].insert( v2 );
110 neighbours[v2].insert( v1 );
115 neighbours[v1].insert( v3 );
116 neighbours[v3].insert( v1 );
121 neighbours[v2].insert( v3 );
122 neighbours[v3].insert( v2 );
128 std::stack<unsigned> current;
129 std::set<unsigned>::iterator in, fn;
132 printf(
"Computing connected component\n");
141 while(!current.empty())
143 point = current.top();
145 tex.
item(point)=label;
146 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
148 if(tex.
item(*in)==0) current.push(*in);
153 std::cout <<
"nb cc: " << label << std::endl;
164 const std::vector<Point3df> & vert = mesh.
vertex();
165 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
166 unsigned i, n = vert.size();
173 if (inittex.
item(i) == lab)
179 std::map<unsigned, std::set<unsigned> > neighbours;
181 for( i=0; i<poly.size(); ++i )
188 && inittex.
item(v1) == inittex.
item(v2) )
191 neighbours[v1].insert( v2 );
192 neighbours[v2].insert( v1 );
196 && inittex.
item(v1) == inittex.
item(v3) )
198 neighbours[v1].insert( v3 );
199 neighbours[v3].insert( v1 );
203 && inittex.
item(v2) == inittex.
item(v3) )
205 neighbours[v2].insert( v3 );
206 neighbours[v3].insert( v2 );
213 std::stack<unsigned> current;
214 std::set<unsigned>::iterator in, fn;
224 while(!current.empty())
226 point = current.top();
228 tex.
item(point)=label;
229 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
231 if(tex.
item(*in)==0) current.push(*in);
249 const std::vector<Point3df> & vert = mesh.
vertex();
250 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
251 unsigned i, n = vert.size();
254 std::map<T,std::set<unsigned> > labels;
255 std::multimap<unsigned, T> nbLabels;
263 std::map<unsigned, std::set<unsigned> > neighbours;
270 if(inittex.
item(i) < threshold)
283 for( i=0; i<poly.size(); ++i )
290 && inittex.
item(v1) == inittex.
item(v2) )
293 neighbours[v1].insert( v2 );
294 neighbours[v2].insert( v1 );
298 && inittex.
item(v1) == inittex.
item(v3) )
300 neighbours[v1].insert( v3 );
301 neighbours[v3].insert( v1 );
305 && inittex.
item(v2) == inittex.
item(v3) )
307 neighbours[v2].insert( v3 );
308 neighbours[v3].insert( v2 );
314 std::stack<unsigned> current;
315 std::set<unsigned>::iterator in, fn;
322 while(!current.empty())
324 point = current.top();
326 tex.
item(point)=label;
327 labels[label].insert(point);
328 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn; ++in )
330 if(tex.
item(*in)==0) current.push(*in);
333 nbLabels.insert( std::pair<unsigned, T> ( labels[label].size(), label ) );
336 std::cout <<
"Nb of cc : "<< label << std::endl;
338 typename std::multimap<unsigned,T>::reverse_iterator rit;
339 std::map<T, T> nbLabels_ord;
341 for (rit=nbLabels.rbegin(); rit!=nbLabels.rend(); ++rit)
343 nbLabels_ord[rit->second] = ++lab;
344 std::cout <<
"The " << lab <<
"th cc has " << rit->first <<
" points" << std::endl;
347 typename std::map<T, T>::iterator it;
353 for (it=nbLabels_ord.begin(); it!=nbLabels_ord.end(); ++it)
355 if (tex.
item(i) == it->first)
357 tex_ord.
item(i) = it->second;
369 const T & background,
unsigned long ncomp,
unsigned long min_npts,
374 const std::vector<Point3df> & vert = mesh.
vertex();
375 const std::vector< AimsVector<uint,3> > & poly = mesh.
polygon();
376 unsigned i, n = vert.size();
378 std::map<long, std::set<unsigned> > labels;
379 std::multimap<unsigned, long> nbLabels;
380 std::map<long, float> areaLabels;
388 std::map<unsigned, std::set<unsigned> > neighbours;
390 std::vector<float> areas( inittex.
nItem(), 0. );
397 if( inittex.
item(i) != cc_label )
404 for( i=0; i<poly.size(); ++i )
411 surf = ( vert[v2] - vert[v1] ).dot( vert[v3] - vert[v1] ) / 6;
420 neighbours[v1].insert( v2 );
421 neighbours[v2].insert( v1 );
426 neighbours[v1].insert( v3 );
427 neighbours[v3].insert( v1 );
432 neighbours[v2].insert( v3 );
433 neighbours[v3].insert( v2 );
439 std::stack<unsigned> current;
440 std::set<unsigned>::iterator in, fn;
448 while(!current.empty())
450 point = current.top();
452 tex.
item(point)=label;
453 labels[label].insert(point);
454 areaLabels[label] += areas[point];
455 for( in=neighbours[point].begin(), fn=neighbours[point].end(); in!=fn;
462 nbLabels.insert( std::make_pair( labels[label].size(), label) );
463 std::cout <<
"The " << label <<
" th cc (" << cc_label <<
") has "
464 << labels[label].size() <<
" points, area: " << areaLabels[label]
465 <<
" mm2" << std::endl;
468 std::cout <<
"Nb of cc : "<< label << std::endl;
470 std::multimap<unsigned, long>::reverse_iterator il, el=nbLabels.rend();
471 std::set<long> allowed_labels;
475 for( il=nbLabels.rbegin(), c=0; il!=el; ++il, ++c )
477 if( ncomp != 0 && c >= ncomp )
479 if( min_npts != 0 && il->first < min_npts )
481 if( min_surf != 0. && areaLabels[il->second] < min_surf )
483 allowed_labels.insert( il->second );
485 std::cout <<
"keeping " << allowed_labels.size() <<
" components"
493 if( allowed_labels.find( tex.
item(i) ) != allowed_labels.end() )
const std::vector< Point3df > & vertex() const
const std::vector< AimsVector< uint, D > > & polygon() const
void reserve(size_t size)
const T & item(int n) const
void push_back(const T &item)
const int FORBIDDEN
hum, should not be there as a global, non-namespaced variable...
Texture< T > AimsMeshLabelConnectedComponent2Texture(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, T threshold)
unsigned AimsMeshLabelNbConnectedComponent(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, const T lab)
Texture< T > AimsMeshFilterConnectedComponent(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, T cc_label, const T &background, unsigned long ncomp, unsigned long min_npts, float min_surf)
Split label "label" into connected components, then filter smaller ones out.
Texture< T > AimsMeshLabelConnectedComponent(const AimsSurface< 3, Void > &mesh, const Texture< T > &inittex, T threshold, int mode)