00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00037 #include "image.h"
00038 #include "proto2D.h"
00039 #include <stdlib.h>
00040 #include <fcntl.h>
00041
00042
00043
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
00089 int moy2Du1_init(moy2D_t *des, imau1 im0, imau1 *imres){
00090
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
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
00104 int moy2Du2_init(moy2D_t *des, imau2 im0, imau2 *imres){
00105
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
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
00119 int moy2Dfl_init(moy2D_t *des, imafl im0, imafl *imres){
00120
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
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
00134 int moy2Ddb_init(moy2D_t *des, imadb im0, imadb *imres){
00135
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
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
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;
00170 dlfY = des->dimY/2;
00171
00172
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
00205 ptu4 = des->tmpcolu4;
00206 for(i=0; i<nc; i++){
00207
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
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;
00250 dlfY = des->dimY/2;
00251
00252
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
00285 ptu4 = des->tmpcolu4;
00286 for(i=0; i<nc; i++){
00287
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
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;
00329 dlfY = des->dimY/2;
00330
00331
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
00361 ptdb = des->tmpcoldb;
00362 for(i=0; i<nc; i++){
00363
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
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;
00402 dlfY = des->dimY/2;
00403
00404
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
00434 ptdb = des->tmpcoldb;
00435 for(i=0; i<nc; i++){
00436
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