lmoy2D.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 */
00037 #include "image.h"
00038 #include "proto2D.h"
00039 #include <stdlib.h>
00040 #include <fcntl.h>
00041 
00042 
00043 /* **********************  LECTURE DE PARAMETRES   *************************/
00056 param * moy2D_lect(moy2D_t *des, param *ptp, char *debq){
00057   char question[500];
00058 
00059   sprintf(question, "%s nombre de colonnes moyennees (impaire)", debq); 
00060   lec_param(question, ptp);
00061   des->dimX = atoi(ptp->rep);
00062   ptp = ptp->next; 
00063 
00064   sprintf(question, "%s nombre de lignes moyennees (impaire)", debq); 
00065   lec_param(question, ptp);
00066   des->dimY = atoi(ptp->rep);
00067   ptp = ptp->next;
00068 
00069   if( ((des->dimX*des->dimY)%2 == 0) || des->dimX<=0 || des->dimY<=0){
00070       printf("\n>> ERREUR moy2D_lect : dimensions incorrectes\n");
00071       exit(1);
00072   }
00073 
00074   return(ptp);
00075 }
00076 
00077 
00078 /* **********************  INITIALISATION  *****************************/
00089 int moy2Du1_init(moy2D_t *des, imau1 im0, imau1 *imres){
00090   /* image resultat */ 
00091   imres->nc = im0.nc;
00092   imres->nr = im0.nr;
00093   sprintf(imres->nom, "%s(moy%dx%d)", im0.nom, des->dimX, des->dimY);
00094   alloc_imau1(imres);
00095   /* colonne de travail */
00096   if( (des->tmpcolu4=(pixu4 *)malloc(im0.nr*sizeof(pixu4))) == NULL ){
00097           printf("\n>> ERREUR moy2Du1_init : allocation impossible\n");
00098           exit(1);
00099   }
00100   return(0);  
00101 }
00102 
00103 /* initialisation (16 bit)*/
00104 int moy2Du2_init(moy2D_t *des, imau2 im0, imau2 *imres){
00105   /* image resultat */ 
00106   imres->nc = im0.nc;
00107   imres->nr = im0.nr;
00108   sprintf(imres->nom, "%s(moy%dx%d)", im0.nom, des->dimX, des->dimY);
00109   alloc_imau2(imres);
00110   /* colonne de travail */
00111   if( (des->tmpcolu4=(pixu4 *)malloc(im0.nr*sizeof(pixu4))) == NULL ){
00112           printf("\n>> ERREUR moy2Du2_init : allocation impossible\n");
00113           exit(1);
00114   }
00115   return(0);  
00116 }
00117 
00118 /* initialisation (float) */
00119 int moy2Dfl_init(moy2D_t *des, imafl im0, imafl *imres){
00120   /* image resultat */ 
00121   imres->nc = im0.nc;
00122   imres->nr = im0.nr;
00123   sprintf(imres->nom, "%s(moy%dx%d)", im0.nom, des->dimX, des->dimY);
00124   alloc_imafl(imres);
00125   /* colonne de travail */
00126   if( (des->tmpcoldb=(pixdb *)malloc(im0.nr*sizeof(pixdb))) == NULL ){
00127           printf("\n>> ERREUR moy2Dfl_init : allocation impossible\n");
00128           exit(1);
00129   }
00130   return(0);  
00131 }
00132 
00133 /* initialisation (double) */
00134 int moy2Ddb_init(moy2D_t *des, imadb im0, imadb *imres){
00135   /* image resultat */ 
00136   imres->nc = im0.nc;
00137   imres->nr = im0.nr;
00138   sprintf(imres->nom, "%s(moy%dx%d)", im0.nom, des->dimX, des->dimY);
00139   alloc_imadb(imres);
00140   /* colonne de travail */
00141   if( (des->tmpcoldb=(pixdb *)malloc(im0.nr*sizeof(pixdb))) == NULL ){
00142           printf("\n>> ERREUR moy2Ddb_init : allocation impossible\n");
00143           exit(1);
00144   }
00145   return(0);  
00146 }
00147 
00148 
00149 /* *************************  CALCUL  ***************************/
00161 int moy2Du1_calc(moy2D_t *des, imau1 im0, imau1 *imres){
00162   pixu1 *ptu1, *ptres;
00163   int i, j, nc, nr, nbp, dlfX, dlfY;
00164   pixu4 tmpu4, somu4, *ptu4;
00165   double tmpdb;
00166   
00167   nc = im0.nc; 
00168   nr = im0.nr; 
00169   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00170   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00171 
00172   /* moyenne ligne */
00173   for(j=0; j<nr; j++){
00174       nbp = 0;
00175       somu4 = 0;
00176       ptu1 = im0.p[j];
00177       ptres = imres->p[j];
00178       for(i=0; i<dlfX; i++){
00179           somu4 += (pixu4)ptu1[i];
00180           nbp++;
00181       }
00182       for(i=0; i<dlfX; i++){
00183           somu4 += (pixu4)ptu1[i+dlfX];
00184           nbp++;
00185           tmpdb = (double)somu4/nbp + 0.5;
00186           ptres[i] = (pixu1)tmpdb; 
00187       } 
00188       nbp++;
00189       for(  ; i<nc-dlfX; i++){
00190           somu4 += (pixu4)ptu1[i+dlfX];
00191           tmpdb = (double)somu4/nbp + 0.5;
00192           ptres[i] = (pixu1)tmpdb; 
00193           somu4 -= (pixu4)ptu1[i-dlfX];
00194       }
00195       nbp--;
00196       for(  ; i<nc; i++){
00197           tmpdb = (double)somu4/nbp + 0.5;
00198           ptres[i] = (pixu1)tmpdb; 
00199           somu4 -= (pixu4)ptu1[i-dlfX];
00200           nbp--;  
00201       }
00202   }
00203 
00204   /* moyenne colonne */     
00205   ptu4 = des->tmpcolu4;
00206   for(i=0; i<nc; i++){
00207       /* recopie */
00208       for(j=0; j<nr; j++)
00209           ptu4[j] = (pixu4)imres->p[j][i];
00210       nbp = 0;
00211       somu4 = 0;
00212       for(j=0; j<dlfY; j++){
00213           somu4 += ptu4[j];
00214           nbp++;
00215       }
00216       for(j=0; j<dlfY; j++){
00217           somu4 += ptu4[j+dlfY];
00218           nbp++;
00219           tmpdb = (double)somu4/nbp + 0.5;
00220           imres->p[j][i] = (pixu1)tmpdb;  
00221       } 
00222       nbp++;
00223       for(  ; j<nr-dlfY; j++){
00224           somu4 += ptu4[j+dlfY];
00225           tmpdb = (double)somu4/nbp + 0.5;        
00226           imres->p[j][i] = (pixu1)tmpdb;  
00227           somu4 -= ptu4[j-dlfY];
00228       }
00229       nbp--;
00230       for(  ; j<nr; j++){
00231           tmpdb = (double)somu4/nbp + 0.5;        
00232           imres->p[j][i] = (pixu1)tmpdb;  
00233           somu4 -= ptu4[j-dlfY];
00234           nbp--;  
00235       }
00236   }
00237   return(0);
00238 }
00239 
00240 /* calcul (16 bit) */
00241 int moy2Du2_calc(moy2D_t *des, imau2 im0, imau2 *imres){
00242   pixu2 *ptu2, *ptres;
00243   int i, j, nc, nr, nbp, dlfX, dlfY;
00244   pixu4 tmpu4, somu4, *ptu4;
00245   double tmpdb;
00246   
00247   nc = im0.nc; 
00248   nr = im0.nr; 
00249   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00250   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00251  
00252   /* moyenne ligne */
00253   for(j=0; j<nr; j++){
00254       nbp = 0;
00255       somu4 = 0;
00256       ptu2 = im0.p[j];
00257       ptres = imres->p[j];
00258       for(i=0; i<dlfX; i++){
00259           somu4 += (pixu4)ptu2[i];
00260           nbp++;
00261       }
00262       for(i=0; i<dlfX; i++){
00263           somu4 += (pixu4)ptu2[i+dlfX];
00264           nbp++;
00265           tmpdb = (double)somu4/nbp + 0.5;
00266           ptres[i] = (pixu2)tmpdb; 
00267       } 
00268       nbp++;
00269       for(  ; i<nc-dlfX; i++){
00270           somu4 += (pixu4)ptu2[i+dlfX];
00271           tmpdb = (double)somu4/nbp + 0.5;
00272           ptres[i] = (pixu2)tmpdb; 
00273           somu4 -= (pixu4)ptu2[i-dlfX];
00274       }
00275       nbp--;
00276       for(  ; i<nc; i++){
00277           tmpdb = (double)somu4/nbp + 0.5;
00278           ptres[i] = (pixu2)tmpdb; 
00279           somu4 -= (pixu4)ptu2[i-dlfX];
00280           nbp--;  
00281       }
00282   }
00283 
00284   /* moyenne colonne */     
00285   ptu4 = des->tmpcolu4;
00286   for(i=0; i<nc; i++){
00287       /* recopie */
00288       for(j=0; j<nr; j++)
00289           ptu4[j] = (pixu4)imres->p[j][i];
00290       nbp = 0;
00291       somu4 = 0;
00292       for(j=0; j<dlfY; j++){
00293           somu4 += ptu4[j];
00294           nbp++;
00295       }
00296       for(j=0; j<dlfY; j++){
00297           somu4 += ptu4[j+dlfY];
00298           nbp++;
00299           tmpdb = (double)somu4/nbp + 0.5;
00300           imres->p[j][i] = (pixu2)tmpdb;  
00301       } 
00302       nbp++;
00303       for(  ; j<nr-dlfY; j++){
00304           somu4 += ptu4[j+dlfY];
00305           tmpdb = (double)somu4/nbp + 0.5;        
00306           imres->p[j][i] = (pixu2)tmpdb;  
00307           somu4 -= ptu4[j-dlfY];
00308       }
00309       nbp--;
00310       for(  ; j<nr; j++){
00311           tmpdb = (double)somu4/nbp + 0.5;        
00312           imres->p[j][i] = (pixu2)tmpdb;  
00313           somu4 -= ptu4[j-dlfY];
00314           nbp--;  
00315       }
00316   }
00317   return(0);
00318 }
00319 
00320 /* calcul (float) */
00321 int moy2Dfl_calc(moy2D_t *des, imafl im0, imafl *imres){
00322   pixfl *ptfl, *ptres;
00323   int i, j, nc, nr, nbp, dlfX, dlfY;
00324   pixdb  somdb, *ptdb;
00325   
00326   nc = im0.nc; 
00327   nr = im0.nr; 
00328   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00329   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00330  
00331   /* moyenne ligne */
00332   for(j=0; j<nr; j++){
00333       nbp = 0;
00334       somdb = 0.;
00335       ptfl = im0.p[j];
00336       ptres = imres->p[j];
00337       for(i=0; i<dlfX; i++){
00338           somdb += (pixdb)ptfl[i];
00339           nbp++;
00340       }
00341       for(i=0; i<dlfX; i++){
00342           somdb += (pixdb)ptfl[i+dlfX];
00343           nbp++;
00344           ptres[i] = (pixfl)somdb/nbp; 
00345       } 
00346       nbp++;
00347       for(  ; i<nc-dlfX; i++){
00348           somdb += (pixdb)ptfl[i+dlfX];
00349           ptres[i] = (pixfl)somdb/nbp; 
00350           somdb -= (pixdb)ptfl[i-dlfX];
00351       }
00352       nbp--;
00353       for(  ; i<nc; i++){
00354           ptres[i] = (pixfl)somdb/nbp; 
00355           somdb -= (pixdb)ptfl[i-dlfX];
00356           nbp--;  
00357       }
00358   }
00359 
00360   /* moyenne colonne */     
00361   ptdb = des->tmpcoldb;
00362   for(i=0; i<nc; i++){
00363       /* recopie */
00364       for(j=0; j<nr; j++)
00365           ptdb[j] = (pixdb)imres->p[j][i];
00366       nbp = 0;
00367       somdb = 0.;
00368       for(j=0; j<dlfY; j++){
00369           somdb += ptdb[j];
00370           nbp++;
00371       }
00372       for(j=0; j<dlfY; j++){
00373           somdb += ptdb[j+dlfY];
00374           nbp++;
00375           imres->p[j][i] = (pixfl)somdb/nbp;  
00376       } 
00377       nbp++;
00378       for(  ; j<nr-dlfY; j++){
00379           somdb += ptdb[j+dlfY];
00380           imres->p[j][i] = (pixfl)somdb/nbp;  
00381           somdb -= ptdb[j-dlfY];
00382       }
00383       nbp--;
00384       for(  ; j<nr; j++){
00385           imres->p[j][i] = (pixfl)somdb/nbp;  
00386           somdb -= ptdb[j-dlfY];
00387           nbp--;  
00388       }
00389   }
00390   return(0);
00391 }
00392 
00393 /* calcul (double) */
00394 int moy2Ddb_calc(moy2D_t *des, imadb im0, imadb *imres){
00395   pixdb *ptdb, *ptres;
00396   int i, j, nc, nr, nbp, dlfX, dlfY;
00397   pixdb  somdb;
00398   
00399   nc = im0.nc; 
00400   nr = im0.nr; 
00401   dlfX = des->dimX/2; /* demi largeur de fenetre en X */
00402   dlfY = des->dimY/2; /* demi largeur de fenetre en Y */
00403  
00404   /* moyenne ligne */
00405   for(j=0; j<nr; j++){
00406       nbp = 0;
00407       somdb = 0.;
00408       ptdb = im0.p[j];
00409       ptres = imres->p[j];
00410       for(i=0; i<dlfX; i++){
00411           somdb += ptdb[i];
00412           nbp++;
00413       }
00414       for(i=0; i<dlfX; i++){
00415           somdb += ptdb[i+dlfX];
00416           nbp++;
00417           ptres[i] = somdb/nbp; 
00418       } 
00419       nbp++;
00420       for(  ; i<nc-dlfX; i++){
00421           somdb += ptdb[i+dlfX];
00422           ptres[i] = somdb/nbp; 
00423           somdb -= ptdb[i-dlfX];
00424       }
00425       nbp--;
00426       for(  ; i<nc; i++){
00427           ptres[i] = (pixdb)somdb/nbp; 
00428           somdb -= ptdb[i-dlfX];
00429           nbp--;  
00430       }
00431   }
00432 
00433   /* moyenne colonne */     
00434   ptdb = des->tmpcoldb;
00435   for(i=0; i<nc; i++){
00436       /* recopie */
00437       for(j=0; j<nr; j++)
00438           ptdb[j] = imres->p[j][i];
00439       nbp = 0;
00440       somdb = 0.;
00441       for(j=0; j<dlfY; j++){
00442           somdb += ptdb[j];
00443           nbp++;
00444       }
00445       for(j=0; j<dlfY; j++){
00446           somdb += ptdb[j+dlfY];
00447           nbp++;
00448           imres->p[j][i] = somdb/nbp;  
00449       } 
00450       nbp++;
00451       for(  ; j<nr-dlfY; j++){
00452           somdb += ptdb[j+dlfY];
00453           imres->p[j][i] = somdb/nbp;  
00454           somdb -= ptdb[j-dlfY];
00455       }
00456       nbp--;
00457       for(  ; j<nr; j++){
00458           imres->p[j][i] = somdb/nbp;  
00459           somdb -= ptdb[j-dlfY];
00460           nbp--;  
00461       }
00462   }
00463   return(0);
00464 }
00465 

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