37 #ifndef AIMS_CONNECTIVITY_COMPONENT_D_H 38 #define AIMS_CONNECTIVITY_COMPONENT_D_H 57 template<
typename T,
typename O>
61 std::map<O, size_t>& valids,
65 int x = 0, y = 0, z = 0;
68 std::cout <<
"filtering...\n";
73 typename std::map<O, size_t>::iterator is, es = valids.end();
77 is = valids.find( (O) cc( x, y, z ) );
79 out( x, y, z, t ) = (O) is->second;
83 template<
typename T,
typename O>
84 void ConnectedComponentEngine<AimsData<T>,
AimsData<O> >::connectedInFrame(
88 std::multimap<size_t, O>& compSizes,
94 int x = 0, y = 0, z = 0, n = 0;
95 int dimX = data.
dimX();
96 int dimY = data.
dimY();
97 int dimZ = data.
dimZ();
109 if ( data( x, y, z, t ) == backg )
110 flag( x, y, z ) =
true;
118 std::queue<Point3dl> que;
125 for ( z = 0; z < dimZ; ++z )
128 std::cout <<
"\rz: " << z << std::flush;
130 for ( y = 0; y < dimY; ++y )
131 for ( x = 0; x < dimX; ++x )
132 if( !flag( x, y, z ) )
134 val = data( x, y, z, t );
136 flag( x, y, z ) =
true;
138 while ( !que.empty() )
144 for ( n = 0; n < cd.nbNeighbors(); n++ )
146 newpos = pos +
Point3dl(cd.xyzOffset( n )[0],
147 cd.xyzOffset( n )[1],
148 cd.xyzOffset( n )[2]);
150 if ( newpos[0] >= 0 &&
158 && ( bin || data( newpos[0], newpos[1], newpos[2], t ) == val ) )
160 flag( newpos ) =
true;
168 compSizes.insert( std::pair<size_t, O>( sz, label ) );
175 std::cout << std::endl;
176 std::cout << label <<
" components" << std::endl;
181 template<
typename T,
typename O>
182 void ConnectedComponentEngine<AimsData<T>,
AimsData<O> >::connected(
186 std::map<O, size_t>& valids,
187 const T & backg,
bool bin,
188 size_t minSize,
size_t maxSize,
189 size_t numMax,
bool verbose )
191 std::multimap<size_t, size_t> compSizes;
193 int dimX = data.
dimX();
194 int dimY = data.
dimY();
195 int dimZ = data.
dimZ();
196 int dimT = data.
dimT() ;
198 for( t = 0 ; t < dimT ; ++t )
205 ::connectedInFrame( data,
215 std::multimap<size_t, size_t>::reverse_iterator
216 im, em = compSizes.rend();
220 for( im = compSizes.rbegin();
221 im != em && ( numMax == 0 ||
static_cast<size_t>(label) <= numMax ); ++im )
223 if ((minSize ==0 || im->first >= minSize) && (maxSize == 0 || im->first <= maxSize))
226 std::cout <<
"component " << std::setw( 4 ) << im->second
227 <<
" : " << std::setw( 8 ) << im->first
228 <<
" points" << std::endl;
229 valids[ im->second ] =
static_cast<size_t>( label++ );
234 ::filterInFrame( cc, out, valids, t, verbose );
237 std::cout <<
"after filtering: " << valids.size() <<
" components\n";
242 template <
typename T>
246 const T & backgrnd,
bool bin,
247 size_t minsize,
size_t maxsize,
248 size_t maxcomp,
bool verbose )
251 std::unique_ptr<AimsBucket<Void> > abk;
252 if( minsize == 0 && maxsize == 0 && maxcomp == 0 )
263 int x=0, y=0, z=0, t=0, n=0;
265 int dimX = data.
dimX();
266 int dimY = data.
dimY();
267 int dimZ = data.
dimZ();
268 int dimT = data.
dimT() ;
276 for( t = 0 ; t < dimT ; ++t ){
280 if ( data( x, y, z, t ) == backgrnd )
281 flag( x, y, z ) =
true;
287 std::queue< AimsBucketItem< Void > > que;
295 for ( z = 0; z < dimZ; ++z )
298 std::cout <<
"\rz: " << z << std::flush;
299 for ( y = 0; y < dimY; ++y )
300 for ( x = 0; x < dimX; ++x )
302 if( !flag( x, y, z ) )
305 val = data( x, y, z );
308 flag( x, y, z ) =
true;
309 std::list<AimsBucketItem<Void> > & bk = component[ label ];
310 while ( !que.empty() )
312 item.
location() = que.front().location();
314 bk.push_back( item );
315 for ( n = 0; n < cd.nbNeighbors(); n++ )
326 if ( flag( newItem.
location() ) ==
false 327 && ( bin || data( newItem.
location() )
340 std::cout << std::endl;
343 if( minsize == 0 && maxsize == 0 && maxcomp == 0 )
347 std::multimap<unsigned, std::list<AimsBucketItem<Void> > *> comps;
348 for( i=component.begin(); i!=e; ++i )
349 if(( minsize == 0 || i->second.size() >= minsize ) && ( maxsize == 0 || i->second.size() <= maxsize ))
351 ( i->second.size(),&i->second ) );
352 std::multimap<unsigned,
353 std::list<AimsBucketItem<Void> > *>::reverse_iterator
354 im, em = comps.rend();
356 for( im=comps.rbegin(); im!=em && label < maxcomp; ++im )
357 components[ label++ ] = *im->second;
364 template <
typename T>
inline 379 template <
typename T>
383 const T & backg,
bool bin,
384 size_t minsize,
size_t maxsize,
385 size_t maxcomp,
bool )
388 std::unique_ptr<AimsBucket<Void> > abk;
389 if( minsize == 0 && maxsize == 0 && maxcomp == 0 )
409 for( ib=b.begin(); ib!=eb; ++ib )
417 std::queue< AimsBucketItem< Void > > que;
423 for( ib=b.begin(); ib!=eb; ++ib )
425 ifl = flag.find( ib->first );
433 std::list<AimsBucketItem<Void> > & bk = component[ label ];
434 while ( !que.empty() )
436 item.
location() = que.front().location();
438 bk.push_back( item );
442 ifl = flag.find( newItem.
location() );
443 if( ifl != efl && ifl->second ==
false 445 || b.find( newItem.
location() )->second == val ) )
458 if( minsize == 0 && maxcomp == 0 )
462 std::multimap<unsigned, std::list<AimsBucketItem<Void> > *> comps;
463 for( i=component.begin(); i!=e; ++i )
464 if(( minsize == 0 || i->second.size() >= minsize ) && ( maxsize == 0 || i->second.size() <= maxsize ))
466 ( i->second.size(),&i->second ) );
467 std::multimap<unsigned,
468 std::list<AimsBucketItem<Void> > *>::reverse_iterator
469 im, em = comps.rend();
471 for( im=comps.rbegin(); im!=em && label<maxcomp; ++im )
472 components[ label++ ] = *im->second;
476 template <
typename T>
479 const T & backgrnd,
bool bin,
480 size_t minsize,
size_t maxsize,
488 std::list<AimsBucketItem<Void> >::iterator ic, ec;
493 for( ib=data.begin(); ib!=eb; ++ib )
494 for( ibb=ib->second.begin(), ebb=ib->second.end(); ibb!=ebb; ++ibb )
498 for( i=comps.begin(); i!=e; ++i )
499 for( ic=i->second.begin(), ec=i->second.end(); ic!=ec; ++ic )
500 bk[ ic->location() ] = i->first + 1;
504 template <
typename T>
508 const T & backgrnd,
bool bin,
509 size_t minsize,
size_t maxsize,
510 size_t maxcomp,
bool verbose )
516 std::unique_ptr<AimsBucket<Void> > abk;
517 if( minsize == 0 && maxsize == 0 && maxcomp == 0 )
528 int x=0, y=0, z=0, t=0, n=0;
530 int dimX = data.
dimX();
531 int dimY = data.
dimY();
532 int dimZ = data.
dimZ();
533 int dimT = data.
dimT() ;
541 for( t = 0 ; t < dimT ; ++t ){
545 if ( data( x, y, z, t ) == backgrnd )
546 flag( x, y, z ) =
true;
552 std::queue< AimsBucketItem< Void > > que;
558 for ( z = 0; z < dimZ; ++z )
561 std::cout <<
"\rz: " << z << std::flush;
562 for ( y = 0; y < dimY; ++y )
563 for ( x = 0; x < dimX; ++x )
566 if( !flag( x, y, z ) )
569 val = data( x, y, z );
572 labelImage (x, y, z) = label;
574 flag( x, y, z ) =
true;
577 std::list<AimsBucketItem<Void> > & bk = component[ label ];
578 while ( !que.empty() )
580 item.
location() = que.front().location();
582 bk.push_back( item );
583 labelImage (item.
location()) =label;
584 for ( n = 0; n < cd.nbNeighbors(); n++ )
595 if ( flag( newItem.
location() ) ==
false 596 && ( bin || data( newItem.
location() )
601 labelImage (newItem.
location()) = label;
611 std::cout << std::endl;
614 if( minsize == 0 && maxsize == 0 && maxcomp == 0 )
618 std::multimap<unsigned, std::list<AimsBucketItem<Void> > *> comps;
619 for( i=component.begin(); i!=e; ++i )
620 if(( minsize == 0 || i->second.size() >= minsize ) && (maxsize == 0 || i->second.size() <= maxsize ))
622 ( i->second.size(),&i->second ) );
624 std::multimap<unsigned,
625 std::list<AimsBucketItem<Void> > *>::reverse_iterator
626 im, em = comps.rend();
629 for( im=comps.rbegin(); im!=em && (label < maxcomp || maxcomp == 0); ++im ){
630 std::list<AimsBucketItem<Void> > bucket = *im->second;
631 std::list<AimsBucketItem<Void> >::iterator ite, iteend = bucket.end();
632 for (ite = bucket.begin(); ite != iteend ; ite ++ ) {
633 labelImage ((*ite).location()) = label;
635 components[ label++ ] = *im->second;
const Point3d & xyzOffset(int n) const
Get the X/Y/Z offsets of the nth element.
int oLine() const
Offset between 2 consecutive lines.
#define ForEach3d(thing, x, y, z)
Type
The different kinds of connectivity.
bool _nulltesttemplate_iseq(const T &x, const T &val)
The class for EcatSino data write operation.
int nbNeighbors() const
Get the number of neighbors for that connectivity.
int oSlice() const
Offset between 2 consecutive slices.
const AimsVector< short, 3 > & location() const
Get a const reference to the location of the bucket item.
An alternate, ordered, representation for buckets (voxels lists).
std::map< Point3d, T, BucketMapLess > Bucket
Topology of a data container.
std::map< int, std::list< AimsBucketItem< T > > >::iterator iterator
The bucket base class to manage packages of points associated to their value during time...
void AimsConnectedComponent(AimsData< T > &data, aims::Connectivity::Type connectivity, std::map< T, size_t > &valids, const T &backgrnd=0, bool bin=true, size_t minSize=0, size_t maxSize=0, size_t numMax=0, bool verbose=true)
The template base class for all types of bucket items.
std::map< int, Bucket >::iterator iterator
AimsData< int16_t > AimsLabeledConnectedComponent(AimsBucket< Void > &component, const AimsData< T > &data, aims::Connectivity::Type connectivity, const T &backgrnd=0, bool bin=true, size_t minsize=0, size_t maxSize=0, size_t maxcomp=0, bool verbose=true)
const T & item(int d) const