34 #ifndef AIMS_PRIMALSKETCH_GREYLEVELBLOB_H 35 #define AIMS_PRIMALSKETCH_GREYLEVELBLOB_H 56 else if ( p1[2] > p2[2] )
61 else if ( p1[1] > p2[1] )
75 const std::pair<Point3df, uint> p2 ) {
76 if ( p1.second < p2.second )
92 BlobMeasurements(
float maxInt,
float meanInt,
float maxCont,
float meanCont,
float a,
float tv=0.0,
float tvalue=0.0):
93 maxIntensity(maxInt), meanIntensity(meanInt), maxContrast(maxCont), meanContrast(meanCont), area(a), t(tv), tValue(tvalue) {}
130 AddPoint (maximum->
_node);
141 void AddPoint( T node ) { listePoints.insert(node); }
211 std::map<int, GreyLevelBlob<Site>* > blobMap;
212 std::list<SaddlePoint<Site> *> saddleList;
213 std::list<MaximumPoint<Site> *> maximumList;
224 : _texdata(texdata), _rawtexdata(rawtexdata), _mask(mask), _stats(0){ labelsImage=
TexturedData<Geom, Text>(*_texdata); CheckMask();}
226 : _texdata(texdata), _rawtexdata(rawtexdata), _mask(mask), _stats(stats) { labelsImage=
TexturedData<Geom, Text>(*_texdata); CheckMask();}
232 : _texdata(texdata), _rawtexdata(NULL), _mask(mask), _stats(0) { labelsImage=
TexturedData<Geom, Text>(*_texdata); CheckMask();}
234 : _texdata(texdata), _rawtexdata(NULL), _mask(mask), _stats(stats) { labelsImage=
TexturedData<Geom, Text>(*_texdata); CheckMask();}
237 void ComputeBlobMeasurements();
242 std::list<MaximumPoint<Site> *>
GetMaxList() {
return maximumList; }
243 std::map<int, GreyLevelBlob<Site> *>
GetBlobs() {
return blobMap; }
260 std::vector<float> Boundingbox();
261 std::vector<float> Barycenter();
325 int currentLabel=0, labelBlob;
331 std::multimap<const Val, Site> sortedSites;
334 for ( ; ptSite != (*_texdata).siteEnd(); ++ptSite)
335 sortedSites.insert(std::pair<const Val, Site>((*_texdata).intensity(*ptSite), (*ptSite)));
346 for (ptSite=labelsImage.siteBegin(); ptSite != labelsImage.siteEnd(); ++ptSite)
350 typename std::multimap<const Val, Site>::reverse_iterator ptSortedSites;
353 for ( ptSortedSites=sortedSites.rbegin(); ptSortedSites != sortedSites.rend(); ++ptSortedSites) {
354 Val intensity=(*_texdata).intensity((*ptSortedSites).second);
361 std::vector<Site> neighb=(*_texdata).neighbours((*ptSortedSites).second);
363 std::vector<Site> above;
364 std::set<int> aboveLabels;
365 typename std::vector<Site>::iterator ptNeigh=neighb.begin();
367 for ( ; ptNeigh != neighb.end(); ++ptNeigh){
369 if ((*_texdata).intensity(*ptNeigh) > intensity){
371 above.push_back(*ptNeigh);
372 aboveLabels.insert(
int(labelsImage.intensity(*ptNeigh)));
376 nbAbove=above.size();
377 nbAboveLabels=aboveLabels.size();
383 labelsImage.intensity((*ptSortedSites).second)=(Val) currentLabel;
384 maximumList.push_back(maximum);
385 blobMap[currentLabel]=(greyLevelBlob);
388 else if ( (nbAbove==1) && ((labelsImage.intensity(*(above.begin())))==BACKGROUND) ){
390 labelsImage.intensity((*ptSortedSites).second)=
BACKGROUND;
394 else if ((nbAbove>1) && (nbAboveLabels>1)){
398 labelsImage.intensity((*ptSortedSites).second)=
BACKGROUND;
399 std::set<int>::iterator ptLabels=aboveLabels.begin();
400 for (; ptLabels != aboveLabels.end(); ++ptLabels)
401 if (*ptLabels!=BACKGROUND)
402 if (blobMap[*ptLabels]->CanGrow())
407 saddleList.push_back(saddle);
408 blobMap[*ptLabels]->SetSaddle(saddle);
412 blobMap[*ptLabels]->SetSaddle(saddle);
417 labelBlob=int(labelsImage.intensity(*(above.begin())));
418 if ((labelBlob != BACKGROUND) && (blobMap[labelBlob]->CanGrow() ))
420 labelsImage.intensity((*ptSortedSites).second)=(Val) labelBlob;
421 blobMap[labelBlob]->AddPoint((*ptSortedSites).second);
425 labelsImage.intensity((*ptSortedSites).second)=
BACKGROUND;
431 if (_mask!=0) { DoMasking();
432 std::cout<<
"MASKING" << std::endl;
435 ComputeBlobMeasurements();
442 typename std::list<MaximumPoint<Site> *>
::iterator itMax=maximumList.begin(), itPrevious=itMax;
447 std::cout <<
"DEBUG: found " << blobMap.size() <<
" blobs" << std::endl;
448 std::cout <<
"DEBUG: saddle list size : " << saddleList.size() << std::endl;
450 for ( ; itMax != maximumList.end() ; ++itMax ) {
452 maximumList.erase(itPrevious);
455 if ( fabs ( _mask->intensity((*itMax)->_node)) < EPSILON ) {
456 blobMap.erase ( (*itMax)->blob->Label() );
458 saddle = (*itMax)->blob->GetSaddle();
460 if ( saddle->
blobList.size() > 1 ) {
461 saddle->
blobList.remove( (*itMax)->blob );
464 saddle->
blobList.remove((*itMax)->blob);
465 saddleList.remove(saddle);
469 delete (*itMax)->blob;
475 maximumList.erase(itPrevious);
476 std::cout <<
"DEBUG: found " << blobMap.size() <<
" blobs" << std::endl;
484 if (_mask->NbSites() != _texdata->NbSites())
486 std::cerr <<
"ExtractGreyLevelBlobs : mask and data do not have the same number of sites !!!" << std::endl;
493 template<
typename Geom,
typename Text>
496 typename std::map<int, GreyLevelBlob<Site>* >
::iterator blobIt;
500 Val saddleInt, maxInt, intensity;
501 float maxIntensity, meanIntensity, maxContrast, meanContrast, area;
506 fileStat = fopen ( _stats,
"w" );
507 fprintf ( fileStat,
"Blob_label max_int mean_int max_cont mean_cont area\n" );
513 for ( blobIt = blobMap.begin() ; blobIt != blobMap.end() ; ++blobIt ) {
523 blob = (*blobIt).second;
530 maxInt=(*_texdata).intensity(maxi->
_node);
534 saddleInt=(*_texdata).intensity(saddle->
_node);
541 maxContrast=float(maxInt-saddleInt);
542 maxIntensity=float(maxInt);
544 std::set<Site,ltstr_p3d<Site> > listePoints=blob->
GetListePoints();
545 typename std::set<Site,ltstr_p3d<Site> >
::iterator 546 itPoints=listePoints.begin();
550 for (; itPoints!=listePoints.end(); ++itPoints) {
552 intensity=(*_texdata).intensity(point);
555 meanContrast+=float(intensity - saddleInt);
556 meanIntensity+=float(intensity);
558 meanContrast/=float(nbPoint);
559 meanIntensity/=float(nbPoint);
569 if ( GetOriginalTexture() != NULL ) {
570 std::set<Site,ltstr_p3d<Site> > pixels;
573 typename std::set<Site, ltstr_p3d<Site> >
::iterator itPix;
574 float tvmax = -100.0;
575 for ( itPix = pixels.begin() ; itPix != pixels.end() ; itPix++ ) {
576 if (
float ( GetOriginalTexture()->intensity(*itPix) ) > tvmax )
577 tvmax =
float ( GetOriginalTexture()->intensity(*itPix) );
582 std::cout <<
"BLOBMEASUREMENT = 0.0" << std::endl;
589 fprintf ( fileStat,
"%i %.4f %.4f %.4f %.4f %.4f\n", blob->
Label(),
590 maxIntensity, meanIntensity, maxContrast, meanContrast, area);
606 std::set<Point3d,ltstr_p3d<Point3d> > listeP=_blob->GetListePoints();
607 std::set<Point3d,ltstr_p3d<Point3d> >
::iterator pointIt=listeP.begin();
609 float x1,x2,y1,y2,z1,z2;
611 x1=10000.0; y1=10000.0; z1=10000.0;
612 x2=-10000.0; y2=-10000.0; z2=-10000.0;
613 std::vector<float> vectF(6);
615 for (; pointIt != listeP.end(); ++pointIt)
617 float x=(float) (*pointIt)[0];
618 float y=(float) (*pointIt)[1];
619 float z=(float) (*pointIt)[2];
628 vectF[0]=x1; vectF[1]=y1; vectF[2]=z1;
629 vectF[3]=x2; vectF[4]=y2; vectF[5]=z2;
639 std::vector<float> triplet;
640 triplet.push_back(max[0]);
641 triplet.push_back(max[1]);
642 triplet.push_back(max[2]);
656 float x1,x2,y1,y2,z1,z2;
658 x1=10000.0; y1=10000.0; z1=10000.0;
659 x2=-10000.0; y2=-10000.0; z2=-10000.0;
661 std::vector<float> vectF(6);
663 for (; pointIt != listeP.end(); ++pointIt)
665 float x=(float) (*pointIt).first[0];
666 float y=(
float) (*pointIt).first[1];
667 float z=(float) (*pointIt).first[2];
676 vectF[0]=x1; vectF[1]=y1; vectF[2]=z1;
677 vectF[3]=x2; vectF[4]=y2; vectF[5]=z2;
689 std::vector<float> triplet;
690 triplet.push_back(max[0]);
691 triplet.push_back(max[1]);
692 triplet.push_back(max[2]);
BlobMeasurements & operator=(const BlobMeasurements &other)
float max(float x, float y)
BucketMap< Void > * mask(const BucketMap< Void > &src, const BucketMap< Void > &m, bool intersect=true)
bool operator()(const T p1, const T p2)
std::set< T, ltstr_p3d< T > > & GetListePoints()
BlobMeasurements(const BlobMeasurements &other)
GreyLevelBlob< T > * blob
BlobMeasurements measurements
void AddBlob(GreyLevelBlob< T > *blob)
MaximumPoint< T > * GetMaximum()
std::set< T, ltstr_p3d< T > > listePoints
SaddlePoint< T > & operator=(const SaddlePoint< T > &other)
GreyLevelBlob< T > & operator=(const GreyLevelBlob< T > &other)
MaximumPoint< T > & operator=(const MaximumPoint< T > &other)
std::list< GreyLevelBlob< T > * > & GetBlobList()
MaximumPoint< T > * maximum
SaddlePoint< T > * GetSaddle()
BlobMeasurements(float maxInt, float meanInt, float maxCont, float meanCont, float a, float tv=0.0, float tvalue=0.0)
GreyLevelBlob(MaximumPoint< T > *node, int label)
std::list< GreyLevelBlob< T > *> blobList
void SetSaddle(SaddlePoint< T > *node)
SaddlePoint< T > * saddle