00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00041 #include "image.h"
00042 #include "proto2D.h"
00043 #include "radar.h"
00044 #include <stdlib.h>
00045 #include <fcntl.h>
00046 #include <limits.h>
00047
00048
00049
00050 double filt_lee_add(double amp0, double moyamp, double moycarre, double vbr, int* nbneg);
00051
00052
00067 param * lee_add_lect(lee_add_t *des, param *ptp, char *debq){
00068 char question[500];
00069
00070 sprintf(question, "%s fenetre d'estimation, nombre de colonnes (impaire)", debq);
00071 lec_param(question, ptp);
00072 des->dimX = atoi(ptp->rep);
00073 ptp = ptp->next;
00074
00075 sprintf(question, "%s fenetre d'estimation, nombre de lignes (impaire)", debq);
00076 lec_param(question, ptp);
00077 des->dimY = atoi(ptp->rep);
00078 ptp = ptp->next;
00079
00080 if( des->dimX%2 == 0 || des->dimY%2 == 0 || des->dimX<=0 || des->dimY<=0){
00081 printf("\n>> ERREUR lee_add_lect : dimensions incorrectes\n");
00082 exit(1);
00083 }
00084
00085 sprintf(question, "%s variance du bruit dans l'image initiale", debq);
00086 lec_param(question, ptp);
00087 des->vbr = (double)atof(ptp->rep);
00088 ptp = ptp->next;
00089
00090 return(ptp);
00091 }
00092
00093
00094
00106
00107 int lee_addu1_init(lee_add_t *des, imau1 im0, imau1 *imres){
00108
00109 imres->nc = im0.nc;
00110 imres->nr = im0.nr;
00111 sprintf(imres->nom, "%s(lee_add%dx%d)", im0.nom, des->dimX, des->dimY);
00112 alloc_imau1(imres);
00113 return(0);
00114 }
00115
00116
00117 int lee_addu2_init(lee_add_t *des, imau2 im0, imau2 *imres){
00118
00119 imres->nc = im0.nc;
00120 imres->nr = im0.nr;
00121 sprintf(imres->nom, "%s(lee_add%dx%d)", im0.nom, des->dimX, des->dimY);
00122 alloc_imau2(imres);
00123 return(0);
00124 }
00125
00126
00127 int lee_addfl_init(lee_add_t *des, imafl im0, imafl *imres){
00128
00129 imres->nc = im0.nc;
00130 imres->nr = im0.nr;
00131 sprintf(imres->nom, "%s(lee_add%dx%d)", im0.nom, des->dimX, des->dimY);
00132 alloc_imafl(imres);
00133 return(0);
00134 }
00135
00136
00137 int lee_adddb_init(lee_add_t *des, imadb im0, imadb *imres){
00138
00139 imres->nc = im0.nc;
00140 imres->nr = im0.nr;
00141 sprintf(imres->nom, "%s(lee_add%dx%d)", im0.nom, des->dimX, des->dimY);
00142 alloc_imadb(imres);
00143 return(0);
00144 }
00145
00146
00159
00160 int lee_addu1_calc(lee_add_t *des, imau1 im0, imau1 moyamp, imafl moycarre, imau1 *imres){
00161 int i, j, nbneg = 0;
00162 double resdb;
00163
00164 for(j=0; j<im0.nr; j++)
00165 for(i=0; i<im0.nc; i++){
00166 resdb = filt_lee_add((double)im0.p[j][i], (double)moyamp.p[j][i],
00167 (double)moycarre.p[j][i], des->vbr, &nbneg) + 0.5;
00168 if( resdb < 0 ){
00169 printf("\n ATT lee_addu1_calc : resultat negatif!\n");
00170 imres->p[j][i] = 0;
00171 }
00172 else if (resdb >= 256.){
00173 printf("\n ATT lee_addu1_calc : resultat superieur a 256\n");
00174 imres->p[j][i] = 255;
00175 }
00176 else
00177 imres->p[j][i] = (pixu1)resdb;
00178 }
00179 printf("\n ATT lee_addu1_calc : %d points tels que var_image < var_bruit\n", nbneg);
00180 return(0);
00181 }
00182
00183
00184 int lee_addu2_calc(lee_add_t *des, imau2 im0, imau2 moyamp, imafl moycarre, imau2 *imres){
00185 int i, j, nbneg = 0;
00186 double resdb;
00187
00188 for(j=0; j<im0.nr; j++)
00189 for(i=0; i<im0.nc; i++){
00190 resdb = filt_lee_add((double)im0.p[j][i], (double)moyamp.p[j][i],
00191 (double)moycarre.p[j][i], des->vbr, &nbneg) + 0.5;
00192 if( resdb < 0 ){
00193 printf("\n ATT lee_addu2_calc : resultat negatif!\n");
00194 imres->p[j][i] = 0;
00195 }
00196 else if (resdb >= USHRT_MAX+1){
00197 printf("\n ATT lee_addu2_calc : resultat superieur a %d\n", USHRT_MAX);
00198 imres->p[j][i] = USHRT_MAX;
00199 }
00200 else
00201 imres->p[j][i] = (pixu2)resdb;
00202 }
00203 printf("\n ATT lee_addu2_calc : %d points tels que var_image < var_bruit \n", nbneg);
00204 return(0);
00205 }
00206
00207
00208 int lee_addfl_calc(lee_add_t *des, imafl im0, imafl moyamp, imafl moycarre, imafl *imres){
00209 int i, j, nbneg = 0;
00210
00211 for(j=0; j<im0.nr; j++)
00212 for(i=0; i<im0.nc; i++)
00213 imres->p[j][i] = (pixfl)filt_lee_add((double)im0.p[j][i], (double)moyamp.p[j][i],
00214 (double)moycarre.p[j][i], des->vbr, &nbneg);
00215 printf("\n ATT lee_addfl_calc : %d points tels que var_image < var_bruit\n", nbneg);
00216 return(0);
00217 }
00218
00219
00220 int lee_adddb_calc(lee_add_t *des, imadb im0, imadb moyamp, imadb moycarre, imadb *imres){
00221 int i, j, nbneg = 0;
00222
00223 for(j=0; j<im0.nr; j++)
00224 for(i=0; i<im0.nc; i++)
00225 imres->p[j][i] = filt_lee_add((double)im0.p[j][i], (double)moyamp.p[j][i],
00226 (double)moycarre.p[j][i], des->vbr, &nbneg);
00227 printf("\n ATT lee_adddb_calc : %d points tels que var_image < var_bruit\n", nbneg);
00228 return(0);
00229 }
00230
00231
00232 double filt_lee_add(double amp0, double moyamp, double moycarre, double vbr, int* nbneg){
00233 double vim;
00234 double vte;
00235
00236 vim = moycarre - moyamp*moyamp;
00237 vte = vim - vbr;
00238 if(vte < 0){
00239
00240 *nbneg = *nbneg + 1;
00241 return(moyamp);
00242 }
00243 else
00244 return(moyamp + (amp0 - moyamp) * vte / vim);
00245 }
00246