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
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
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
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
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
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
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
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
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 }
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
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
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
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
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
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
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
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
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 }
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;
00340 int Inbl, Inbc, Onbl, Onbc;
00341 short i,j,k,l;
00342 bool fait;
00343 T maxval=0;
00344 Image<T> objeter;
00345 objeter=objet;
00346
00347
00348 res=image;
00349
00350
00351 Inbl=image.NbRow();
00352 Inbc=image.NbCol();
00353 Onbl=objeter.NbRow();
00354 Onbc=objeter.NbCol();
00355
00356 if(Onbl<=Inbl && Onbc<=Inbc){
00357
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
00371 objeter(Ci,Cj)=1;
00372
00373
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)
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;
00399 int Inbl, Inbc, Onbl, Onbc;
00400 short i,j,k,l;
00401 T maxval=0;
00402 Image<T> objeter(objet.NbRow(),objet.NbCol());
00403 bool fait;
00404
00405
00406 res=image;
00407
00408
00409 Inbl=image.NbRow();
00410 Inbc=image.NbCol();
00411 Onbl=objet.NbRow();
00412 Onbc=objet.NbCol();
00413
00414 if(Onbl<=Inbl && Onbc<=Inbc)
00415 {
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
00429
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
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)
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