Changeset 1104 in Sophya for trunk/SophyaLib/NTools/dynccd.cc
- Timestamp:
- Jul 27, 2000, 7:30:57 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/dynccd.cc
r270 r1104 46 46 //-- 47 47 //++ 48 // DynCCD(int TypNoise=0, float MinADU=-9.e19, float MaxADU=9.e19, float Gain=1., float RONoise=0., float RefFond=0., floatRefSFond=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.); 49 49 // Creation d'un objet DynCCD ("typ" determine la methode de calcul du bruit) 50 50 // |Test verbatim 51 51 // 52 // void Set(int TypNoise=0, float MinADU=-9.e19, float MaxADU=9.e19, float Gain=1., float RONoise=0., float RefFond=0., floatRefSFond=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.); 53 53 // Modification des parametres de la dynamique 54 54 // void Print() 55 // float Noise(floatpixel) const55 // r_8 Noise(r_8 pixel) const 56 56 // Renvoie la valeur du bruit pour "pixel" en ADU. 57 57 //-- … … 62 62 63 63 /* --Methode-- */ 64 DynCCD::DynCCD(int typ, float min, float max, floatg,65 float ron, float rf, floatrfs)64 DynCCD::DynCCD(int_4 typ, r_8 min, r_8 max, r_8 g, 65 r_8 ron, r_8 rf, r_8 rfs) 66 66 { 67 67 if ( (typ >= kConstantNoise) && (typ <= kSqrtADUNoise) ) TypNoise = typ; … … 73 73 74 74 /* --Methode-- */ 75 void DynCCD::Set(int typ, float min, float max, floatg,76 float ron, float rf, floatrfs)75 void DynCCD::Set(int_4 typ, r_8 min, r_8 max, r_8 g, 76 r_8 ron, r_8 rf, r_8 rfs) 77 77 { 78 78 if ( (typ >= kConstantNoise) && (typ <= kSqrtADUNoise) ) TypNoise = typ; … … 93 93 94 94 /* --Methode-- */ 95 float DynCCD::Noise(floatpixel) const95 r_8 DynCCD::Noise(r_8 pixel) const 96 96 97 97 /* Cette fonction calcule la valeur du bruit pour pixel */ … … 108 108 109 109 { 110 floath,s,ronsq;111 floatfond;110 r_8 h,s,ronsq; 111 r_8 fond; 112 112 113 113 if ( (pixel > MaxADU) || (pixel < MinADU) ) return(0.); … … 122 122 ronsq = RONoise/Gain; ronsq *= ronsq; } 123 123 124 h = (pixel>fond) ? ( float)(pixel-fond) : 0.;124 h = (pixel>fond) ? (r_8)(pixel-fond) : 0.; 125 125 s = ronsq+h/Gain; 126 126 s = fsqrt(s); … … 161 161 /* Nouvelle-Fonction */ 162 162 template <class T> 163 Image<T> * NoiseImage(Image<T> const * pim, DynCCD const *dynccd)163 Image<T> NoiseImage(Image<T> const & pim, DynCCD const & dynccd) 164 164 165 165 /* Creation et Calcul d'une image de bruit a partir de l'image */ … … 168 168 169 169 { 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 } 170 r_8 h,s,ronsq; 171 r_8 fond, min,max; 172 int_4 k, npix; 173 r_8 minois, offnois; 174 175 npix = pim.XSize()*pim.YSize(); 176 Image<T> nois(pim.XSize(), pim.YSize()); 177 nois.SetOrg(pim.XOrg(), pim.YOrg()); 178 179 min = dynccd.MinADU; max = dynccd.MaxADU; 180 for(k=0; k<npix; k++) { 181 if ( (pim[k] <= max) && (pim[k] >= min) ) nois[k] = (T)1; 182 else nois[k] = 0; 183 } 184 251 185 252 186 return(nois); … … 258 192 void ImgAddNoise(Image<T>& img, DynCCD const& dyn) 259 193 { 260 T* p = img.ImagePtr(); 261 int nPix = img.XSize() * img.YSize(); 194 int_4 nPix = img.XSize() * img.YSize(); 262 195 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 345 202 346 203 … … 348 205 349 206 #pragma define_template NoiseImage<uint_2> 350 #pragma define_template NoiseImage<int_2>351 207 #pragma define_template NoiseImage<int_4> 352 208 #pragma define_template NoiseImage<r_4> 353 209 354 210 #pragma define_template ImgAddNoise<uint_2> 355 #pragma define_template ImgAddNoise<int_2>356 211 #pragma define_template ImgAddNoise<int_4> 357 212 #pragma define_template ImgAddNoise<r_4> … … 360 215 361 216 362 #if ( defined(ANSI_TEMPLATES) && !defined(__aCC__) )217 #if defined(ANSI_TEMPLATES) 363 218 template 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 *);365 219 template Image< int_4> * NoiseImage< int_4>(Image< int_4> const * , DynCCD const *); 366 220 template Image< r_4> * NoiseImage< r_4>(Image< r_4> const * , DynCCD const *); 367 221 368 222 template void ImgAddNoise<uint_2>(Image<uint_2>&, DynCCD const&); 369 template void ImgAddNoise< int_2>(Image< int_2>&, DynCCD const&);370 223 template void ImgAddNoise< int_4>(Image< int_4>&, DynCCD const&); 371 224 template void ImgAddNoise< r_4>(Image< r_4>&, DynCCD const&); … … 375 228 #if defined(__GNU_TEMPLATES__) 376 229 template Image<uint_2> * NoiseImage(Image<uint_2> const *, DynCCD const *); 377 template Image< int_2> * NoiseImage(Image< int_2> const *, DynCCD const *);378 230 template Image< int_4> * NoiseImage(Image< int_4> const *, DynCCD const *); 379 231 template Image< r_4> * NoiseImage(Image< r_4> const *, DynCCD const *); 380 232 381 233 template void ImgAddNoise(Image<uint_2>&, DynCCD const&); 382 template void ImgAddNoise(Image< int_2>&, DynCCD const&);383 234 template void ImgAddNoise(Image< int_4>&, DynCCD const&); 384 235 template void ImgAddNoise(Image< r_4>&, DynCCD const&);
Note:
See TracChangeset
for help on using the changeset viewer.