00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00040 #include "image.h"
00041 #include "proto2D.h"
00042 #include <stdlib.h>
00043 #include <fcntl.h>
00044 #include <limits.h>
00045
00046
00047
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
00093 int moycarre2Du1_init(moycarre2D_t *des, imau1 im0, imafl *imres){
00094 int i;
00095
00096
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
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
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
00120 int moycarre2Du2_init(moycarre2D_t *des, imau2 im0, imafl *imres){
00121 int i;
00122
00123
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
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
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
00147 int moycarre2Dfl_init(moycarre2D_t *des, imafl im0, imafl *imres){
00148
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
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
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
00170 int moycarre2Ddb_init(moycarre2D_t *des, imadb im0, imadb *imres){
00171
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
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
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
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;
00215 dlfY = des->dimY/2;
00216
00217
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
00247 ptdb = des->tmpcol;
00248 for(i=0; i<nc; i++){
00249
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
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;
00309 dlfY = des->dimY/2;
00310
00311
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
00341 ptdb = des->tmpcol;
00342 for(i=0; i<nc; i++){
00343
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
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;
00401 dlfY = des->dimY/2;
00402
00403
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
00438 ptdb = des->tmpcol;
00439 for(i=0; i<nc; i++){
00440
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
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;
00479 dlfY = des->dimY/2;
00480
00481
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
00514 ptdb2 = des->tmpcol;
00515 for(i=0; i<nc; i++){
00516
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