Пример #1
0
void MultiChannel<tData>::set( size_t i_iChannel, const Im2D<tData,tBase> &i_im2d )
{
	__elise_debug_error( i_iChannel>=mChannels.size(), "MultiChannel::set(Im2D): i_iChannel>=mChannels.size()" );
	__elise_debug_error( i_im2d.tx()!=mWidth, "MultiChannel::set(Im2D): i_im2d.tx()!=mWidth" );
	__elise_debug_error( i_im2d.ty()!=mHeight, "MultiChannel::set(Im2D): i_im2d.ty()!=mHeight" );

	memcpy( mChannels[i_iChannel]->data_lin(), i_im2d.data_lin(), (size_t)mWidth*(size_t)mHeight*sizeof(tData) );
}
Пример #2
0
void  CalcMaxLoc<Type,TypeBase,Compare>::FiltrMaxLoc_BCVS
      (
          ElSTDNS vector<Pt2di> & Pts,
          Im2D<Type,TypeBase> Im,
          REAL  FactInf,
          REAL  TolGeom,
          Pt2di SzVois,
          Im2D_U_INT1 Marq
      )
{
    Pt2di SzIm = Inf(Im.sz(),Marq.sz());
    Box2di BoxIm(Pt2di(0,0),SzIm);

    Marq.raz();
    mBufFiltr.clear();


    INT4 ** dIm = Im.data();

    for (INT kp1=0; kp1<(INT)Pts.size() ; kp1++)
    {
        ELISE_ASSERT
        (
           BoxIm.contains(Pts[kp1]),
           "GenMaxLoc::FiltrMaxLoc_BCVS"
        );
    }
    
	{
    for (INT kp1=0; kp1<(INT)Pts.size() ; kp1++)
    {
        Pt2di p1 = Pts[kp1];
        Box2di BoxP1(p1-SzVois,p1+SzVois);
        INT v1 = dIm[p1.y][p1.x];
        INT Vinf = round_up(v1*FactInf);
        bool Refut = false;
   

        for (INT kp2=0 ; (kp2<(INT)Pts.size())&&(!Refut)  ; kp2++)
        {
            Pt2di p2 = Pts[kp2];
            if (    (kp1!= kp2)
                 && CmpTot(v1,dIm[p2.y][p2.x],p1,p2)
                 && BoxP1.contains(p2)
                 && BandeConnectedVsup(p1,p2,Im,Vinf,TolGeom,Marq)
               )
               Refut = true;
        }
        if (! Refut)
           mBufFiltr.push_back(p1);
    }
	}
    Pts = mBufFiltr;
}
Пример #3
0
         Im2_Pts_in_Comp<Type>::Im2_Pts_in_Comp 
         (
               Im2D<Type,Type>           im,
               const Arg_Flux_Pts_Comp & arg
         ) :
             Std_Flux_Of_Points<Type>(im.ty(),arg.sz_buf()),
            _im (im),
            _data (im.data()),
            _ind  (0),
            _nb_pts (im.tx())
{
}
template <class Type,class TBase>  void  cElNuage3DMaille_FromImProf<Type,TBase>::ProfBouchePPV()
{
   Im2D<Type,TBase> aIPPV = BouchePPV(mIm,ImDef().in());


   int aNbTest = 7;
   for (int aK=0 ; aK< (aNbTest+2) ; aK++)
   {
       Symb_FNum aFMasq = ImDef().in();
       int aSzV = ElMax(1,ElSquare(aNbTest-aK));

       Fonc_Num aFLisse = rect_som(aIPPV.in_proj(),aSzV) /  ElSquare(1+2*aSzV);
       aFLisse  = aFLisse*(! aFMasq) + mIm.in() * aFMasq;
       ELISE_COPY(aIPPV.all_pts(),aFLisse,aIPPV.out());


   }
   ELISE_COPY(aIPPV.all_pts(),aIPPV.in(),mIm.out());
   ELISE_COPY(ImDef().all_pts(),1,ImDef().out());
}
Пример #5
0
void MultiChannel<tData>::link( Im2D<tData,tBase> &i_im2d )
{
	resize( i_im2d.tx(), i_im2d.ty(), 1 );
	*mChannels[0] = i_im2d;
}
Пример #6
0
bool CalcMaxLoc<Type,TypeBase,Compare>::BandeConnectedVsup 
     (
            Pt2di p1,
            Pt2di p2,
            Im2D<Type,TypeBase> Im,
            Type  VInf,
            REAL Tol,
            Im2D_U_INT1 Marq   
     )
{
    if (p1==p2)
       return true;

    Pt2di Sz = Inf(Im.sz(),Marq.sz());

    Box2di Box(Pt2di(0,0), Sz);

    if (!(Box.contains(p1) && Box.contains(p2)))
       return false;

    U_INT1 ** dMarq = Marq.data();
    Type **     dIm = Im.data();

    mBufCC.clear();
    mBufCC.push_back(p1);
    dMarq[p1.y][p1.x] = 1;
  
    Pt2dr aPR1(p1.x,p1.y);
    Pt2dr aPR2(p2.x,p2.y);
    SegComp seg12(aPR1,aPR2);

    bool got = false;
    for (INT kBuf=0 ; (kBuf!=(INT)mBufCC.size()) && (! got) ; kBuf++)
    {
         Pt2di pBuf = mBufCC[ kBuf];
         for (INT kV=0 ; kV< 8; kV++)
         {
             Pt2di pVois = pBuf + TAB_8_NEIGH[kV];
             if (
                        Box.contains(pVois)
                   &&  (dMarq[pVois.y][pVois.x] == 0)
                   &&  (! mCmp(dIm[pVois.y][pVois.x],VInf))
                   &&  (seg12.BoxContains(Pt2dr(pVois),1.0,Tol))
                )
             {
                 if (pVois==p2) 
                    got = true;
                 dMarq[pVois.y][pVois.x] = 1;
                 mBufCC.push_back(pVois);
             }
         }
    }

	{
    for (INT kBuf=0 ; kBuf<(INT)mBufCC.size() ; kBuf++)
    {
        Pt2di pBuf = mBufCC[ kBuf];
        dMarq[pBuf.y][pBuf.x] = 0;
    }
	}

    return got;
}
Пример #7
0
        void CalcMaxLoc<Type,TypeBase,Compare>::AllMaxLoc 
             (
                  ElSTDNS vector<Pt2di> &res,
                  Im2D<Type,TypeBase> Im,
                  Pt2di    Vois,
                  Pt2di    p0, Pt2di    p1,
                  TypeBase vMin
             )
{
   Pt2di Sz(Im.tx(),Im.ty());
   Vois.x = ElAbs(Vois.x);
   Vois.y = ElAbs(Vois.y);
   pt_set_min_max(p0,p1);

   p0 = Sup(p0,Vois);
   p1 = Inf(p1,Sz-Vois);

   if ((p1.x<=p0.x) || (p1.y <= p0.y))
      return;

   INT dlx = Vois.x;
   INT dly = Vois.y;
   Type ** data = Im.data();
 

   res.clear();
   ElSTDNS vector<Pt3di> & OVois = OrdVois(Vois);

   for (INT Y0=p0.y ; Y0<p1.y ; Y0+=dly)
   {
       INT Y1 = ElMin(p1.y,Y0+dly);
       for (INT X0=p0.x ; X0<p1.x ; X0+=dlx)
       {
           INT X1 = ElMin(p1.x,X0+dlx);
           Type vMax = vMin;
           INT xMax = DefXY;
           INT yMax = DefXY;

           for (INT y=Y0; y<Y1 ; y++)
           {
               for (INT x=X0; x<X1 ; x++)
               {
                   if (mCmp((TypeBase)vMax,(TypeBase)data[y][x]))
                   {
                       xMax = x;
                       yMax = y;
                       vMax = data[y][x];
                   }
               }
           }
           if (xMax != DefXY)
           {
              bool IsMax = true;
              for 
              ( 
                  std::vector<Pt3di> ::iterator itOV = OVois.begin();
                  IsMax &&(itOV != OVois.end());
                  itOV++
              )
              {
                   Type aVal = data[yMax+itOV->y][xMax+itOV->x];
                   if (itOV->z)
                   {
                      if (!mCmp((TypeBase)aVal,(TypeBase)vMax))
                          IsMax = false;
                   }
                   else
                   {
                      if (mCmp((TypeBase)vMax,(TypeBase)aVal))
                          IsMax = false;
                   }
              }
              if (IsMax)
              {
                 res.push_back(Pt2di(xMax,yMax));

              }
           }
       }
   }
}
Пример #8
0
void dist_chamfer_cabl(Im2D<U_INT1,INT> I,INT v_max)
{
     Im2D<U_INT1,INT> I0(I.tx(),I.ty(),0);

     ELISE_COPY(I0.all_pts(),I.in(),I0.out());
     Chamfer::d32.im_dist(I);

     INT nb_dif;
     ELISE_COPY
     (
          I.all_pts(),
          I0.in()!=(I.in()!=0),
          sigma(nb_dif)
     );
     BENCH_ASSERT(nb_dif == 0);

     INT tx = I.tx();
     INT ty = I.ty();
     U_INT1 ** d = I.data();
     INT     vmax = I.vmax()-1;
     
     for (int x=1; x<tx-1 ; x++)
         for (int y=1; y<ty-1 ; y++)
         {
              
              INT v;
              if (d[y][x])
                 v  = std::min3 
                      (
                          std::min3(d[y+1][x-1]+3,d[y+1][x]+2,d[y+1][x+1]+3),
                          std::min3(d[y][x-1]+2,vmax,d[y][x+1]+2),
                          std::min3(d[y-1][x-1]+3,d[y-1][x]+2,d[y-1][x+1]+3)
                      );
              else
                 v = 0;

              BENCH_ASSERT(v == d[y][x]);
         }

      INT dif;
      ELISE_COPY 
      (
           I.all_pts(),
           Abs
           (
               Min(I.in(),v_max)
             - extinc_32(I0.in(0),v_max)
           ),
           VMax(dif)
      );

      BENCH_ASSERT(dif == 0);
}
Пример #9
0
         FoncATrou_OPB_Comp<Type>::FoncATrou_OPB_Comp
         (
                 Liste_Pts<Type,INT>  l,
                 INT                       X0,
                 INT                       X1,
                 INT                       Y0,
                 INT                       Y1
         )   :
         _values      (1,1),
         _l            (1),
         _cpt         (NEW_VECTEUR(Y0,Y1+1,INT)),
         _dim_vals    (l.dim()-2)
{
	INT k;

     set_cste(_cpt+Y0,0,Y1-Y0+1);

     Im2D<Type,INT> XYV = l.image();

     INT nb_pts = 0;
     Type * tx = XYV.data()[0];
     Type * ty = XYV.data()[1];
     Type **   xyv  = XYV.data();


   //----  filtre les pts hors du rectangle ---------

     INT dim =        XYV.ty();

     {
          INT nb_pts_tot = XYV.tx();
          for( k=0; k<nb_pts_tot; k++)
              if (
                         (tx[k]>=X0) 
                      && (tx[k]< X1)
                      && (ty[k]>=Y0) 
                      && (ty[k]< Y1)
                 )
              {
                  for(INT d=0; d<dim; d++)
                     xyv[d][nb_pts] = xyv[d][k];
                  nb_pts++;
              }
     }

   //--------- histo en Y + cumule -----------------------
     for( k=0; k<nb_pts; k++)
         _cpt[ty[k]]++;
     for (INT y = Y0+1; y<=Y1; y++)
          _cpt[y] +=  _cpt[y-1];


    //---------------- range en y croissant ----------------
     _values = Im2D<Type,INT> (nb_pts,_dim_vals+1);
     _tx     = _values.data()[0];
     _v      = _values.data()+1;

     for( k=0; k<nb_pts ; k++)
     {
         INT adr =  --_cpt[ty[k]];
         _tx[adr] =  tx[k];
         for (INT d = 0; d<_dim_vals; d++)
             _v[d][adr] = xyv[d+2][k];
     }
}
Пример #10
0
template <class TypeIm,class TypeBase> Im2D_Bits<1> CreateGr(tGRGraf & mGr,Im2D<TypeIm,TypeBase> anIm,int aLabelOut,const cParamGrReg & aPGR)
{
    bool V8=true;
    //int aNbV = V8 ? 8 : 4;
    //Pt2di * TabV = V8 ? TAB_8_NEIGH : TAB_4_NEIGH;

    TIm2D<TypeIm,TypeBase> aTIm(anIm);
    Pt2di aSz = anIm.sz();

    Im2D_INT4 aImLabel(aSz.x,aSz.y,-1);
    TIm2D<INT4,INT4> aTL(aImLabel);
    ELISE_COPY(aImLabel.border(1),-2,aImLabel.out());

    Pt2di aP0;
    int aCpt=0;
    ElGrowingSetInd aSV(1000);
    std::vector<tGRSom *> aVSom;
    for (aP0.y=0 ; aP0.y<aSz.y ; aP0.y++)
    {
        for (aP0.x=0 ; aP0.x<aSz.x ; aP0.x++)
        {
             int aLabel = aTIm.get(aP0);
             if ((aTL.get(aP0)==-1) && (aLabel != aLabelOut))
             {
                std::vector<Pt2di> aVPts;
                CompCnx(aVPts,V8,aP0,anIm,aImLabel,INT4(aCpt),&aSV);
                int aNbPts = aVPts.size();
                if (aNbPts >= aPGR.mSzMinInit)
                {
                   cGR_AttrSom anAttr(aP0,aLabel,aCpt,aNbPts);
                 
                   tGRSom &  aSom = mGr.new_som(anAttr);
                   aVSom.push_back(&aSom);

                   for (ElGrowingSetInd::const_iterator itV=aSV.begin(); itV!=aSV.end() ; itV++)
                   {
                        tGRSom * aS2 = aVSom[*itV];
                        if (aS2)
                        {
                            cGR_AttrArc anAA;
                            mGr.add_arc(aSom,*aS2,anAA);
                        }
                   }
                }
                else
                {
                     aVSom.push_back(0);
                }
                aCpt++;
             }
        }
    }

    //std::cout << "BGIN FLAG MONT-DESC\n"; getchar();
    // Calcul des flag montant et descandant 
    int aFlagArcMont = mGr.alloc_flag_arc();
    int aFlagArcDesc = mGr.alloc_flag_arc();
    ElSubGraphe<cGR_AttrSom,cGR_AttrArc> aSubAll;
    for (int aKS=0 ; aKS<int(aVSom.size()) ; aKS++)
    {
        tGRSom * aSom = aVSom[aKS];
        if (aSom)
        {
            tGRSom * aSMax = aSom;
            tGRSom * aSMin = aSom;
            for (tGRSom::TArcIter itA=aSom->begin(aSubAll); itA.go_on(); itA++)
            {
                tGRSom * aS2 = &(itA->s2());
                if (    (aS2->attr().ValR() > aSMax->attr().ValR())
                     || ((aS2->attr().ValR()==aSMax->attr().ValR()) && (aS2->attr().Sz() > aSMax->attr().Sz()))
                   )
                {
                    aSMax = aS2;
                }

                if (    (aS2->attr().ValR() < aSMin->attr().ValR())
                     || ((aS2->attr().ValR()==aSMin->attr().ValR()) && (aS2->attr().Sz() > aSMin->attr().Sz()))
                   )
                {
                    aSMin = aS2;
                }
            }

            if (aSMax != aSom)
               mGr.arc_s1s2(*aSom,*aSMax)->sym_flag_set_kth_true(aFlagArcMont);
            if (aSMin != aSom)
               mGr.arc_s1s2(*aSom,*aSMin)->sym_flag_set_kth_true(aFlagArcDesc);
        }
    }
    // std::cout << "EeenDD  FLAG MONT-DESC\n";

    //  Analyse zone water shade
    for (int aKMD=0 ; aKMD<2 ; aKMD++)
    {
         bool isMont = (aKMD==0);
         int aFlagArc = (isMont) ? aFlagArcMont : aFlagArcDesc;
         ElPartition<tGRSom * > aPart;
         ElSubGraphe<cGR_AttrSom,cGR_AttrArc> aSubAll;
         cSubGrFlagArc< ElSubGraphe<cGR_AttrSom,cGR_AttrArc> > aSub(aSubAll,aFlagArc);
         PartitionCC(aPart,mGr,aSub);


         std::vector<tGRSom *> aVBarbs;
         cSubGrSzSup aGrCons(aPGR.mSzBarb);
         Ebarbule(mGr,aSub,aGrCons,aVBarbs);
         std::set<tGRSom *> aSetB(aVBarbs.begin(),aVBarbs.end());

         for (int aKC=0 ; aKC< aPart.nb() ; aKC++)
         {
             ElSubFilo<tGRSom *> aCC = aPart[aKC];
             int aSzTot = SomSz(aCC);
             bool Ok = aSzTot >= aPGR.mSeuilZonWS ;
             if (Ok)
             {
                 for (int aKS=0 ; aKS<aCC.size() ; aKS++)
                 {
                     if (aSetB.find(aCC[aKS])==aSetB.end())
                     {
                        aCC[aKS]->attr().Valid() = true;
                     }
                     else
                     {
                     }
                 }
             }
         }
    }
    // std::cout << "EeenDD  PARTITION\n"; getchar();

 
    double aSomT=0;
    double aMaxT=0;

    int aDelta = 1;  // 1 
    for (int aKS=0 ; aKS<int(aVSom.size()) ; aKS++)
    {
        tGRSom * aSom = aVSom[aKS];
        if (aSom && (! aSom->attr().DoneValR()))
        {
            ElTimer aChrono;
            cSubGrInterv aSG(aSom->attr().ValR()-aDelta,aSom->attr().ValR()+aDelta);
            ElFifo<tGRSom *> aCC;
            comp_connexe_som(aCC,aSom,aSG);
            int aSzCC = SomSz(aCC);
            bool Ok = aSzCC >= aPGR.mSeuilValRDelta;

            for (int aKC=0 ; aKC<int(aCC.size()) ; aKC++)
            {
                  tGRSom * aSom2 = aCC[aKC];
                  if (aSom2->attr().ValR() == aSom->attr().ValR())
                     aSom2->attr().DoneValR() = true;
                  if (Ok)
                     aSom2->attr().Valid() = true;
            }
            // ShowComp(aCC,V8,(Ok?255:0), anIm,aImLabel);

            double aT = aChrono.uval();
            aSomT += aT;
            if (aT > aMaxT)
            {
               aMaxT = aT;
            }
        }
    }

/*
*/

   //   EXPORT DES RESULTATS FINALS 
    Im2D_Bits<1>  aImRes(aSz.x,aSz.y,0);
    TIm2DBits<1>  aTImRes(aImRes);
    for (int aKS=0 ; aKS<int(aVSom.size()) ; aKS++)
    {
        tGRSom * aSom = aVSom[aKS];
        if (aSom  && aSom->attr().Valid())
        {
           std::vector<Pt2di> aVPts;
           CompCnxCste(aVPts,V8,aSom->attr().P0(),anIm,aImLabel);
           for (int aKP=0 ; aKP<int(aVPts.size()) ; aKP++)
           {
              aTImRes.oset(aVPts[aKP],1);
           }
        }
    }
    return  aImRes;
}