34 #ifndef AIMS_PRIMALSKETCH_GREYLEVELBLOB_H
35 #define AIMS_PRIMALSKETCH_GREYLEVELBLOB_H
50 bool operator()(
const T p1,
const T p2)
const {
return false;}
59 else if ( p1[2] > p2[2] )
64 else if ( p1[1] > p2[1] )
76 template <>
struct ltstr_p3d<std::pair<Point3df, uint> >
79 const std::pair<Point3df, uint> p2 )
const
81 if ( p1.second < p2.second )
88 template<
class T>
class MaximumPoint;
89 template<
class T>
class SaddlePoint;
90 template<
class T>
class GreyLevelBlob;
98 BlobMeasurements(
float maxInt,
float meanInt,
float maxCont,
float meanCont,
float a,
float tv=0.0,
float tvalue=0.0):
224 std::map<int, GreyLevelBlob<Site>* > blobMap;
225 std::list<SaddlePoint<Site> *> saddleList;
226 std::list<MaximumPoint<Site> *> maximumList;
239 : _texdata(texdata), _rawtexdata(rawtexdata), _mask(
mask), _stats(stats) { labelsImage=
TexturedData<Geom, Text>(*_texdata); CheckMask();}
255 std::list<MaximumPoint<Site> *>
GetMaxList() {
return maximumList; }
256 std::map<int, GreyLevelBlob<Site> *>
GetBlobs() {
return blobMap; }
339 int currentLabel=0, labelBlob;
345 std::multimap<const Val, Site> sortedSites;
348 for ( ; ptSite != (*_texdata).siteEnd(); ++ptSite)
349 sortedSites.insert(std::pair<const Val, Site>((*_texdata).intensity(*ptSite), (*ptSite)));
360 for (ptSite=labelsImage.siteBegin(); ptSite != labelsImage.siteEnd(); ++ptSite)
364 typename std::multimap<const Val, Site>::reverse_iterator ptSortedSites;
367 for ( ptSortedSites=sortedSites.rbegin(); ptSortedSites != sortedSites.rend(); ++ptSortedSites) {
368 Val intensity=(*_texdata).intensity((*ptSortedSites).second);
375 std::vector<Site> neighb=(*_texdata).neighbours((*ptSortedSites).second);
377 std::vector<Site> above;
378 std::set<int> aboveLabels;
379 typename std::vector<Site>::iterator ptNeigh=neighb.begin();
381 for ( ; ptNeigh != neighb.end(); ++ptNeigh){
383 if ((*_texdata).intensity(*ptNeigh) > intensity){
385 above.push_back(*ptNeigh);
386 aboveLabels.insert(
int(labelsImage.intensity(*ptNeigh)));
390 nbAbove=above.size();
391 nbAboveLabels=aboveLabels.size();
397 labelsImage.intensity((*ptSortedSites).second)=(Val) currentLabel;
398 maximumList.push_back(maximum);
399 blobMap[currentLabel]=(greyLevelBlob);
402 else if ( (nbAbove==1) && ((labelsImage.intensity(*(above.begin())))==
BACKGROUND) ){
404 labelsImage.intensity((*ptSortedSites).second)=
BACKGROUND;
408 else if ((nbAbove>1) && (nbAboveLabels>1)){
412 labelsImage.intensity((*ptSortedSites).second)=
BACKGROUND;
413 std::set<int>::iterator ptLabels=aboveLabels.begin();
414 for (; ptLabels != aboveLabels.end(); ++ptLabels)
416 if (blobMap[*ptLabels]->CanGrow())
421 saddleList.push_back(saddle);
422 blobMap[*ptLabels]->SetSaddle(saddle);
426 blobMap[*ptLabels]->SetSaddle(saddle);
431 labelBlob=int(labelsImage.intensity(*(above.begin())));
432 if ((labelBlob !=
BACKGROUND) && (blobMap[labelBlob]->CanGrow() ))
434 labelsImage.intensity((*ptSortedSites).second)=(Val) labelBlob;
435 blobMap[labelBlob]->AddPoint((*ptSortedSites).second);
439 labelsImage.intensity((*ptSortedSites).second)=
BACKGROUND;
445 if (_mask!=0) { DoMasking();
446 std::cout<<
"MASKING" << std::endl;
449 ComputeBlobMeasurements();
456 typename std::list<MaximumPoint<Site> *>
::iterator itMax=maximumList.begin(), itPrevious=itMax;
461 std::cout <<
"DEBUG: found " << blobMap.size() <<
" blobs" << std::endl;
462 std::cout <<
"DEBUG: saddle list size : " << saddleList.size() << std::endl;
464 for ( ; itMax != maximumList.end() ; ++itMax ) {
466 maximumList.erase(itPrevious);
469 if ( fabs ( _mask->intensity((*itMax)->_node)) <
EPSILON ) {
470 blobMap.erase ( (*itMax)->blob->Label() );
472 saddle = (*itMax)->blob->GetSaddle();
474 if ( saddle->
blobList.size() > 1 ) {
475 saddle->
blobList.remove( (*itMax)->blob );
478 saddle->
blobList.remove((*itMax)->blob);
479 saddleList.remove(saddle);
483 delete (*itMax)->blob;
489 maximumList.erase(itPrevious);
490 std::cout <<
"DEBUG: found " << blobMap.size() <<
" blobs" << std::endl;
495 template<
typename Geom,
typename Text>
void ExtractGreyLevelBlobs<Geom, Text>::CheckMask()
498 if (_mask->NbSites() != _texdata->NbSites())
500 std::cerr <<
"ExtractGreyLevelBlobs : mask and data do not have the same number of sites !!!" << std::endl;
507 template<
typename Geom,
typename Text>
510 typename std::map<int, GreyLevelBlob<Site>* >
::iterator blobIt;
514 Val saddleInt, maxInt, intensity;
515 float maxIntensity, meanIntensity, maxContrast, meanContrast, area;
520 fileStat = fopen ( _stats,
"w" );
521 fprintf ( fileStat,
"Blob_label max_int mean_int max_cont mean_cont area\n" );
527 for ( blobIt = blobMap.begin() ; blobIt != blobMap.end() ; ++blobIt ) {
537 blob = (*blobIt).second;
544 maxInt=(*_texdata).intensity(maxi->
_node);
548 saddleInt=(*_texdata).intensity(saddle->
_node);
555 maxContrast=float(maxInt-saddleInt);
556 maxIntensity=float(maxInt);
558 std::set<Site,ltstr_p3d<Site> > listePoints=blob->
GetListePoints();
559 typename std::set<Site,ltstr_p3d<Site> >
::iterator
560 itPoints=listePoints.begin();
564 for (; itPoints!=listePoints.end(); ++itPoints) {
566 intensity=(*_texdata).intensity(point);
569 meanContrast+=float(intensity - saddleInt);
570 meanIntensity+=float(intensity);
572 meanContrast/=float(nbPoint);
573 meanIntensity/=float(nbPoint);
583 if ( GetOriginalTexture() != NULL ) {
584 std::set<Site,ltstr_p3d<Site> > pixels;
587 typename std::set<Site, ltstr_p3d<Site> >
::iterator itPix;
588 float tvmax = -100.0;
589 for ( itPix = pixels.begin() ; itPix != pixels.end() ; itPix++ ) {
590 if (
float ( GetOriginalTexture()->intensity(*itPix) ) > tvmax )
591 tvmax = float ( GetOriginalTexture()->intensity(*itPix) );
596 std::cout <<
"BLOBMEASUREMENT = 0.0" << std::endl;
603 fprintf ( fileStat,
"%i %.4f %.4f %.4f %.4f %.4f\n", blob->
Label(),
604 maxIntensity, meanIntensity, maxContrast, meanContrast, area);
620 std::set<Point3d,ltstr_p3d<Point3d> > listeP=_blob->GetListePoints();
621 std::set<Point3d,ltstr_p3d<Point3d> >
::iterator pointIt=listeP.begin();
623 float x1,x2,y1,y2,z1,z2;
625 x1=10000.0; y1=10000.0; z1=10000.0;
626 x2=-10000.0; y2=-10000.0; z2=-10000.0;
627 std::vector<float> vectF(6);
629 for (; pointIt != listeP.end(); ++pointIt)
631 float x=(float) (*pointIt)[0];
632 float y=(float) (*pointIt)[1];
633 float z=(float) (*pointIt)[2];
642 vectF[0]=x1; vectF[1]=y1; vectF[2]=z1;
643 vectF[3]=x2; vectF[4]=y2; vectF[5]=z2;
653 std::vector<float> triplet;
654 triplet.push_back(
max[0]);
655 triplet.push_back(
max[1]);
656 triplet.push_back(
max[2]);
670 float x1,x2,y1,y2,z1,z2;
672 x1=10000.0; y1=10000.0; z1=10000.0;
673 x2=-10000.0; y2=-10000.0; z2=-10000.0;
675 std::vector<float> vectF(6);
677 for (; pointIt != listeP.end(); ++pointIt)
679 float x=(float) (*pointIt).first[0];
680 float y=(
float) (*pointIt).first[1];
681 float z=(float) (*pointIt).first[2];
690 vectF[0]=x1; vectF[1]=y1; vectF[2]=z1;
691 vectF[3]=x2; vectF[4]=y2; vectF[5]=z2;
703 std::vector<float> triplet;
704 triplet.push_back(
max[0]);
705 triplet.push_back(
max[1]);
706 triplet.push_back(
max[2]);
BlobMeasurements(float maxInt, float meanInt, float maxCont, float meanCont, float a, float tv=0.0, float tvalue=0.0)
BlobMeasurements & operator=(const BlobMeasurements &other)
BlobMeasurements(const BlobMeasurements &other)
Class for grey-level blobs Templated with respect to the type of points: TypeSite<carto::VolumeRef<T>...
void SetSaddle(SaddlePoint< T > *node)
MaximumPoint< T > * maximum
std::set< T, ltstr_p3d< T > > listePoints
std::set< T, ltstr_p3d< T > > & GetListePoints()
GreyLevelBlob< T > & operator=(const GreyLevelBlob< T > &other)
SaddlePoint< T > * GetSaddle()
MaximumPoint< T > * GetMaximum()
SaddlePoint< T > * saddle
GreyLevelBlob(MaximumPoint< T > *node, int label)
BlobMeasurements measurements
GreyLevelBlob< T > * blob
MaximumPoint< T > & operator=(const MaximumPoint< T > &other)
std::list< GreyLevelBlob< T > * > blobList
std::list< GreyLevelBlob< T > * > & GetBlobList()
void AddBlob(GreyLevelBlob< T > *blob)
SaddlePoint< T > & operator=(const SaddlePoint< T > &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) const