Main Page   Compound List   File List   Compound Members  

imagetoolsmorpho.H

00001 #ifndef _IMAGESTOOLS_MORPHO_H_
00002 #define _IMAGESTOOLS_MORPHO_H_
00003 #include <vector>
00004 #include <algorithm>
00005 #include <list>
00006 #include <iterator>
00007 #include <iostream>
00008 #include <math.h>
00009 using namespace std;
00010 
00026 template <class T>
00027 class ImageToolsMorpho
00028 {
00029 public:
00030 
00037   static Image<T> Erosion(const Image<T> &image,const int w_size,bool *elt) ;
00038 
00045   static Image<T> Dilatation(const Image<T> &image,const int w_size,bool *elt);
00046 
00053   static int Erosion2(const Image<T> &image, const Image<T> &objet, Image<T> &res);
00054 
00061   static int Dilatation2(const Image<T> &image, const Image<T> &objet, Image<T> &res);
00062 };
00064 
00065 
00066 
00067 template <class T>
00068 Image<T> ImageToolsMorpho<T>::Dilatation(const Image<T> &image1,const int size,bool *elt)
00069 {
00070   int w_size=(int)(size/2.);
00071   int nbl=image1.NbRow();
00072   int nbc=image1.NbCol();
00073   Image<T> image(nbl,nbc);;
00074   bool test;
00075   int i,j,u,v,deb_i=0,deb_j=0,fin_i=0,fin_j=0;
00076 
00077   for(i=0;i<nbc;i++)
00078     {
00079       for(j=0;j<nbl;j++)
00080         {
00081           test=false;
00082           if((i>=w_size)&&(i<nbc-1-w_size)&&(j>=w_size)&&(j<nbl-1-w_size))
00083           {
00084             for(u=i-w_size;u<=i+w_size;u++)
00085             {
00086               for(v=j-w_size;v<=j+w_size;v++)
00087               {
00088                 if(test)
00089                   break;
00090 
00091                 if(elt[(w_size+v-j)*size+(w_size+u-i)])
00092                 {
00093                   if(image1(v,u)!=0)
00094                      test=true;
00095                 }
00096               }
00097             }
00098 
00099               image(j,i)=test*255;
00100 
00101           }
00102           else
00103           {
00104 
00105             /* haut gauche */
00106             if((i<w_size)&&(j<w_size))
00107             {
00108               deb_i=0;
00109               deb_j=0;
00110               fin_i=w_size;
00111               fin_j=w_size;
00112             }
00113             /* gauche */
00114             if((i<w_size)&&(j>=w_size)&&(j<nbl-1-w_size))
00115             {
00116               deb_i=0;
00117               deb_j=j-w_size;
00118               fin_i=w_size;
00119               fin_j=j+w_size;
00120             }
00121 
00122             /* bas gauche */
00123             if((i<w_size)&&(j>=nbl-1-w_size))
00124             {
00125               deb_i=0;
00126               deb_j=j-w_size;
00127               fin_i=w_size;
00128               fin_j=nbl-1;
00129             }
00130 
00131             /* haut droit */
00132             if((i>=nbc-1-w_size)&&(j<w_size))
00133             {
00134               deb_i=i-w_size;
00135               deb_j=0;
00136               fin_i=nbc-1;
00137               fin_j=j+w_size;
00138             }
00139 
00140             /* droit */
00141             if((i>=nbc-1-w_size)&&(j>=w_size)&&(j<nbl-1-w_size))
00142             {
00143               deb_i=i-w_size;
00144               deb_j=j-w_size;
00145               fin_i=nbc-1;
00146               fin_j=j+w_size;
00147             }
00148 
00149 
00150             /* bas droit */
00151             if((i>=nbc-1-w_size)&&(j>=nbl-1-w_size))
00152             {
00153               deb_i=i-w_size;
00154               deb_j=j-w_size;
00155               fin_i=nbc-1;
00156               fin_j=nbl-1;
00157             }
00158 
00159             /* haut */
00160 
00161             if((i<nbc-1-w_size)&&(j<w_size)&&(i>=w_size))
00162             {
00163               deb_i=i-w_size;
00164               deb_j=0;
00165               fin_i=i+w_size;
00166               fin_j=w_size;
00167             }
00168 
00169             /* bas */
00170 
00171             if((i<nbc-1-w_size)&&(j>=nbl-1-w_size)&&(i>=w_size))
00172             {
00173               deb_i=i-w_size;
00174               deb_j=j-w_size;
00175               fin_i=i+w_size;
00176               fin_j=nbl-1;
00177             }
00178 
00179             for(u=deb_i;u<=fin_i;u++)
00180             {
00181               for(v=deb_j;v<=fin_j;v++)
00182               {
00183                 if(test)
00184                   break;
00185 
00186                 if(elt[(w_size+v-j)*size+(w_size+u-i)])
00187                   if(image1(v,u)!=0)
00188                     test=true;
00189               }
00190             }
00191             image(j,i)=test*255;
00192 
00193 
00194           }/* fin du if hors centre */
00195 
00196         }
00197     }
00198   return image;
00199 }
00200 
00201 template <class T>
00202 Image<T> ImageToolsMorpho<T>::Erosion(const Image<T> &image1,const int size,bool *elt)
00203 {
00204   int w_size=(int)(size/2.);
00205   int nbl=image1.NbRow();
00206   int nbc=image1.NbCol();
00207   Image<T> image(nbl,nbc);;
00208   bool test;
00209   int i,j,u,v,deb_i=0,deb_j=0,fin_i=0,fin_j=0;
00210 
00211   for(i=0;i<nbc;i++)
00212     {
00213       for(j=0;j<nbl;j++)
00214         {
00215 
00216           test=false;
00217           if((i>=w_size)&&(i<nbc-1-w_size)&&(j>=w_size)&&(j<nbl-1-w_size))
00218           {
00219             for(u=i-w_size;u<=i+w_size;u++)
00220             {
00221               for(v=j-w_size;v<=j+w_size;v++)
00222               {
00223                 if(test)
00224                   break;
00225 
00226                 if(elt[(w_size+v-j)*size+(w_size+u-i)])
00227                 {
00228                   if(image1(v,u)==0)
00229                      test=true;
00230                 }
00231               }
00232             }
00233 
00234               image(j,i)=(!test)*255;
00235 
00236           }
00237           else
00238           {
00239 
00240             /* haut gauche */
00241             if((i<w_size)&&(j<w_size))
00242             {
00243               deb_i=0;
00244               deb_j=0;
00245               fin_i=w_size;
00246               fin_j=w_size;
00247             }
00248             /* gauche */
00249             if((i<w_size)&&(j>=w_size)&&(j<nbl-1-w_size))
00250             {
00251               deb_i=0;
00252               deb_j=j-w_size;
00253               fin_i=w_size;
00254               fin_j=j+w_size;
00255             }
00256 
00257             /* bas gauche */
00258             if((i<w_size)&&(j>=nbl-1-w_size))
00259             {
00260               deb_i=0;
00261               deb_j=j-w_size;
00262               fin_i=w_size;
00263               fin_j=nbl-1;
00264             }
00265 
00266             /* haut droit */
00267             if((i>=nbc-1-w_size)&&(j<w_size))
00268             {
00269               deb_i=i-w_size;
00270               deb_j=0;
00271               fin_i=nbc-1;
00272               fin_j=j+w_size;
00273             }
00274 
00275             /* droit */
00276             if((i>=nbc-1-w_size)&&(j>=w_size)&&(j<nbl-1-w_size))
00277             {
00278               deb_i=i-w_size;
00279               deb_j=j-w_size;
00280               fin_i=nbc-1;
00281               fin_j=j+w_size;
00282             }
00283 
00284 
00285             /* bas droit */
00286             if((i>=nbc-1-w_size)&&(j>=nbl-1-w_size))
00287             {
00288               deb_i=i-w_size;
00289               deb_j=j-w_size;
00290               fin_i=nbc-1;
00291               fin_j=nbl-1;
00292             }
00293 
00294             /* haut */
00295 
00296             if((i<nbc-1-w_size)&&(j<w_size)&&(i>=w_size))
00297             {
00298               deb_i=i-w_size;
00299               deb_j=0;
00300               fin_i=i+w_size;
00301               fin_j=w_size;
00302             }
00303 
00304             /* bas */
00305 
00306             if((i<nbc-1-w_size)&&(j>=nbl-1-w_size)&&(i>=w_size))
00307             {
00308               deb_i=i-w_size;
00309               deb_j=j-w_size;
00310               fin_i=i+w_size;
00311               fin_j=nbl-1;
00312             }
00313 
00314             for(u=deb_i;u<=fin_i;u++)
00315             {
00316               for(v=deb_j;v<=fin_j;v++)
00317               {
00318                 if(test)
00319                   break;
00320 
00321                 if(elt[(w_size+v-j)*size+(w_size+u-i)])
00322                   if(image1(v,u)==0)
00323                     test=true;
00324               }
00325             }
00326             image(j,i)=(!test)*255;
00327 
00328 
00329           }/* fin du if hors centre */
00330 
00331         }
00332     }
00333   return image;
00334 }
00335 
00336 
00337 template <class T>
00338 int ImageToolsMorpho<T>::Erosion2(const Image<T> &image, const Image<T> &objet, Image<T> &res) {
00339   short Ci,Cj; //position du centre de l objet repere par 2
00340   int Inbl, Inbc, Onbl, Onbc;
00341   short i,j,k,l;
00342   bool fait;
00343   T maxval=0;  // pour warning
00344   Image<T> objeter;
00345   objeter=objet;
00346 
00347   //initialisation du resultat
00348   res=image;
00349 
00350   //initialisation du nombre de lignes et de colonnes
00351   Inbl=image.NbRow();
00352   Inbc=image.NbCol();
00353   Onbl=objeter.NbRow();
00354   Onbc=objeter.NbCol();
00355 
00356   if(Onbl<=Inbl && Onbc<=Inbc){
00357     //recuperation de la position du centre
00358     i=-1;
00359     j=Onbc;
00360     while(i<Onbl && j==Onbc)
00361     {
00362       j=0;
00363       i++;
00364       while(j<Onbc && objeter(i,j)!=2) j++;
00365     }
00366 
00367     Ci=i;
00368     Cj=j;
00369 
00370     //mise a 1 du centre pour operer l erosion
00371     objeter(Ci,Cj)=1;
00372 
00373     //erosion de limage
00374     for(i=0;i<Inbl;i++)
00375       for(j=0;j<Inbc;j++)
00376       {
00377         fait=false;
00378         for(k=(-Ci);k<Onbl-Ci;k++)
00379           for(l=(-Cj);l<Onbc-Cj;l++)
00380             if(i+k>=0 && j+l>=0 && j+l<Inbc && i+k<Inbl)//le point de l objet appartient a l image
00381             {if(objeter(k+Ci,l+Cj)==1 && fait)
00382               if(maxval>image(i+k,j+l)) maxval=image(i+k,j+l);
00383             if(objeter(k+Ci,l+Cj)==1 && !fait)
00384             {
00385               fait=true;
00386               maxval=image(i+k,j+l);}
00387             }
00388         res(i,j)=maxval;
00389       }
00390 
00391     return(1);
00392   }
00393   else return(0);
00394 }
00395 
00396 template <class T>
00397 int ImageToolsMorpho<T>::Dilatation2(const Image<T> &image, const Image<T> &objet, Image<T> &res) {
00398   short Ci,Cj,nCi,nCj; //position du centre de l objet repere par 2
00399   int Inbl, Inbc, Onbl, Onbc;
00400   short i,j,k,l;
00401   T maxval=0; // pour warning
00402   Image<T> objeter(objet.NbRow(),objet.NbCol()); //image de l objet translate
00403   bool fait;
00404 
00405   //initialisation du resultat
00406   res=image;
00407 
00408   //initialisation du nombre de lignes et de colonnes
00409   Inbl=image.NbRow();
00410   Inbc=image.NbCol();
00411   Onbl=objet.NbRow();
00412   Onbc=objet.NbCol();
00413 
00414   if(Onbl<=Inbl && Onbc<=Inbc)
00415   {//recuperation de la position du centre
00416     i=-1;
00417     j=Onbc;
00418     while(i<Onbl && j==Onbc)
00419     {
00420       j=0;
00421       i++;
00422       while(j<Onbc && objet(i,j)!=2) j++;
00423     }
00424 
00425     Ci=i;
00426     Cj=j;
00427 
00428     //la dilatation utilisa le translate
00429     //creation du translate
00430     for(i=0;i<Onbl;i++)
00431       for(j=0;j<Onbc;j++)
00432         objeter(i,j)=0;
00433 
00434     nCj=Onbc-1-Cj;
00435     nCi=Onbl-1-Ci;
00436     objeter(nCi,nCj)=2;
00437 
00438     for(i=0;i<Onbl;i++)
00439       for(j=0; j<Onbc;j++)
00440         if(objet(i,j)==1)
00441           objeter(-(i-Ci)+nCi,-(j-Cj)+nCj)=1;
00442 
00443     //mise a 1 du centre pour operer la dilatation
00444     objeter(nCi,nCj)=1;
00445 
00446     for(i=0;i<Inbl;i++)
00447       for(j=0;j<Inbc;j++)
00448       {
00449         fait=false;
00450         for(k=(-nCi);k<Onbl-nCi;k++)
00451           for(l=(-nCj);l<Onbc-nCj;l++)
00452             if(i+k>=0 && j+l>=0 && j+l<Inbc && i+k<Inbl)//le point de l objet appartient a l image
00453             {
00454               if(objeter(k+nCi,l+nCj)==1 && fait )
00455                 if(maxval<image(i+k,j+l)) maxval=image(i+k,j+l);
00456               if(objeter(k+nCi,l+nCj)==1 && !fait)
00457               {
00458                 fait=true;
00459                 maxval=image(i+k,j+l);}
00460             }
00461         res(i,j)=maxval;
00462       }
00463 
00464     return(1);
00465   } else return(0);
00466 }
00467 
00468 #endif

Generated on Wed Sep 10 17:07:06 2003 by doxygen1.3-rc2