Changeset 1104 in Sophya for trunk/SophyaLib/NTools/dynccd.cc


Ignore:
Timestamp:
Jul 27, 2000, 7:30:57 PM (25 years ago)
Author:
ansari
Message:

Heritage classe Image<T> de TMatrix<T> Reza+CMV 27/7/2000

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/dynccd.cc

    r270 r1104  
    4646//--
    4747//++
    48 // DynCCD(int TypNoise=0, float MinADU=-9.e19, float MaxADU=9.e19, float Gain=1., float RONoise=0., float RefFond=0., float RefSFond=0.);
     48// DynCCD(int_4TypNoise=0, r_8 MinADU=-9.e19, r_8 MaxADU=9.e19, r_8 Gain=1., r_8 RONoise=0., r_8 RefFond=0., r_8 RefSFond=0.);
    4949//      Creation d'un objet DynCCD ("typ" determine la methode de calcul du bruit)
    5050//      |Test verbatim
    5151//
    52 // void Set(int TypNoise=0, float MinADU=-9.e19, float MaxADU=9.e19, float Gain=1., float RONoise=0., float RefFond=0., float RefSFond=0.);
     52// void Set(int_4TypNoise=0, r_8 MinADU=-9.e19, r_8 MaxADU=9.e19, r_8 Gain=1., r_8 RONoise=0., r_8 RefFond=0., r_8 RefSFond=0.);
    5353//      Modification des parametres de la dynamique
    5454// void Print()
    55 // float Noise(float pixel) const
     55// r_8 Noise(r_8 pixel) const
    5656//      Renvoie la valeur du bruit pour "pixel" en ADU.
    5757//--
     
    6262
    6363/* --Methode-- */
    64 DynCCD::DynCCD(int typ, float min, float max, float g,
    65                float ron, float rf, float rfs)
     64DynCCD::DynCCD(int_4 typ, r_8 min, r_8 max, r_8 g,
     65               r_8 ron, r_8 rf, r_8 rfs)
    6666{
    6767if ( (typ >= kConstantNoise) && (typ <= kSqrtADUNoise) )  TypNoise = typ;
     
    7373
    7474/* --Methode-- */
    75 void DynCCD::Set(int typ, float min, float max, float g,
    76                float ron, float rf, float rfs)
     75void DynCCD::Set(int_4 typ, r_8 min, r_8 max, r_8 g,
     76               r_8 ron, r_8 rf, r_8 rfs)
    7777{
    7878if ( (typ >= kConstantNoise) && (typ <= kSqrtADUNoise) )  TypNoise = typ;
     
    9393
    9494/* --Methode-- */
    95 float DynCCD::Noise(float pixel) const
     95r_8 DynCCD::Noise(r_8 pixel) const
    9696
    9797/* Cette fonction calcule la valeur du bruit pour pixel     */
     
    108108
    109109{
    110 float h,s,ronsq;
    111 float fond;
     110r_8 h,s,ronsq;
     111r_8 fond;
    112112
    113113if ( (pixel > MaxADU) || (pixel < MinADU) )   return(0.);
     
    122122  ronsq = RONoise/Gain;  ronsq *= ronsq; }
    123123
    124 h = (pixel>fond) ? (float)(pixel-fond) : 0.;
     124h = (pixel>fond) ? (r_8)(pixel-fond) : 0.;
    125125s = ronsq+h/Gain;
    126126s = fsqrt(s);
     
    161161/* Nouvelle-Fonction */
    162162template <class T>
    163 Image<T> * NoiseImage(Image<T> const * pim, DynCCD const * dynccd)
     163Image<T>  NoiseImage(Image<T> const & pim, DynCCD const & dynccd)
    164164
    165165/* Creation et Calcul d'une image de bruit a partir de l'image */
     
    168168
    169169{
    170 float h,s,ronsq;
    171 float fond, min,max;
    172 int i, npix;
    173 float minois, offnois;
    174 
    175 if (pim == NULL)  return(NULL);
    176 
    177 const T * pix = pim->ImagePtr();
    178 npix = pim->XSize()*pim->YSize();
    179 Image<T> * nois = new Image<T>(pim->XSize(), pim->YSize(), false);
    180 nois->SetOrg(pim->XOrg(), pim->YOrg());
    181 T * pno = nois->ImagePtr();
    182 
    183 min = dynccd->MinADU;   max = dynccd->MaxADU;
    184 
    185 
    186 switch (dynccd->TypNoise)
    187   {
    188   case kConstantNoise :
    189     for(i=0; i<npix; i++)
    190       {
    191       if ( (*pix <= max) && (*pix >= min) )  *pno = 1;
    192       else *pno = 0;
    193       pix++;   pno++;
    194       }
    195     break;
    196 
    197   case kSqrtADUNoise :
    198     for(i=0; i<npix; i++)
    199       {
    200       if ( (*pix <= max) && (*pix >= min) )  *pno = 1;
    201       else *pno = (T) fsqrt(fabsf((float)(*pix)));   
    202       pix++;   pno++;
    203       }
    204     break;
    205 
    206   case kPhotonNoise :
    207   case kSigFondNoise :
    208     if ( dynccd->TypNoise == kSigFondNoise)
    209       { fond = dynccd->RefFond;
    210       ronsq = dynccd->RefSFond * dynccd->RefSFond; }
    211     else
    212       { fond = 0;
    213       ronsq = dynccd->RONoise/dynccd->Gain;  ronsq *= ronsq; }
    214 
    215 // Calcul de minois / offnois pour obtenir un bruit correct malgre
    216 // les conversions (float) -> (entier)
    217 
    218     switch(pim->PixelType())
    219       {
    220       case kuint_2:
    221       case kint_2:
    222       case kint_4:
    223         minois = 1.001;
    224         offnois = 0.5;
    225         break;
    226       case kr_4:
    227       case kr_8:
    228         minois = 1.e-9;
    229         offnois = 0.;
    230         break;
    231       default:
    232         minois = 1.e-9;
    233         offnois = 0.;
    234         break;
    235       }
    236 
    237     for(i=0; i<npix; i++)
    238       {
    239       if ( (*pix <= max) && (*pix >= min) )
    240         {
    241         h = (*pix>fond) ? (float)(*pix)-fond : 0.;
    242         s = ronsq+h/dynccd->Gain;
    243         s = fsqrt(s)+offnois;
    244         *pno = (s > minois) ? (T)s : (T)minois;
    245         }
    246       else *pno = 0;
    247       pix++;   pno++;
    248       }
    249     break;
    250   }
     170r_8 h,s,ronsq;
     171r_8 fond, min,max;
     172int_4 k, npix;
     173r_8 minois, offnois;
     174
     175npix = pim.XSize()*pim.YSize();
     176Image<T> nois(pim.XSize(), pim.YSize());
     177nois.SetOrg(pim.XOrg(), pim.YOrg());
     178
     179min = dynccd.MinADU;   max = dynccd.MaxADU;
     180for(k=0; k<npix; k++)      {
     181  if ( (pim[k] <= max) && (pim[k] >= min) )  nois[k] = (T)1;
     182  else nois[k] = 0;
     183}
     184
    251185
    252186return(nois);
     
    258192void ImgAddNoise(Image<T>& img, DynCCD const& dyn)
    259193{
    260         T* p = img.ImagePtr();
    261         int nPix = img.XSize() * img.YSize();
     194  int_4 nPix = img.XSize() * img.YSize();
    262195       
    263         for (int i=0; i<nPix; i++, p++)
    264                 *p += (T) (dyn.Noise(*p)*NorRand());
    265 }
    266 
    267 
    268 
    269 /* Nouvelle-Fonction */
    270 RzImage * NoiseImage(RzImage const * pim, DynCCD const * dynccd)
    271 
    272 /* Creation et Calcul d'une image de bruit a partir de l'image */
    273 /* pim et de dynccd. Voir la methode DynCCD::Noise() pour la   */
    274 /* description du calcul                                       */
    275 {
    276 RzImage * nois = NULL;
    277 
    278 switch (pim->PixelType())
    279   {
    280   case kuint_2:
    281     {
    282     ImageU2 pix((RzImage&)(*pim));
    283     nois = NoiseImage(&pix, dynccd);
    284     break;
    285     }
    286   case kint_2:
    287     {
    288     ImageI2 pix((RzImage&)(*pim));
    289     nois = NoiseImage(&pix, dynccd);
    290     break;
    291     }
    292   case kint_4:
    293     {
    294     ImageI4 pix((RzImage&)(*pim));
    295     nois = NoiseImage(&pix, dynccd);
    296     break;
    297     }
    298   case kr_4:
    299     {
    300     ImageR4 pix((RzImage&)(*pim));
    301     nois = NoiseImage(&pix, dynccd);
    302     break;
    303     } 
    304   case kuint_4:
    305   case kr_8:
    306     cerr << "NoiseImage(RzImage, ...) Unsupported image type (kuint_4/kr_8) "
    307          << int(pim->PixelType()) << "\n" ;
    308     break;
    309   default:
    310     cerr << "NoiseImage(RzImage, ...) Unknown image type !! " << int(pim->PixelType()) << "\n" ;
    311     break;
    312   }   
    313 
    314 return(nois);
    315 }
    316 
    317 
    318 // ******** INSTANCES
    319 
    320 #if defined(__xlC) || defined(__aCC__)
    321 void instancetempdynccd(int n)
    322 {
    323 /* Cette fonction sert uniquement a forcer le compilo a instancier les
    324   classes/fonctions template   */
    325 
    326 ImageU2  iu2(n,n), *piu2;
    327 ImageI2  ii2(n,n), *pii2;
    328 ImageI4  ii4(n,n), *pii4;
    329 ImageR4  ir4(n,n), *pir4;
    330 DynCCD dyn(1,0.,65000., 4., 20.);
    331 
    332 piu2 = NoiseImage(&iu2, &dyn);
    333 pii2 = NoiseImage(&ii2, &dyn);
    334 pii4 = NoiseImage(&ii4, &dyn);
    335 pir4 = NoiseImage(&ir4, &dyn);
    336 
    337 ImgAddNoise(*piu2, dyn);
    338 ImgAddNoise(*pii2, dyn);
    339 ImgAddNoise(*pii4, dyn);
    340 ImgAddNoise(*pir4, dyn);
    341 
    342 return;
    343 }
    344 #endif
     196  for (int_4 i=0; i<nPix; i++)
     197    img[i] += (T) (dyn.Noise(img[i])*NorRand());
     198}
     199
     200
     201
    345202
    346203
     
    348205
    349206#pragma define_template NoiseImage<uint_2>
    350 #pragma define_template NoiseImage<int_2>
    351207#pragma define_template NoiseImage<int_4>
    352208#pragma define_template NoiseImage<r_4>
    353209
    354210#pragma define_template ImgAddNoise<uint_2>
    355 #pragma define_template ImgAddNoise<int_2>
    356211#pragma define_template ImgAddNoise<int_4>
    357212#pragma define_template ImgAddNoise<r_4>
     
    360215
    361216
    362 #if ( defined(ANSI_TEMPLATES) && !defined(__aCC__) )
     217#if defined(ANSI_TEMPLATES)
    363218template Image<uint_2> * NoiseImage<uint_2>(Image<uint_2> const * , DynCCD const *);
    364 template Image< int_2> * NoiseImage< int_2>(Image< int_2> const * , DynCCD const *);
    365219template Image< int_4> * NoiseImage< int_4>(Image< int_4> const * , DynCCD const *);
    366220template Image<   r_4> * NoiseImage<   r_4>(Image<   r_4> const * , DynCCD const *);
    367221
    368222template void ImgAddNoise<uint_2>(Image<uint_2>&, DynCCD const&);
    369 template void ImgAddNoise< int_2>(Image< int_2>&, DynCCD const&);
    370223template void ImgAddNoise< int_4>(Image< int_4>&, DynCCD const&);
    371224template void ImgAddNoise<   r_4>(Image<   r_4>&, DynCCD const&);
     
    375228#if defined(__GNU_TEMPLATES__)
    376229template Image<uint_2> * NoiseImage(Image<uint_2> const *, DynCCD const *);
    377 template Image< int_2> * NoiseImage(Image< int_2> const *, DynCCD const *);
    378230template Image< int_4> * NoiseImage(Image< int_4> const *, DynCCD const *);
    379231template Image<   r_4> * NoiseImage(Image<   r_4> const *, DynCCD const *);
    380232
    381233template void ImgAddNoise(Image<uint_2>&, DynCCD const&);
    382 template void ImgAddNoise(Image< int_2>&, DynCCD const&);
    383234template void ImgAddNoise(Image< int_4>&, DynCCD const&);
    384235template void ImgAddNoise(Image<   r_4>&, DynCCD const&);
Note: See TracChangeset for help on using the changeset viewer.