lmoycarre2D.c

00001 /*
00002 *    Copyright (c) 2007. The BATI team. All right reserved.
00003 *
00004 *    This file is part of BATI library.
00005 *
00006 *    BATI library is free software: you can redistribute it and/or modify
00007 *    it under the terms of the GNU General Public License as published by
00008 *    the Free Software Foundation, either version 3 of the License, or
00009 *    (at your option) any later version.
00010 *
00011 *    BATI library  is distributed in the hope that it will be useful,
00012 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 *    GNU General Public License for more details.
00015 *
00016 *    You should have received a copy of the GNU General Public License
00017 *    along with BATI library.  If not, see <http://www.gnu.org/licenses/>.
00018 */
00040 #include "image.h"
00041 #include "proto2D.h"
00042 #include <stdlib.h>
00043 #include <fcntl.h>
00044 #include <limits.h> /* pour  USHRT_MAX */
00045 
00046 
00047 /* **********************  LECTURE DE PARAMETRES   *************************/
00060 param * moycarre2D_lect(moycarre2D_t *des, param *ptp, char *debq){
00061   char question[500];
00062 
00063   sprintf(question, "%s nombre de colonnes moyennees (impaire)", debq); 
00064   lec_param(question, ptp);
00065   des->dimX = atoi(ptp->rep);
00066   ptp = ptp->next; 
00067 
00068   sprintf(question, "%s nombre de lignes moyennees (impaire)", debq); 
00069   lec_param(question, ptp);
00070   des->dimY = atoi(ptp->rep);
00071   ptp = ptp->next;
00072 
00073   if( ((des->dimX*des->dimY)%2 == 0) || des->dimX<=0 || des->dimY<=0){
00074       printf("\n>> ERREUR moycarre2D_lect : dimensions incorrectes\n");
00075       exit(1);
00076   }
00077 
00078   return(ptp);
00079 }
00080 
00081 
00082 /* **********************  INITIALISATION  *****************************/
00093 int moycarre2Du1_init(moycarre2D_t *des, imau1 im0, imafl *imres){
00094   int i;
00095 
00096   /* image resultat */ 
00097   imres->nc = im0.nc;
00098   imres->nr = im0.nr;
00099   sprintf(imres->nom, "%s(moycarre%dx%d)", im0.nom, des->dimX, des->dimY);
00100   alloc_imafl(imres);
00101 
00102   /* colonne de travail */
00103   if( (des->tmpcol = (double*)malloc(im0.nr*sizeof(double))) == NULL ){
00104           printf("\n>> ERREUR moycarre2Du1_init : allocation impossible\n");
00105           exit(1);
00106   }
00107 
00108   /* modules carres */  
00109   if( (des->tab = (double*)malloc(256*sizeof(double))) == NULL ){
00110       printf("\n>> ERREUR moycarre2Du1_init : allocation impossible\n");
00111       exit(1);
00112   }
00113   for(i=0; i<256; i++)
00114       des->tab[i] = (double)i * (double)i;
00115   
00116   return(0);  
00117 }
00118 
00119 /* initialisation (16 bit)*/
00120 int moycarre2Du2_init(moycarre2D_t *des, imau2 im0, imafl *imres){
00121   int i;
00122  
00123   /* image resultat */ 
00124   imres->nc = im0.nc;
00125   imres->nr = im0.nr;
00126   sprintf(imres->nom, "%s(moycarre%dx%d)", im0.nom, des->dimX, des->dimY);
00127   alloc_imafl(imres);
00128 
00129   /* colonne de travail */
00130   if( (des->tmpcol = (double*)malloc(im0.nr*sizeof(double))) == NULL ){
00131           printf("\n>> ERREUR moycarre2Du2_init : allocation impossible\n");
00132           exit(1);
00133   }
00134 
00135   /* modules carres */  
00136   if( (des->tab = (double*)malloc((USHRT_MAX+1)*sizeof(double))) == NULL ){
00137       printf("\n>> ERREUR estimRu2_init : allocation impossible\n");
00138       exit(1);
00139   }
00140   for(i=0; i<=USHRT_MAX; i++)
00141       des->tab[i] = (double)i * (double)i;
00142   
00143   return(0);  
00144 }
00145 
00146 /* initialisation (float) */
00147 int moycarre2Dfl_init(moycarre2D_t *des, imafl im0, imafl *imres){
00148   /* image resultat */ 
00149   imres->nc = im0.nc;
00150   imres->nr = im0.nr;
00151   sprintf(imres->nom, "%s(moycarre%dx%d)", im0.nom, des->dimX, des->dimY);
00152   alloc_imafl(imres);
00153 
00154   /* colonne de travail */
00155   if( (des->tmpcol = (pixdb *)malloc(im0.nr*sizeof(pixdb))) == NULL ){
00156           printf("\n>> ERREUR moycarre2Dfl_init : allocation impossible\n");
00157           exit(1);
00158   }
00159 
00160   /* ligne de travail */
00161   if( (des->tmplig = (pixdb *)malloc(im0.nc*sizeof(pixdb))) == NULL ){
00162           printf("\n>> ERREUR moycarre2Dfl_init : allocation impossible\n");
00163           exit(1);
00164   }  
00165 
00166   return(0);  
00167 }
00168 
00169 /* initialisation (double) */
00170 int moycarre2Ddb_init(moycarre2D_t *des, imadb im0, imadb *imres){
00171   /* image resultat */ 
00172   imres->nc = im0.nc;
00173   imres->nr = im0.nr;
00174   sprintf(imres->nom, "%s(moy%dx%d)", im0.nom, des->dimX, des->dimY);
00175   alloc_imadb(imres);
00176 
00177   /* colonne de travail */
00178   if( (des->tmpcol = (pixdb *)malloc(im0.nr*sizeof(pixdb))) == NULL ){
00179           printf("\n>> ERREUR moycarre2Ddb_init : allocation impossible\n");
00180           exit(1);
00181   }
00182 
00183   /* ligne de travail */
00184   if( (des->tmplig = (pixdb *)malloc(im0.nc*sizeof(pixdb))) == NULL ){
00185           printf("\n>> ERREUR moycarre2Ddb_init : allocation impossible\n");
00186           exit(1);
00187   }  
00188 
00189   return(0);  
00190 }
00191 
00192 
00193 /* *************************  CALCUL  ***************************/
00205 int moycarre2Du1_calc(moycarre2D_t *des, imau1 im0, imafl *imres){
00206   pixu1 *ptu1;
00207   int i, j, nc, nr, nbp, dlfX, dlfY;
00208   float *ptfl;
00209   double tmpdb, somdb, *ptdb;
00210   
00211   
00212   nc = im0.nc; 
00213   nr = im0.nr; 
00214   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00215   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00216 
00217   /* moyenne ligne */
00218   for(j=0; j<nr; j++){
00219       nbp = 0;
00220       somdb = 0.;
00221       ptu1 = im0.p[j];
00222       ptfl = imres->p[j];
00223       for(i=0; i<dlfX; i++){
00224           somdb += des->tab[ptu1[i]];
00225           nbp++;
00226       }
00227       for(i=0; i<dlfX; i++){
00228           somdb += des->tab[ptu1[i+dlfX]];
00229           nbp++;
00230           ptfl[i] = (float)somdb/nbp; 
00231       } 
00232       nbp++;
00233       for(  ; i<nc-dlfX; i++){
00234           somdb += des->tab[ptu1[i+dlfX]];
00235           ptfl[i] = (float)somdb/nbp;     
00236           somdb -= des->tab[ptu1[i-dlfX]];
00237       }
00238       nbp--;
00239       for(  ; i<nc; i++){
00240           ptfl[i] = (float)somdb/nbp;     
00241           somdb -= des->tab[ptu1[i-dlfX]];
00242           nbp--;  
00243       }
00244   } 
00245 
00246   /* moyenne colonne */   
00247   ptdb = des->tmpcol;  
00248   for(i=0; i<nc; i++){
00249       /* recopie, verif < 0 */
00250       for(j=0; j<nr; j++)
00251           if( (ptdb[j] = (double)imres->p[j][i]) < 0. ){ 
00252               printf("\n>> ATT moycarre2Du1_calc : som_lig(%d,%d)=%f mis a 0\n",
00253                      i, j, ptdb[j]);
00254               ptdb[j] = 0.;
00255           }
00256       nbp = 0;
00257       somdb = 0.;
00258       for(j=0; j<dlfY; j++){
00259           somdb += ptdb[j];
00260           nbp++;
00261       }
00262       for(j=0; j<dlfY; j++){
00263           somdb += ptdb[j+dlfY];
00264           nbp++;
00265           imres->p[j][i] = (float)somdb/nbp;
00266       } 
00267       nbp++;
00268       for(  ; j<nr-dlfY; j++){
00269           somdb += ptdb[j+dlfY];
00270           if(somdb<0.){
00271               printf("\n>> ATT moycarre2Du1_calc : somme(%d,%d)=%f mis a 0\n",
00272                      i, j, somdb);
00273               somdb = 0.;
00274               imres->p[j][i] = 0.;
00275           }
00276           else
00277               imres->p[j][i] = (float)somdb/nbp;
00278           somdb -= ptdb[j-dlfY];
00279       }
00280       nbp--;
00281       for(  ; j<nr; j++){
00282           if(somdb<0.){
00283               printf("\n>> ATT moycarre2Du1_calc : somme(%d,%d)=%f mis a 0\n",
00284                      i, j, somdb);
00285               somdb = 0.;
00286               imres->p[j][i] = 0.;
00287           }
00288           else
00289               imres->p[j][i] = (float)somdb/nbp;
00290           somdb -= ptdb[j-dlfY];
00291           nbp--;  
00292       }
00293   }
00294 
00295   return(0);
00296 }
00297 
00298 /* calcul (16 bit) */
00299 int moycarre2Du2_calc(moycarre2D_t *des, imau2 im0, imafl *imres){
00300   pixu2 *ptu2;
00301   int i, j, nc, nr, nbp, dlfX, dlfY;
00302   float *ptfl;
00303   double tmpdb, somdb, *ptdb;
00304   
00305   
00306   nc = im0.nc; 
00307   nr = im0.nr; 
00308   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00309   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00310 
00311   /* moyenne ligne */
00312   for(j=0; j<nr; j++){
00313       nbp = 0;
00314       somdb = 0.;
00315       ptu2 = im0.p[j];
00316       ptfl = imres->p[j];
00317       for(i=0; i<dlfX; i++){
00318           somdb += des->tab[ptu2[i]];
00319           nbp++;
00320       }
00321       for(i=0; i<dlfX; i++){
00322           somdb += des->tab[ptu2[i+dlfX]];
00323           nbp++;
00324           ptfl[i] = (float)somdb/nbp; 
00325       } 
00326       nbp++;
00327       for(  ; i<nc-dlfX; i++){
00328           somdb += des->tab[ptu2[i+dlfX]];
00329           ptfl[i] = (float)somdb/nbp;     
00330           somdb -= des->tab[ptu2[i-dlfX]];
00331       }
00332       nbp--;
00333       for(  ; i<nc; i++){
00334           ptfl[i] = (float)somdb/nbp;     
00335           somdb -= des->tab[ptu2[i-dlfX]];
00336           nbp--;  
00337       }
00338   } 
00339 
00340   /* moyenne colonne */   
00341   ptdb = des->tmpcol;  
00342   for(i=0; i<nc; i++){
00343       /* recopie, verif < 0 */
00344       for(j=0; j<nr; j++)
00345           if( (ptdb[j] = (double)imres->p[j][i]) < 0. ){ 
00346               printf("\n>> ATT moycarre2Du2_calc : som_lig(%d,%d)=%f mis a 0\n",
00347                      i, j, ptdb[j]);
00348               ptdb[j] = 0.;
00349           }
00350       nbp = 0;
00351       somdb = 0.;
00352       for(j=0; j<dlfY; j++){
00353           somdb += ptdb[j];
00354           nbp++;
00355       }
00356       for(j=0; j<dlfY; j++){
00357           somdb += ptdb[j+dlfY];
00358           nbp++;
00359           imres->p[j][i] = (float)somdb/nbp;
00360       } 
00361       nbp++;
00362       for(  ; j<nr-dlfY; j++){
00363           somdb += ptdb[j+dlfY];
00364           if(somdb<0.){
00365               printf("\n>> ATT moycarre2Du2_calc : somme(%d,%d)=%f mis a 0\n",
00366                      i, j, somdb);
00367               somdb = 0.;
00368               imres->p[j][i] = 0.;
00369           }
00370           else
00371               imres->p[j][i] = (float)somdb/nbp;
00372           somdb -= ptdb[j-dlfY];
00373       }
00374       nbp--;
00375       for(  ; j<nr; j++){
00376           if(somdb<0.){
00377               printf("\n>> ATT moycarre2Du2_calc : somme(%d,%d)=%f mis a 0\n",
00378                      i, j, somdb);
00379               somdb = 0.;
00380               imres->p[j][i] = 0.;
00381           }
00382           else
00383               imres->p[j][i] = (float)somdb/nbp;
00384           somdb -= ptdb[j-dlfY];
00385           nbp--;  
00386       }
00387   }
00388 
00389   return(0);
00390 }
00391 
00392 /* calcul (float) */
00393 int moycarre2Dfl_calc(moycarre2D_t *des, imafl im0, imafl *imres){
00394   pixfl *ptfl, *ptres;
00395   int i, j, nc, nr, nbp, dlfX, dlfY;
00396   pixdb  somdb, tmpdb, *ptdb;
00397   
00398   nc = im0.nc; 
00399   nr = im0.nr; 
00400   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00401   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00402  
00403   /* moyenne ligne */
00404   ptdb = des->tmplig;
00405   for(j=0; j<nr; j++){
00406       nbp = 0;
00407       somdb = 0.;
00408       ptfl = im0.p[j];
00409       ptres = imres->p[j];
00410       for(i=0; i<nc; i++){
00411           tmpdb = (double)ptfl[i];
00412           ptdb[i] =  tmpdb*tmpdb;
00413       }
00414       for(i=0; i<dlfX; i++){
00415           somdb += ptdb[i];
00416           nbp++;
00417       }
00418       for(i=0; i<dlfX; i++){
00419           somdb += ptdb[i+dlfX];
00420           nbp++;
00421           ptres[i] = (pixfl)somdb/nbp; 
00422       } 
00423       nbp++;
00424       for(  ; i<nc-dlfX; i++){
00425           somdb += ptdb[i+dlfX];
00426           ptres[i] = (pixfl)somdb/nbp; 
00427           somdb -= ptdb[i-dlfX];
00428       }
00429       nbp--;
00430       for(  ; i<nc; i++){
00431           ptres[i] = (pixfl)somdb/nbp; 
00432           somdb -= ptdb[i-dlfX];
00433           nbp--;  
00434       }
00435   }
00436 
00437   /* moyenne colonne */     
00438   ptdb = des->tmpcol;
00439   for(i=0; i<nc; i++){
00440       /* recopie */
00441       for(j=0; j<nr; j++)
00442           ptdb[j] = (pixdb)imres->p[j][i];
00443       nbp = 0;
00444       somdb = 0.;
00445       for(j=0; j<dlfY; j++){
00446           somdb += ptdb[j];
00447           nbp++;
00448       }
00449       for(j=0; j<dlfY; j++){
00450           somdb += ptdb[j+dlfY];
00451           nbp++;
00452           imres->p[j][i] = (pixfl)somdb/nbp;  
00453       } 
00454       nbp++;
00455       for(  ; j<nr-dlfY; j++){
00456           somdb += ptdb[j+dlfY];
00457           imres->p[j][i] = (pixfl)somdb/nbp;  
00458           somdb -= ptdb[j-dlfY];
00459       }
00460       nbp--;
00461       for(  ; j<nr; j++){
00462           imres->p[j][i] = (pixfl)somdb/nbp;  
00463           somdb -= ptdb[j-dlfY];
00464           nbp--;  
00465       }
00466   }
00467   return(0);
00468 }
00469 
00470 /* calcul (double) */
00471 int moycarre2Ddb_calc(moycarre2D_t *des, imadb im0, imadb *imres){
00472   pixdb *ptdb1, *ptdb2, *ptres;
00473   int i, j, nc, nr, nbp, dlfX, dlfY;
00474   pixdb  somdb;
00475   
00476   nc = im0.nc; 
00477   nr = im0.nr; 
00478   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00479   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00480  
00481   /* moyenne ligne */
00482   ptdb2 = des->tmplig;
00483   for(j=0; j<nr; j++){
00484       nbp = 0;
00485       somdb = 0.;
00486       ptdb1 = im0.p[j];
00487       ptres = imres->p[j];
00488       for(i=0; i<nc; i++)
00489           ptdb2[i] = ptdb1[i] * ptdb1[i];
00490       for(i=0; i<dlfX; i++){
00491           somdb += ptdb2[i];
00492           nbp++;
00493       }
00494       for(i=0; i<dlfX; i++){
00495           somdb += ptdb2[i+dlfX];
00496           nbp++;
00497           ptres[i] = somdb/nbp; 
00498       } 
00499       nbp++;
00500       for(  ; i<nc-dlfX; i++){
00501           somdb += ptdb2[i+dlfX];
00502           ptres[i] = somdb/nbp; 
00503           somdb -= ptdb2[i-dlfX];
00504       }
00505       nbp--;
00506       for(  ; i<nc; i++){
00507           ptres[i] = (pixdb)somdb/nbp; 
00508           somdb -= ptdb2[i-dlfX];
00509           nbp--;  
00510       }
00511   }
00512 
00513   /* moyenne colonne */     
00514   ptdb2 = des->tmpcol;
00515   for(i=0; i<nc; i++){
00516       /* recopie */
00517       for(j=0; j<nr; j++)
00518           ptdb2[j] = imres->p[j][i];
00519       nbp = 0;
00520       somdb = 0.;
00521       for(j=0; j<dlfY; j++){
00522           somdb += ptdb2[j];
00523           nbp++;
00524       }
00525       for(j=0; j<dlfY; j++){
00526           somdb += ptdb2[j+dlfY];
00527           nbp++;
00528           imres->p[j][i] = somdb/nbp;  
00529       } 
00530       nbp++;
00531       for(  ; j<nr-dlfY; j++){
00532           somdb += ptdb2[j+dlfY];
00533           imres->p[j][i] = somdb/nbp;  
00534           somdb -= ptdb2[j-dlfY];
00535       }
00536       nbp--;
00537       for(  ; j<nr; j++){
00538           imres->p[j][i] = somdb/nbp;  
00539           somdb -= ptdb2[j-dlfY];
00540           nbp--;  
00541       }
00542   }
00543   return(0);
00544 }
00545 
00546 

Generated on Tue Apr 22 13:31:04 2008 for ima2D by  doxygen 1.5.3