llee_add.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 */
00041 #include "image.h"
00042 #include "proto2D.h"
00043 #include "radar.h"
00044 #include <stdlib.h>
00045 #include <fcntl.h>
00046 #include <limits.h> /* pour  USHRT_MAX ... */
00047 
00048 /* #include "radar_comp.h" */
00049 
00050 double filt_lee_add(double amp0, double moyamp, double moycarre, double vbr, int* nbneg);
00051 
00052 /* **********************  LECTURE DE PARAMETRES   *************************/
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 /* **********************  INITIALISATION  *****************************/
00106 /* initialisation (8 bit)*/
00107 int lee_addu1_init(lee_add_t *des, imau1 im0, imau1 *imres){
00108   /* image resultat */ 
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 /* initialisation (16 bit)*/
00117 int lee_addu2_init(lee_add_t *des, imau2 im0, imau2 *imres){
00118   /* image resultat */ 
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 /* initialisation (float)*/
00127 int lee_addfl_init(lee_add_t *des, imafl im0, imafl *imres){
00128   /* image resultat */ 
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 /* initialisation (double)*/
00137 int lee_adddb_init(lee_add_t *des, imadb im0, imadb *imres){
00138   /* image resultat */ 
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 /* *************************  CALCUL  ***************************/
00159 /* calcul (8 bit) */
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 /* calcul (16 bit) */
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 /* calcul (float) */
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 /* calcul (double) */
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 /* fonction : ******************************* */
00232 double filt_lee_add(double amp0, double moyamp, double moycarre, double vbr, int* nbneg){
00233   double  vim;  /* variance mesure (image bruite */
00234   double  vte;  /* variance de la texture (image non-bruitee) */ 
00235 
00236   vim = moycarre - moyamp*moyamp;   /* sigma2 = moycarre - mu^2 */
00237   vte = vim - vbr;
00238   if(vte < 0){
00239       /*  printf("\n ATT lee_addu2_calc : V_image=%f < V_bruit=%f\n", vim, vbr); */
00240       *nbneg = *nbneg + 1;
00241       return(moyamp);
00242   }
00243   else
00244       return(moyamp + (amp0 - moyamp) * vte / vim);
00245 } 
00246 

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