source: Sophya/trunk/SophyaLib/NTools/cimage.cc@ 634

Last change on this file since 634 was 490, checked in by ansari, 26 years ago

Merge avec PEIDA++ (~V 3.8) et nettoyage pour nouveau PPersist Reza+cmv 21/10/99

File size: 64.3 KB
RevLine 
[220]1// Classes image typee
2// E.Aubourg , E. Lesquoy 01-03/95
3// Modifs R. Ansari 04/95
4
5// LAL (Orsay) / IN2P3-CNRS DAPNIA/SPP (Saclay) / CEA
6
[490]7// $Id: cimage.cc,v 1.5 1999-10-21 15:25:42 ansari Exp $
[220]8
9
[244]10#include "machdefs.h"
[220]11#include <string.h>
12#include <stdio.h>
13
14#include "perrors.h"
15#include "cimage.h"
16#include "fct1dfit.h"
17#include "histos.h"
18#include "nbconst.h"
19#include "utils.h"
20
21/* .............. Classe Image<T> ............... */
22
23//++
24// Class Image<T>
25// Lib Images++
26// include cimage.h
27//
28//
29// Classe descendant (heritier) de la classe *RzImage*, permettant
30// l'instantiation d'objets image avec un typage fort (entier, reel, ...)
31//
32// Des objets de type "Image<uint_1>, Image<uint_2>, Image<int_2>, Image<int_4>"
33// (entier) et "Image<r_4>" (flottant) peuvent etre crees.
34// Des typedef (*ImageU1*, *ImageU2*, *ImageI2*, *ImageI4*, *ImageR4*)
35// facilite l'utilisation de ces classes.
36//--
37//++
38// Links Parents
39// RzImage
40//--
41//++
42// Links Descendants
43// FitsImage<T>
44//--
45//++
46// Links Voir aussi
47// DVList
48//--
49
50//++
51// Titre Constructeurs
52//--
53
54//++
55// Image<T>(int sizx, sizy, int zero)
56// Creation d'une image de type "T", de taille "sizx*sizy" pixels.
57// Si "zero" non nul, tous les pixels de l'image sont mis a zero.
58// Image<T>(char* flnm)
59// Cree une image a partir du fichier "flnm". Celui-ci doit etre
60// au format "PPF" et cree par la methode "Save() ou "Write()".
61//--
62
63template <class T>
64Image<T>::Image(int sizx, int sizy, int zero)
65: RzImage(DataType((T)0), sizx, sizy), imagePtr( (T*) voidP )
66{
67 if (zero) Zero();
68 END_CONSTRUCTOR
69}
70
71/* --Methode-- */
72template <class T>
73Image<T>::Image()
74: RzImage(DataType((T)0)), imagePtr(0)
75{
76 END_CONSTRUCTOR
77}
78
79
80/* --Methode-- */
81template <class T>
82void Image<T>::Allocate(int sizx, int sizy, int zero, ImgVectP* pvpsh)
83{
84 RzImage::Allocate(DataType((T)0), sizx, sizy, pvpsh);
85 imagePtr = (T*) voidP;
86 if (!imagePtr) THROW(allocationErr);
87 if (zero) Zero();
88}
89
90template <class T>
91void Image<T>::SetPixels(int szx, int szy, T* pim)
92{
93 RzImage::SetPixels(DataType((T)0), szx, szy, pim);
94 imagePtr = pim;
95}
96
97/* --Methode-- */
98template <class T>
99Image<T>::~Image()
100{}
101
102
103//++
104// Image<T>(const Image<T>& src, int sharePixels)
105// Constructeur par copie. Fabrique une image identique a l'image "src".
106// Si "sharePixels" est non nul, le tableau des pixels est commun
107// aux deux images ("src" et celle creee)
108// Image<T>(const Image<T>& src, int orgx, int orgy, int sizx, int sizy)
109// Construit une image de type "T", a partir des pixels de l'image
110// "src" (du meme type), de taille "sizx*sizy" et de l'origine
111// "orgx, orgy" dans "src". Si "orgx" et/ou "orgy" sont negatifs,
112// la taille de la nouvelle image est automatiquement calculee
113// pour contenir toute l'image source a partir de l'origine specifiee.
114// Genere l'exception "sizeMismatchErr" en cas d'incompatibilite
115// taille/origine.
116//--
117
118/* --Methode-- */
119template <class T>
120Image<T>::Image(const Image<T>& src, int sharePixels)
121: RzImage(src, sharePixels)
122{
123 imagePtr = (T*) voidP;
124 if (!imagePtr) THROW(allocationErr);
125 END_CONSTRUCTOR
126}
127
128/* --Methode-- */
129template <class T>
130Image<T>::Image(const Image<T>& src, int orgx, int orgy, int sizx, int sizy)
131:RzImage()
132{
133 // A optimiser...
134 if (sizx < 0) sizx = src.XSize()-orgx;
135 if (sizy < 0) sizy = src.YSize()-orgy;
136 if (orgx+sizx > src.XSize() || orgy+sizy > src.YSize())
137 THROW(sizeMismatchErr);
138
139 Allocate(sizx, sizy);
140 for (int i=0; i<sizx; i++)
141 for (int j=0; j<sizy; j++)
142 (*this)(i,j) = src(i+orgx, j+orgy);
143
144 SetOrg(src.XOrg()+orgx, src.YOrg()+orgy);
145 SetPxSize(src.XPxSize(), src.YPxSize());
146 END_CONSTRUCTOR
147}
148
149//++
150// LaTeX Pour contrer un mauvais espacement des paragraphes de LaTeX
151// \newpage
152//--
153//++
154// Image<T>()
155// Creation d'une image de type "T" sans allocation du tableau des pixels.
156// Le tableau des pixels devra etre ensuite alloue par la methode "Allocate()"
157//--
158
159//++
160// Image<T>(const RzImage& rzimg)
161// Permet de construire une image typee a partir d'une RzImage ("rzimg")
162// Le tableau des pixels est commun aux deux images.
163// Les pixels de l'image "rzimg" doivent etre du type "T", sinon
164// l'exception "typeMismatchErr" est generee.
165//--
166/* --Methode-- */
167template <class T>
168Image<T>::Image(const RzImage& rzimg)
169:RzImage(rzimg,1)
170{
171
172 if (rzimg.PixelType() != DataType((T)0))
173 THROW(typeMismatchErr);
174 imagePtr = (T*) voidP;
175 if (!imagePtr) THROW(allocationErr);
176
177 END_CONSTRUCTOR
178}
179
180//++
181// void Allocate(int sizx, int sizy, int zero=1, ImgVectP* pvpsh=NULL)
182// Alloue le tableau des pixels.
183//--
184//++
185// ~Image<T>
186// Destructeur. supprime le tableau des pixels en memoire si celui-ci
187// n'est pas utilise par d'autres objets image.
188//--
189
190/* --Methode-- */
191template <class T>
192Image<T>::Image(char *flnm)
193:RzImage(flnm)
194{
195 imagePtr = (T*) voidP;
196 if (!imagePtr) THROW(allocationErr);
197
198 END_CONSTRUCTOR
199}
200
201
202/* --Methode-- */
203template <class T>
204void Image<T>::ReadSelf(PInPersist& s)
205{
206 RzImage::ReadSelf(s);
207 imagePtr = (T*) voidP;
208}
209
210//++
211// Titre Operateurs
212// Un grand nombre des operations pouvant etre effectuees sur un
213// tableau de nombre ont ete defini pour les objets "Image<T>"
214// Dans les operations faisant intervenir deux images, l'exception
215// "sizeMismatchErr" est generee si les tailles (en X ou en Y) des
216// deux images ne sont pas identiques.
217//--
218
219//++
220// Image<T>& operator= (const Image<T>& rhs)
221// Copie le contenu (valeurs des pixels) de l'image "rhs".
222// Si l'image destination (membre gauche de =) n'a pas son
223// tableau de pixels alloue, celui-ci est cree a une taille
224// identique a celle de "rhs"
225// Image<T>& operator= (T val)
226// Met tous les pixels de l'image a la valeur "val"
227//--
228
229/* --Methode-- */
230template <class T>
231Image<T>& Image<T>::operator = (const Image<T>& src)
232{
233 if (imagePtr) {
234 if (siz_x != src.siz_x || siz_y != src.siz_y)
235 THROW(sizeMismatchErr);
236 } else
237 Allocate(src.siz_x, src.siz_y);
238
239 (RzImage)(*this) = (RzImage)src;
240 return *this;
241}
242
243/* --Methode-- */
244template <class T>
245Image<T>& Image<T>::operator = (T a)
246{
247 T* pDst = imagePtr;
248 int nPix = siz_x * siz_y;
249
250 for (int i=0; i<nPix; i++, pDst++)
251 *pDst = a;
252
253 return *this;
254}
255
256/* --Methode-- */
257template <class T>
258void Image<T>::Zero()
259{
260 memset(imagePtr,0,siz_x * siz_y * sizeof(T));
261}
262
263/* --Methode-- */
264#if 0 // a la mort de RzImage
265template <class T>
266void Image<T>::Clear()
267{
268 if (imagePtr) {
269 delete[] imagePtr;
270 imagePtr = 0;
271 siz_x = 0;
272 siz_y = 0;
273 }
274}
275#endif
276
277/* --Methode-- */
278template <class T>
279Image<T>& Image<T>::operator+= (Image<T> const& a)
280{
281 if (siz_x != a.siz_x || siz_y != a.siz_y)
282 THROW(sizeMismatchErr);
283 T* pSrc = a.imagePtr;
284 T* pDst = imagePtr;
285 int nPix = siz_x * siz_y;
286
287 for (int i=0; i<nPix; i++, pSrc++, pDst++)
288 *pDst = PutInRange((double)*pSrc + (double)*pDst, *pDst);
289
290 return *this;
291}
292
293
294/* --Methode-- */
295template <class T>
296Image<T>& Image<T>::operator-= (Image<T> const& a)
297{
298 if (siz_x != a.siz_x || siz_y != a.siz_y)
299 THROW(sizeMismatchErr);
300 T* pSrc = a.imagePtr;
301 T* pDst = imagePtr;
302 int nPix = siz_x * siz_y;
303
304 for (int i=0; i<nPix; i++, pSrc++, pDst++)
305 *pDst = PutInRange((double)*pDst - (double)*pSrc, *pDst);
306
307 return *this;
308}
309
310/* --Methode-- */
311template <class T>
312Image<T>& Image<T>::operator*= (Image<T> const& a)
313{
314 if (siz_x != a.siz_x || siz_y != a.siz_y)
315 THROW(sizeMismatchErr);
316 T* pSrc = a.imagePtr;
317 T* pDst = imagePtr;
318 int nPix = siz_x * siz_y;
319
320 for (int i=0; i<nPix; i++, pSrc++, pDst++)
321 *pDst = PutInRange((double)*pDst * (double)*pSrc, *pDst);
322
323 return *this;
324}
325
326/* --Methode-- */
327template <class T>
328Image<T>& Image<T>::operator/= (Image<T> const& a)
329{
330 if (siz_x != a.siz_x || siz_y != a.siz_y)
331 THROW(sizeMismatchErr);
332 T* pSrc = a.imagePtr;
333 T* pDst = imagePtr;
334 int nPix = siz_x * siz_y;
335
336 for (int i=0; i<nPix; i++, pSrc++, pDst++)
337 if (*pSrc)
338 *pDst = PutInRange((double)*pDst / (double)*pSrc, *pDst);
339 else *pDst = (T) MaxRange(*pDst);
340
341 return *this;
342}
343
344//++
345// Image<T>& operator += -= *= /= (Image<T> const& rhs)
346// Ajoute (+=), soustrait(-=), multiplie(*=), divise(/=) les valeurs des pixels
347// de l'image a gauche de l'operateur par les pixels correspondants
348// de l'image a droite de l'operateur ("rhs")
349// Image<T>& operator += -= *= /= (double crhs)
350// Ajoute (+=), soustrait(-=), multiplie(*=), divise(/=) les valeurs des pixels
351// de l'image a gauche de l'operateur par la constante "crhs"
352//--
353
354
355/* --Methode-- */
356template <class T>
357Image<T>& Image<T>::operator+= (double a)
358{
359 T* pDst = imagePtr;
360 int nPix = siz_x * siz_y;
361
362 for (int i=0; i<nPix; i++, pDst++)
363 *pDst = PutInRange((double)*pDst + a, *pDst);
364
365 return *this;
366}
367
368/* --Methode-- */
369template <class T>
370Image<T>& Image<T>::operator-= (double a)
371{
372 T* pDst = imagePtr;
373 int nPix = siz_x * siz_y;
374
375 for (int i=0; i<nPix; i++, pDst++)
376 *pDst = PutInRange((double)*pDst - a, *pDst);
377
378 return *this;
379}
380
381/* --Methode-- */
382template <class T>
383Image<T>& Image<T>::operator*= (double a)
384{
385 T* pDst = imagePtr;
386 int nPix = siz_x * siz_y;
387
388 for (int i=0; i<nPix; i++, pDst++)
389 *pDst = PutInRange((double)*pDst * a, *pDst);
390
391 return *this;
392}
393
394
395/* --Methode-- */
396template <class T>
397Image<T>& Image<T>::operator/= (double a)
398{
399 T* pDst = imagePtr;
400 int nPix = siz_x * siz_y;
401
402 for (int i=0; i<nPix; i++, pDst++)
403 *pDst = PutInRange((double)*pDst / a, *pDst);
404
405 return *this;
406}
407
408
409
410//++
411// Image<T> operator + - * / (Image<T> const& a, Image<T> const& b)
412// Ajoute, soustrait, multiplie, divise les pixels des deux
413// images "a" et "b" et l'affecte a gauche de l'operateur egal.
414// operator + - * / (Image<T> const& a, double cb)
415// Ajoute, soustrait, multiplie, divise le contenu de l'image "a"
416// par la constante "cb" et l'affecte a l'image a gauche de l'operateur = .
417//
418// Il est preferable d'utiliser dans la mesure du possible, les
419// operateurs "+=", "-=", "*=", "/=" afin d'eviter des copies
420// inutiles.
421//
422// *Exemples:*
423//| // Creation des images
424//| ImageR4 ai(200,300), bi, ci;
425//| // Tous les pixels a 238.5
426//| ai = 238.5;
427//| // Image bi meme taille, meme valeurs de pixels que ai
428//| bi = ai;
429//| // On soustrait 13.2 a tous les pixels de ai
430//| ai -= 13.2;
431//| // Je divise bi par ai (pixel par pixel) qu'on affecte a bi
432//| bi /= ai;
433//| // On somme ai et bi (pixel par pixel) qu'on affecte a ci
434//| ci = ai + bi;
435//--
436
437
438/* --Methode-- */
439template <class T>
440Image<T> Image<T>::WhereNonZero()
441{
442 Image<T> c(*this);
443 for (int i=0; i<XSize(); i++)
444 for (int j=0; j<YSize(); j++)
445 c(i,j) = c(i,j) ? 1 : 0;
446 return c;
447}
448
449//++
450// void PrintImage(ostream& os) const
451// Envoie le contenu de l'image (formatte, texte) sur le
452// flot (stream) de sortie "os".
453// Attention: Ca peut faire beaucoup de ligne !
454// void PrintImage() const
455// Appel a PrintImage(cout) - Sortie sur cout .
456//--
457
458
459/* --Methode-- */
460template <class T>
461void Image<T>::PrintImage(ostream& os) const
462// Impression de tout le contenu de l'image
463{
464#define PrPvLn 10
465#define PrSize 6
466int i,j,k,ido,ideb,ifin;
467int siz_x,siz_y;
468
469siz_x= XSize();
470siz_y= YSize();
471
472os << " Image::PrintImage: type pixel " ;
473os << DataName(dataType) ;
474os << ", NbPix=("<<siz_x<<","<<siz_y<<") \n";
475
476
477/* segmentation avec des lignes de PrPvLn valeurs */
478
479ido = (siz_x-1) / PrPvLn + 1;
480
481char buff[256];
482
483for(k=0;k<ido;k++)
484 {
485 ideb = k*PrPvLn;
486 ifin = ideb + PrPvLn;
487 if ( ifin >siz_x ) ifin = siz_x ;
488 sprintf(buff, " ---- colonnes %d a %d ----\n",ideb,ifin-1);
489 os << buff ;
490 for(j=0; j<siz_y; j++)
491 {
492 sprintf(buff, "%3d - ",j);
493 os << buff;
494 for (i=ideb; i<ifin; i++)
495 {
496 os.width(PrSize);
497// les uint_1 sont traites comme characteres par les ostream ...
498 if (PixelType() == kuint_1) os << ((int)((*this)(i,j))) << " ";
499 else os << (*this)(i,j) << " ";
500 }
501 os << endl;
502 }
503 }
504
505 return;
506}
507
508
509//++
510// Titre Acces aux pixels
511//--
512//++
513// T& operator() (int x, int y)
514// Acces au pixel "(x,y)" de l'image (lecture/ecriture)
515// T& operator[] (int i)
516// Acces au pixel numero "i" de l'image (lecture/ecriture)
517//
518//| ImageU2 img(100,100);
519//| int i,j,k;
520//| // Remplissage de la moitie de l'image
521//| for(k=0; k<100*50; k++) img[k] = k%500;
522//| img(50, 10); // Valeur du pixel (50, 10)
523//
524// T* ImagePtr()
525// Renvoie un pointeur du type "T (uint_2, r_4, ...)" sur le
526// tableau des pixels de l'image. A n'utiliser que si un reelle
527// optimisation de l'acces aux pixels peut etre effectuee.
528//--
529
530
531
532//++
533// Titre Traitements simples
534//--
535//++
536// int CheckDyn(double min=-9.e19, double max=9.e19)
537// Cette methode retourne le nombre de pixels hors dynamique "( <min ou >max )"
538// Met a jour les donnees membres "min/maxPix nbNul/Sat".
539// Calcule aussi la moyenne et le sigma des pixels -> "moyPix, sigPix"
540// Implementation plus efficace de la methode "RzImage::CheckDyn()"
541//--
542
543/* --Methode-- */
544template <class T>
545int Image<T>::CheckDyn(double min, double max)
546
547/* Cette methode retourne le nombre de pixels hors dynamique */
548/* ds le pave ( <min ou >max ) */
549/* Met a jour la structure image Min/MaxPix nbNul/Sat */
550/* Calcule aussi la moyenne et le sigma des pixels, met a jour */
551/* moypix et sigpix dans la structure */
552
553{
554T pixv=0;
555double dv;
556
557T minadu = PutInRange(min, pixv);
558T maxadu = PutInRange(max, pixv);
559T minpix = PutInRange(maxadu+1, pixv);
560T maxpix = PutInRange(minadu-1, pixv);
561
562double m = 0.;
563double s = 0.;
564int n9 = 0;
565int n0 = 0;
566int n = XSize()*YSize();
567for(int i=0; i<n; i++)
568 {
569 pixv = imagePtr[i];
570 if (pixv <= maxadu && pixv >= minadu)
571 {
572 if (pixv < minpix) minpix = pixv;
573 else if (pixv > maxpix) maxpix = pixv;
574 dv = (double)pixv;
575 m += dv; s += (dv*dv);
576 }
577 else
578 {
579 if (pixv > maxadu) n9++;
580 if (pixv < minadu) n0++;
581 }
582 }
583
584nbNul = n0;
585nbSat = n9;
586minPix = minpix;
587maxPix = maxpix;
588
589n -= (n0+n9);
590if (n > 0)
591 { dv = (double)n; m /= dv; s = s/dv - m*m;
592 if (s>0.) s = sqrt(s); else s = 0.;
593 moyPix = m; sigPix = s; }
594else { moyPix = 0.; sigPix = -1.; }
595
596return(n0+n9);
597}
598
599//++
600// SeuilBas(double seuil, double val)
601// Met les pixels en dessous du "seuil" (< seuil) a la valeur "val".
602// SeuilBas(double seuil)
603// Met les pixels en dessous du "seuil" (< seuil) a zero
604// SeuilHaut(double seuil, double val)
605// Met les pixels au dessus du "seuil" (> seuil) a la valeur "val".
606// SeuilHaut(double seuil)
607// Met les pixels au dessus du "seuil" (> seuil) a zero
608//--
609
610/* --Methode-- */
611template <class T>
612void Image<T>::SeuilBas(double seuil, double val)
613
614/* Met a une valeur definie tous les pixels */
615/* en dessous du seuil */
616
617{
618 if (!ImagePtr()) THROW(nullPtrErr);
619 T* PtPix=ImagePtr();
620 int nPix=XSize()*YSize();
621 for(int i=0 ; i<nPix;i++,PtPix++) {if(*PtPix < (T) seuil) *PtPix = (T) val;};
622}
623
624/* --Methode-- */
625template <class T>
626void Image<T>::SeuilHaut(double seuil, double val)
627
628/* Met a une valeur definie tous les pixels */
629/* en dessus du seuil */
630
631{
632 if (!ImagePtr()) THROW(nullPtrErr);
633 T* PtPix=ImagePtr();
634 int nPix=XSize()*YSize();
635 for(int i=0 ; i<nPix;i++,PtPix++) {if(*PtPix > (T) seuil) *PtPix = (T) val;};
636}
637
638/* --Methode-- */
639template <class T>
640void Image<T>::SeuilBas(double seuil)
641{
642 SeuilBas(seuil,seuil);
643}
644
645/* --Methode-- */
646template <class T>
647void Image<T>::SeuilHaut(double seuil)
648{
649 SeuilHaut(seuil,seuil);
650}
651
652/* --Methode-- (cmv 23/09/96) */
653template <class T>
654//++
655void Image<T>::HBinInt(int& nbin,float& xmin,float& xmax)
656//
657// Valeur pour avoir un bin entier quand on fait un
658// histogramme 1D des pixels (pour les images entieres).
659//--
660{
661if( PixelType()<kuint_2 || PixelType()>kint_4 ) return;
662double binw = (xmax-xmin)/nbin;
663binw = (double) ( (int)(binw+0.5) );
664if( binw <= 0. ) binw = 1.;
665xmin = (float) ( (int) xmin );
666xmax = (float) ( (int) (xmax + binw) );
667nbin = (int)( (xmax-xmin)/binw + 0.1 );
668}
669
670/* --Methode-- (cmv 23/09/96) */
671template <class T>
672//++
673int Image<T>::EstimeFdSg(float& xbmax,float& sgbmax
674 ,float nbsig,float frac,float lowbad,float highbad,int deb)
675//
676// Pour donner une estimation du fond de ciel et du sigma ciel.
677// Il est conseille de faire ceci sur une image partielle.
678// Une premiere estimation du fond et du sigma est faite en nettoyant
679// iterativement (cf MoySigmaIter).
680// Puis un histogramme est rempli et rebinne jusqu'a ce que son maximum
681// soit statistiquement significatif. Le fond et le sigma sont ensuite
682// calcules par les methodes `FitMax' et `EstimeWidthS' de la classe Histo.
683//| xbmax = position du maximum
684//| sgbmax = valeur du sigma
685//| nbsig = dimensionnement de l'histo de depart en nombre
686//| de sigma autour de la valeur maximum
687//| frac = valeur maximum principale / maximum secondaire a partir
688//| de laquelle on considere qu'elle a une signification
689//| statistique.
690//| lowbad,highbad = dynamique utile de l'image traitee
691//| deb = niveau de debug
692//| Return : 0 = OK, -1 = echec MoySigmaIter, -2 = echec FitMax,
693//| -3 = echec FindWidth
694//--
695{
696T pixv=0;
697T minadu = PutInRange((double) lowbad , pixv);
698T maxadu = PutInRange((double) highbad, pixv);
699bool testl = (lowbad<highbad) ? true : false;
700lowbad = (float) minadu; highbad = (float) maxadu;
701
702if(deb<0) deb=0;
703int envd = 0;
704GetIntEnv("PDEBUG_FOND", envd);
705if (deb < envd) deb = envd;
706
707// moyenne et sigma bruts (iteratifs)
708int rc;
709float fd,sg;
710rc = MoySigmaIter(fd,sg,lowbad,highbad,1,5,0.1,3.5,deb-1);
711if(deb>0) cout<<"EstimeFdSg: MoySigmaIter rc="<<rc<<" fd="<<fd<<" sg="<<sg<<endl;
712if(rc<=0) return -1;
713
714// remplissage histogramme avec beaucoup de bins
715int nbin;
716float xmin,xmax;
717xmin = fd - nbsig*sg; if(testl && xmin<lowbad ) xmin = lowbad;
718xmax = fd + nbsig*sg; if(testl && xmax>highbad) xmax = highbad;
719nbin = XSize()*YSize()/20; if(nbin>2000) nbin=2000;
720Histo H(xmin,xmax,nbin);
721for(int i=0;i<XSize()*YSize();i++) H.Add((float) (*this)[i],1.);
722
723// redimensionnement de l'histo pour avoir une bonne signification stat.
724for(;;) {
725 float max1,max2;
726 int imax1,imax2;
727 rc = H.MaxiLocal(max1,imax1,max2,imax2);
728 float rap = 1.;
729 if( max1 != 0. ) rap = max2/max1;
730 // if(nbin<100) H.Print(80);
731 if(deb>1)
732 cout<<"nbin="<<nbin
733 <<" maxloc="<<rc
734 <<" maxi="<<max1<<" imax="<<imax1<<" xmax="<<H.BinCenter(imax1)
735 <<" maxn="<<max2<<" imaxn="<<imax2<<" xmaxn="<<H.BinCenter(imax2)
736 <<" -> "<<rap<<endl;
737 if( rap<frac || nbin<=10 ) break;
738 nbin = (int)(nbin/1.5);
739 H.HRebin(nbin);
740}
741if(deb>1) { if(nbin<250) H.Print(80); else H.Print(80,-1.,1.,-1);}
742
743TRY {
744 xbmax = H.FitMax(2,0.5f,deb-2);
745 if(deb>1) cout<<"H.FitMax = "<<xbmax<<endl;
746} CATCHALL {
747 if(deb) cout<< "Echec H.FitMax"<< endl;
748 return(-2);
749} ENDTRY
750
751TRY {
752 float sdroit = -2.;
753 H.EstimeWidthS(0.5f,sgbmax,sdroit);
754 if(sgbmax<=0.) sgbmax = H.FindWidth(0.5f,deb-2);
755 sgbmax /= 2.36;
756 if(deb>1) cout<<"H.FindWidth = "<<sgbmax<<" (droit="<<sdroit<<")"<<endl;
757} CATCHALL {
758 cout<< "Echec H.FindWidth"<< endl;
759 return(-3);
760} ENDTRY
761
762return 0;
763}
764
765/* --Methode-- (cmv 23/09/96) */
766template <class T>
767//++
768float Image<T>::FondCiel(int nbin,float bin_low,float bin_high
769 ,int degre,float frac,int modu,int deb)
770//
771// Calcul du fond de ciel:
772// Remplissage d'un histogramme avec le contenu des pixels du pave,
773// recherche du bin contenant le maximum,
774// recheche des limites a frac% de chaque cote du maximum
775// et fit d'un polynome du 2sd ou 3ieme degre dans cette zone.
776//| Input:
777//| nbin,bin_low,bin_high : definition de l'histogramme
778//| degre : degre du fit (2 ou 3)
779//| frac : definition de la zone de fit a frac% du maximum
780//| modu : on prend 1 px sur modu
781//| deb : debug flag
782//| Output: renvoie le maximum de l'histogramme (fond de ciel)
783//| et update le membre protected fond (si succes)
784//--
785{
786T pixv;
787
788if(modu<=0) modu = 1;
789if(frac<=0.) frac = 0.5;
790if(degre<2 || degre>3) degre = 2;
791if(deb>0)
792 printf("Image::FondCiel: nbin=%d dyn=%g,%g deg=%d frac=%g modu=%d\n"
793 ,nbin,bin_low,bin_high,degre,frac,modu);
794if(nbin<=degre) THROW(inconsistentErr);
795
796TRY {
797
798 Histo tab(bin_low,bin_high,nbin);
799 double sum = 0.;
800 volatile int n = 0, nsum = 0;
801 for(int i=0;i<XSize()*YSize();i++) {
802 n++;
803 if( n%modu != 0 ) continue;
804 pixv = imagePtr[i];
805 tab.Add( (float) pixv );
806 sum += (double) pixv;
807 nsum++;
808 }
809 if(deb>1) { int im = tab.IMax();
810 tab.Print(80,1.,-1.,0,im-50,im+50); }
811
812 float xf = 0.;
813 // tout dans moins de degre bins
814 if( tab.BinNonNul() <= degre ) {
815 if(nsum<=0) THROW(inconsistentErr);
816 xf = sum / (double) nsum;
817 if(deb>0) printf("%d bins <= %d -> Succes Mean = %g\n"
818 ,tab.BinNonNul(),degre,xf);
819 fond = xf;
820 RETURN(xf);
821 }
822
823 TRY {
824 xf = tab.FitMax(degre,frac,deb-1);
825 if(deb>0) printf("Succes tab.FitMax = %g\n",xf);
826 fond = xf;
827 RETURN(xf);
828 } CATCHALL {
829 if(deb>0)
830 printf("Echec tab.FitMax BinNonNul=%d\n",tab.BinNonNul());
831 THROW(inconsistentErr);
832 } ENDTRY
833
834} CATCHALL {
835 THROW_SAME;
836} ENDTRY
837}
838
839/* --Methode-- (cmv 23/09/96) */
840template <class T>
841//++
842float Image<T>::SigmaCiel(int nbin,float bin_low,float bin_high
843 ,float& means,float lowbad,float highbad
844 ,float nsig,int modu,int deb)
845//
846// Calcul du sigma du fond de ciel:
847// Remplissage d'un histogramme avec px-<px8> pour les pixels
848// entre lowbad et highbad (px=valeur du pixel etudie,
849// <px8>=moyenne des 8 pixels qui lui sont contigus).
850// Une premiere estimation du sigma (s1) et realisee en cherchant
851// la largeur a mi-hauteur de cet histogramme. Puis un fit non-lineaire
852// d'une gaussienne est effectue dans +/- nsig*s1
853//| Input:
854//| nbin,bin_low,bin_high : definition de l'histogramme
855//| lowbad,highbad : limites des pixels a utiliser
856//| nsig : la zone de fit est definie a +/- nsig*sigma du maximum
857//| modu : on prend 1 px sur modu
858//| deb : debug flag
859//| Output:
860//| means = moyenne fittee de l'histogramme (normalement -> 0)
861//| renvoie le sigma du fond de ciel
862//| et update le membre protected sigmaFond (si succes)
863//--
864{
865T pixv=0;
866T minadu = PutInRange((double) lowbad , pixv);
867T maxadu = PutInRange((double) highbad, pixv);
868volatile bool testl = (lowbad<highbad) ? true : false;
869
870if(nbin<5) THROW(inconsistentErr);
871if(nsig<=0.) nsig = 4.;
872if(modu<=0) modu = 1;
873means = 0.;
874if(deb>0)
875 cout << "SigmaCiel( nbin=" << nbin
876 << ", bin_low=" << bin_low
877 << ", bin_high=" << bin_high
878 << ", lowbad=" << lowbad
879 << ", highbad=" << highbad
880 << ", nsig=" << nsig
881 << ", modu=" << modu
882 << ", deb=" << deb << endl;
883
884// coeff pour corriger le sigma de (S-<S8>) par rapport au sigma de S
885// sigma(S) = sigma(S-<S8>) * 1/sqrt(1+1/8) = 2*sqrt(2)/3
886double coeff = 2.*Rac2/3.;
887
888TRY {
889
890 Histo tab(bin_low,bin_high,nbin);
891 tab.Errors();
892
893 int nmod = 0, nsum = 0;
894 double sum= 0., sum2 = 0.;
895 for(int j=1;j<YSize()-1;j++) for(int i=1;i<XSize()-1;i++) {
896 nmod++;
897 if( nmod%modu != 0 ) continue;
898 pixv = (*this)(i,j);
899 if ( testl && (pixv < minadu || pixv > maxadu) ) continue;
900 double vp = (double) pixv;
901 double pxv = 0.;
902 volatile int n = 0;
903 for(int j1=j-1;j1<=j+1;j1++) for(int i1=i-1;i1<=i+1;i1++) {
904 if ( i1 == i && j1 == j ) continue;
905 pixv = (*this)(i1,j1);
906 if ( testl && (pixv < minadu || pixv > maxadu) ) continue;
907 pxv += (double) pixv;
908 n++;
909 }
910 if ( n != 8 ) continue;
911 vp = vp - pxv/(double) n;
912 tab.Add( (float) vp );
913 nsum++;
914 sum += vp;
915 sum2 += vp*vp;
916 }
917
918 float ms = tab.BinCenter( tab.IMax() );
919 volatile float sg = 0.;
920 if( tab.BinNonNul() == 1 ) {
921 if(deb>0) cout << tab.BinNonNul()
922 << " bins non nul dans l'histogramme" << endl;
923 if(nsum<=1) THROW(inconsistentErr);
924 sum /= (double) nsum;
925 sum2 = sum2/(double) nsum - sum*sum;
926 if(sum2<0.) THROW(inconsistentErr);
927 means = sum;
928 sum2 = sqrt(sum2) * coeff;
929 sigmaFond = sum2;
930 RETURN((float) sum2);
931 } else {
932 TRY {
933 sg = tab.FindWidth(0.5,deb-1) / 2.36;
934 } CATCHALL {
935 THROW_SAME;
936 } ENDTRY
937 }
938 double h = tab.VMax();
939 if(deb>0) cout << "from histo: ms=" << ms
940 << " sg=" << sg
941 << " h=" << h << endl;
942
943 float xmin = ms - nsig*sg;
944 float xmax = ms + nsig*sg;
945 int imin = tab.FindBin(xmin);
946 int imax = tab.FindBin(xmax);
947 if( imax-imin+1 < 4 ) {imax++; imin--;}
948 if(imin<0) imin=0;
949 if(imax>=tab.NBins()) imax=tab.NBins()-1;
950 int nb = imax-imin+1;
951 if( nb < 4 ) THROW(inconsistentErr);
952 if(deb>0) printf("xrange=[%g,%g] irange=[%d,%d] nb=%d\n"
953 ,xmin,xmax,imin,imax,nb);
954 if(deb>2) tab.Print(80,1.,-1.,0,imin,imax);
955
956 Gauss1DPol myfunc;
957 GeneralFit myfit(&myfunc);
958 GeneralFitData mydata(1,nb);
959 for(int i=imin;i<=imax;i++) {
960 float e = tab.Error(i);
961 if( e <= 0. ) e = 1.;
962 mydata.AddData1(tab.BinCenter(i),tab(i),e);
963 }
964
965 myfit.SetData(&mydata);
966 myfit.SetParam(0,h,h/50.);
967 myfit.SetParam(1,ms,sg/10.);
968 myfit.SetParam(2,sg,sg/10.);
969 myfit.SetBound(2,0.,sg*5.);
970 int rc = myfit.Fit();
971 if(rc<0) THROW(inconsistentErr);
972 if(deb>1) myfit.PrintFit();
973
974 means = myfit.GetParm(1);
975 sum2 = myfit.GetParm(2) * coeff;
976 sigmaFond = sum2;
977 RETURN((float) sum2);
978
979} CATCHALL {
980 THROW_SAME;
981} ENDTRY
982
983}
984
985
986/* --Methode-- (cmv 23/09/96) */
987template <class T>
988//++
989int Image<T>::MoySigma(float& mean,float& sigma,float lowbad,float highbad,int modu)
990//
991// Calcul de la moyenne (mean) et du sigma (sigma) dans un pave
992// en ne considerant que les pixels compris entre lowbad et highbad.
993// Seul 1 px sur modu est utilise.
994// La fonction retourne le nombre de pixels utilises pour le calcul.
995//--
996{
997T pixv=0;
998T minadu = PutInRange((double) lowbad , pixv);
999T maxadu = PutInRange((double) highbad, pixv);
1000bool testl = (lowbad<highbad) ? true : false;
1001
1002if(modu<=0) modu = 1;
1003mean = sigma = 0.;
1004
1005int rc = 0, n = 0;
1006double m = 0., s = 0., mm, ss, v;
1007
1008for(int j=0;j<YSize();j++) {
1009 mm = ss = 0.;
1010 for(int i=0;i<XSize();i++) {
1011 n++;
1012 if( n%modu != 0 ) continue;
1013 pixv = (*this)(i,j);
1014 if( testl && (pixv < minadu || pixv > maxadu) ) continue;
1015 v = (double) pixv;
1016 rc++;
1017 mm += v;
1018 ss += v*v;
1019 }
1020 m += mm;
1021 s += ss;
1022}
1023
1024if(rc==0) return(-1);
1025
1026m /= (double) rc;
1027s = s/(double) rc - m*m;
1028if(s<0.) return(-2);
1029
1030mean = (float) m;
1031sigma = (float) sqrt(s);
1032
1033moyPix = mean; // Mise a jour de la structure
1034sigPix = sigma;
1035
1036return rc;
1037}
1038
1039/* --Methode-- (cmv 23/09/96) */
1040template <class T>
1041//++
1042int Image<T>::MoySigmaIter(float& mean,float& sigma,float lowbad,float highbad
1043 ,int modu,int nitermx,float perdiff,float scut,int deb)
1044//
1045// Calcul de moyenne et sigma iterativement:
1046//| lowbad,highbad = dynamique permise pour la valeur
1047//| des pixels en ADU
1048//| modu = 1 px sur modu est utilise
1049//| nitermx = nombre maximum d'iterations permises
1050//| perdiff = condition d'arret en pourcent sur la variation du sigma
1051//| scut = coupure en nombre de sigma courant pour l'iteration suivante
1052//| mean = moyenne retournee
1053//| sigma = sigma retourne
1054//| return <= 0 probleme, sinon (>0) nombre de pixels utilises
1055//--
1056{
1057if( scut<=0. || nitermx<=0 || perdiff<=0. ) return 0;
1058if(modu<=0) modu = 1;
1059bool testl = (lowbad<highbad) ? true : false;
1060
1061mean = sigma = 0.;
1062float sigmaold = 0;
1063float xmin = lowbad;
1064float xmax = highbad;
1065int rc = 0;
1066
1067for(int it=0;it<nitermx;it++) {
1068 rc = MoySigma(mean,sigma,xmin,xmax,modu);
1069 if(deb>0) cout<<"MoySigmaIter mean="<<mean<<" sigma="<<sigma
1070 <<" npix="<<rc<<" entre "<<xmin<<","<<xmax<<endl;
[490]1071 if( rc <= 0 || sigma<=0. ) return rc;
[220]1072 if( it>=1 && fabs((double)(sigma-sigmaold))/sigma < perdiff ) break;
1073 xmin = mean - scut*sigma; if(testl && xmin<lowbad ) xmin = lowbad;
1074 xmax = mean + scut*sigma; if(testl && xmax>highbad) xmax = highbad;
1075 sigmaold = sigma;
1076}
1077
1078return rc;
1079}
1080
1081/* --Methode-- (cmv 23/09/96) */
1082template <class T>
1083//++
1084int Image<T>::FondSigmaCiel(float lowbad,float highbad,int pvsz
1085 ,float nbsig1,float nbsig2,float nbsig3
1086 ,float binsg,float frac,int modu,int deb)
1087//
1088// Calcul automatique du fond de ciel et du sigma ciel en utilisant
1089// les methodes precedentes et en calculant au mieux le binning.
1090//| lowbad,highbad: dynamoque utile de l'image (ADU)
1091//| pvsz : taille du pave a traiter (centre au milieu de l'image)
1092//| nbsig1 : pour EstimeFdSg -> calcul sgbmax (def=3.5).
1093//| nbsig2 : pour FondCiel (histo entre X maxi +/- nbsig2*sgbmax
1094//| nbin = 2.*nbsig2*binsg) (def=5).
1095//| nbsig3 : pour SigmaCiel (histo entre 0 +/- nbsig3*sgbmax
1096//| nbin = 2.*nbsig3*binsg) (def=5).
1097//| binsg : taille du bin pour les histos de FondCiel et SigmaCiel
1098//| (def=0.33)
1099//| frac : pour EstimeFdSg(...,frac,...) (def=0.33)
1100//--
1101{
1102if(pvsz<=0) pvsz = 100;
1103if(nbsig1<=0) nbsig1 = 3.5;
1104if(nbsig2<=0) nbsig2 = 5.0;
1105if(nbsig3<=0) nbsig3 = 5.0;
1106if(binsg<=0) binsg = 0.33; binsg = 1./binsg;
1107if(frac<=0.) frac = 0.33;
1108if(deb<0) deb=0;
1109int lpdb = (deb>=3) ? deb-2 : 0;
1110int envd = 0;
1111GetIntEnv("PDEBUG_FOND", envd);
1112if (lpdb < envd) lpdb = envd;
1113if (deb < envd) deb = envd;
1114float xbmax = 0., sgbmax = 0.;
1115int nbin,rc;
1116float xmin,xmax,binw,means;
1117
1118// creation sous image
1119int pvsx = pvsz, pvsy = pvsz;
1120if( pvsx > XSize() ) pvsx = XSize();
1121if( pvsy > YSize() ) pvsy = YSize();
1122Image<T> *ssima = NULL;
1123bool cree = false;
1124if( pvsx == XSize() && pvsy == YSize() ) {
1125 ssima = this;
1126} else {
1127 int orgx = XSize()/2 - pvsx/2; if( orgx < 0 ) orgx = 0;
1128 int orgy = YSize()/2 - pvsy/2; if( orgy < 0 ) orgy = 0;
1129 if( orgx + pvsx > XSize() ) pvsx = XSize() - orgx;
1130 if( orgy + pvsy > YSize() ) pvsy = YSize() - orgy;
1131 ssima = new Image<T>(pvsx,pvsy);
1132 cree = true;
1133 CopieImageF(*ssima,*this,orgx,orgy,pvsx,pvsy,0,0,0.,0.);
1134}
1135
1136// moyenne et sigma approches sur sous-image
1137rc = ssima->EstimeFdSg(xbmax,sgbmax,nbsig1,frac,lowbad,highbad,deb-1);
1138if( cree ) delete ssima;
1139if(rc<0) return -2;
1140fond = xbmax;
1141sigmaFond = sgbmax;
1142
1143// bin entier... pas forcement necessaire.
1144xmin = xbmax - nbsig2*sgbmax;
1145xmax = xbmax + nbsig2*sgbmax;
1146nbin = (int)(2.*nbsig2*binsg); if(nbin<5) nbin=5;
1147binw = (xmax-xmin)/nbin;
1148if(deb>0) cout<<"bin auto: xmin="<<xmin<<" xmax="<<xmax
1149 <<" nbin="<<nbin<<" binw="<<binw<<endl;
1150HBinInt(nbin,xmin,xmax);
1151binw = (xmax-xmin)/nbin;
1152if(deb>0) cout<<"bin auto entier: nbin="<<nbin<<" binw="<<binw
1153 <<" entre "<<xmin<<","<<xmax<<endl;
1154
1155// Optimisation de modu
1156if( modu <= 0 ) {
1157 // 4 fois plus de pixels que dans le pre-pave
1158 int npv = 4*pvsz*pvsz;
1159 int nima = XSize()*YSize();
1160 if( npv >= nima || nima < 10000 ) modu = 1;
1161 else modu = (int)( (float) nima / (float) npv );
1162 if(deb) cout<<"modulo choisi a "<<modu<<endl;
1163}
1164
1165// moyenne evoluee
1166TRY {
1167 fond = FondCiel(nbin,xmin,xmax,3,0.5,modu,lpdb);
1168 if(deb>0) cout <<"Fond de ciel = "<<fond<< endl;
1169} CATCHALL {
1170 if(deb>0) cout << "Echec FondCiel" << endl;
1171 return(-3);
1172} ENDTRY
1173
1174// sigma evolue
1175TRY {
1176 float dyn = nbsig3*sgbmax;
1177 int nbins = (int) (2.*nbsig3*binsg);
1178 float binws = (2.*dyn)/nbins;
1179 sigmaFond = SigmaCiel(nbins,-dyn,dyn,means,lowbad,highbad,4.,modu,lpdb);
1180 if(deb>0) cout <<"Sigma fond de ciel = "<<sigmaFond
1181 <<" (ms="<<means<<") sur "<<nbins
1182 <<" bins de largeur "<<binws<< endl;
1183} CATCHALL {
1184 if(deb>0) cout << "Echec SigmaCiel" << endl;
1185 return(-4);
1186} ENDTRY
1187
1188// Impression finale
1189if(deb) cout <<"ImgSigmaCiel: fond= "<<xbmax<<" / "<< fond
1190 <<" sigma= "<<sgbmax<<" / "<<sigmaFond<<endl;
1191
1192return 0;
1193}
1194
1195
1196
1197/* ....................................................... */
1198/* Fonctions de copie d'images et de paves */
1199/* ....................................................... */
1200
1201
1202/* Nouvelle-Fonction */
1203template <class T2, class T1>
1204void CopieImageF(Image<T2>& copie, Image<T1> const& pim,
1205 int org_pim_x, int org_pim_y, /* origine pave a copier */
1206 int pim_lpav_x, int pim_lpav_y, /* largeur pave a copier */
1207 int org_copie_x, int org_copie_y, /* origine copie */
1208 double cutmin, double cutmax) /* coupure pour max range*/
1209
1210/* Copie d'une image (pim) ds l'autre (copie) a partir d'un */
1211/* offset specifie en pixel */
1212/* attention: pas d'offset -> org_x = org_y = 0 */
1213{
1214int i,j;
[490]1215// int x,y; $CHECK$ Reza 21/06/99 changement de methode de calcul des bornes
[220]1216const T1* pt_pim;
1217T2* pt_copie;
1218double pim_pix;
1219int l_copie_x,l_copie_y;
1220int step_copie_x;
1221int step_pim_x;
1222int pim_siz_x, pim_siz_y;
[490]1223// int copie_siz_x, copie_siz_y; $CHECK$ Reza 21/06/99 changement de methode de calcul des bornes
[220]1224int switch_copie;
1225
1226pim_siz_x=pim.XSize();
1227pim_siz_y=pim.YSize();
1228if((org_pim_x < 0) || (org_pim_x > pim_siz_x))
[490]1229 { cout<< "CopieImage_erreure : org_pim_x: " <<org_pim_x<<" < 0 ou > a "<<pim_siz_x<<endl;
[220]1230 THROW(rangeCheckErr);}
1231if((org_pim_y < 0) || (org_pim_y > pim_siz_y))
[490]1232 { cout<< "CopieImage_erreure : org_pim_y: " <<org_pim_y<<" < 0 ou > a "<<pim_siz_y<<endl;
[220]1233 THROW(rangeCheckErr);}
1234
[490]1235if( (org_copie_x < 0) || (org_copie_x > copie.XSize()) )
1236 { cout<< "CopieImage_erreure : org_copie_x: " <<org_copie_x<<" < 0 ou > a "<< copie.XSize() << endl;
[220]1237 THROW(rangeCheckErr);}
[490]1238if( (org_copie_y < 0) || (org_copie_y > copie.YSize()) )
1239 { cout<< "CopieImage_erreure : org_copie_y: " <<org_copie_y<<" < 0 ou > a "<< copie.YSize() << endl;
[220]1240 THROW(rangeCheckErr);}
1241
[490]1242/* $CHECK$ Reza 21/06/99 Changement de methode de calcul ------
1243$CHECK$ Reza 21/06/99 , je change la taille a copier en fonction de l'origine de copie
1244copie_siz_x=copie.XSize()-org_copie_x;
1245copie_siz_y=copie.YSize()-org_copie_y;
1246
[220]1247x=pim_lpav_x;
1248if(x > (pim_siz_x-org_pim_x)) x=pim_siz_x-org_pim_x;
1249step_pim_x = pim_siz_x-x;
1250
1251if(x < copie_siz_x)
1252 {
1253 l_copie_x=x;
1254 step_copie_x=copie_siz_x-x;
1255 }
1256else
1257 {
1258 l_copie_x=copie_siz_x;
1259 step_copie_x=0;
1260 step_pim_x=step_pim_x+x-copie_siz_x;
1261 }
1262
1263if(org_copie_x > 0 )
1264 {
1265 int x=copie_siz_x-org_copie_x;
1266 if(x < l_copie_x )
1267 {
1268 step_pim_x=step_pim_x+l_copie_x-x;
1269 l_copie_x=x;
1270 step_copie_x=org_copie_x;
1271 }
1272 else
[490]1273 {
[220]1274 step_copie_x=copie_siz_x-l_copie_x;
1275 }
1276 }
1277
1278y=pim_lpav_y;
1279if(y > (pim_siz_y-org_pim_y)) y=pim_siz_y-org_pim_y;
1280
1281if(y < copie_siz_y)
1282 {
1283 l_copie_y=y;
1284 }
1285else
1286 {
1287 l_copie_y=copie_siz_y;
1288 }
1289
[490]1290*/
[220]1291
[490]1292l_copie_x = copie.XSize()-org_copie_x;
1293l_copie_y = copie.YSize()-org_copie_y;
1294if ( pim_lpav_x > (pim.XSize()-org_pim_x) ) pim_lpav_x = pim.XSize()-org_pim_x;
1295if ( pim_lpav_y > (pim.YSize()-org_pim_y) ) pim_lpav_y = pim.YSize()-org_pim_y;
1296if ( (pim_lpav_x > 0) && (l_copie_x > pim_lpav_x) ) l_copie_x = pim_lpav_x;
1297if ( (pim_lpav_y > 0) && (l_copie_y > pim_lpav_y) ) l_copie_y = pim_lpav_y;
1298step_pim_x = pim.XSize()-l_copie_x;
1299step_copie_x = copie.XSize()-l_copie_x;
1300
1301pt_pim = pim.ImagePtr() + org_pim_y*pim.XSize() + org_pim_x;
1302pt_copie=copie.ImagePtr() + org_copie_y*copie.XSize() + org_copie_x;
1303
[220]1304switch((int)ConvType(*pt_pim,*pt_copie)) {
1305 case t_same: case t_up:
1306 switch_copie=0;
1307 break;
1308 case t_spe: case t_down:
1309 switch_copie=1;
1310 break;
1311}
1312
1313if(cutmin < cutmax) switch_copie *= 2;
1314
1315switch(switch_copie) {
1316 case 0:
1317 for (j=0; j< l_copie_y; j++)
1318 {
1319 for(i=0; i< l_copie_x; i++)
1320 {
1321 *pt_copie++ =(T2)*pt_pim++;
1322 }
1323 pt_pim += step_pim_x;
1324 pt_copie += step_copie_x;
1325 }
1326 break;
1327 case 1:
1328 for (j=0; j< l_copie_y; j++)
1329 {
1330 for(i=0; i< l_copie_x; i++)
1331 {
1332 pim_pix = *pt_pim++;
1333 *pt_copie++ = PutInRange(pim_pix, *pt_copie);
1334 }
1335 pt_pim += step_pim_x;
1336 pt_copie += step_copie_x;
1337 }
1338 break;
1339 case 2:
1340 for (j=0; j< l_copie_y; j++)
1341 {
1342 for(i=0; i< l_copie_x; i++)
1343 {
1344 pim_pix = *pt_pim++;
1345 *pt_copie++ = (T2)SharePix(pim_pix,*pt_copie,cutmin,cutmax);
1346 }
1347 pt_pim += step_pim_x;
1348 pt_copie += step_copie_x;
1349 }
1350 break;
1351}
1352
1353copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
1354}
1355
1356
1357/* Nouvelle-Fonction */
1358template <class T2, class T1>
1359void CopieImage(Image<T2>& copie , Image<T1> const& pim)
1360{
1361if (!pim.ImagePtr()) THROW(nullPtrErr);
1362if (!copie.ImagePtr()) copie.Allocate(pim.XSize(),pim.YSize());
1363
1364CopieImageF(copie, pim,0,0,pim.XSize(),pim.YSize(),0,0,0., 0.);
1365}
1366
1367/* Nouvelle-Fonction */
1368template <class T2, class T1>
1369void CopieImage(Image<T2>& copie , Image<T1> const& pim,
1370 int org_pim_x , int org_pim_y,
1371 int pim_lpav_x , int pim_lpav_y,
1372 int org_copie_x , int org_copie_y,
1373 double cutmin , double cutmax )
1374{
1375if (!pim.ImagePtr()) THROW(nullPtrErr);
1376if (!copie.ImagePtr()) THROW(nullPtrErr);
[490]1377copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
1378// copie.SetOrg(org_pim_x,org_pim_y);
[220]1379
[490]1380/* Reza 28/04/95 : Je protege pour le moment contre les pave en
[220]1381dehors de l'image, mais je veux pouvoir copier des paves decale par
[490]1382rapport aux bornes de l'image source Re- CMV+Reza 30/09/96 */
1383/* $CHECK$ Reza 21/06/99 - Ca devrait etre OK */
[220]1384if ( (org_pim_x < 0) || (org_pim_y < 0) ||
1385 (org_pim_x >= pim.XSize() ) || (org_pim_y >= pim.YSize() ) ||
1386 ((org_pim_x+copie.XSize()) > pim.XSize()) ||
[490]1387 ((org_pim_y+copie.YSize()) > pim.YSize()) ) copie.Zero();
1388
1389if ( (org_pim_x >= pim.XSize()) || (org_pim_y >= pim.YSize()) ) {
1390 copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
1391 return;
1392}
1393// if ( (org_pim_x < 0) || (org_pim_y < 0) ||
1394// (org_pim_x >= pim.XSize() ) || (org_pim_y >= pim.YSize() )) return;
1395
1396int oox = org_pim_x;
1397int ooy = org_pim_y;
1398int ocx = org_copie_x;
1399int ocy = org_copie_y;
1400if (oox < 0) { ocx -= oox; oox = 0; }
1401if (ooy < 0) { ocy -= ooy; ooy = 0; }
[220]1402/* Fin de $CHECK$ */
1403
[490]1404// void CopieImageF(Image<T2>& copie, Image<T1> const& pim,
1405// int org_pim_x, int org_pim_y, /* origine pave a copier */
1406// int pim_lpav_x, int pim_lpav_y, /* largeur pave a copier */
1407// int org_copie_x, int org_copie_y, /* origine copie */
1408// double cutmin, double cutmax) /* coupure pour max range*/
1409
[220]1410if((pim_lpav_x <= 0) || (pim_lpav_x > pim.XSize())) pim_lpav_x=pim.XSize();
1411if((pim_lpav_y <= 0) || (pim_lpav_y > pim.YSize())) pim_lpav_y=pim.YSize();
[490]1412try {
1413 CopieImageF(copie, pim, oox, ooy,
[220]1414 pim_lpav_x, pim_lpav_y,
[490]1415 ocx, ocy, cutmin,cutmax);
[253]1416 } catch(RangeCheckError) {
[490]1417// $PLANCKCHECK$ if (merr != rangeCheckErr) THROW(merr); // Re- $CHECK$ CMV+Reza 30/09/96
[220]1418 } ENDTRY
[490]1419
1420copie.SetOrg( pim.XOrg()+org_pim_x-org_copie_x, pim.YOrg()+org_pim_y-org_copie_y);
[220]1421}
1422
1423
1424/* Nouvelle-Fonction */
1425template <class T2, class T1>
1426void CopiePave ( Image<T2>& pave , Image<T1> const& pim,
1427 float xc, float yc,
1428 double cutmin, double cutmax)
1429{
1430int ix, iy;
1431
1432xc -= 0.5 * (float)(pave.XSize()-1);
1433yc -= 0.5 * (float)(pave.YSize()-1);
1434// CopiePave tient compte de l'origine de l'image de depart Reza 18/9/96
1435xc -= pim.XOrg(); yc -= pim.YOrg();
1436
1437if ( xc >= 0.) ix = (int)xc;
1438else ix = (int)(xc-1.0);
1439if ( yc >= 0.) iy = (int)yc;
1440else iy = (int)(yc-1.0);
1441CopieImage(pave, pim, ix, iy, 0, 0, 0, 0, cutmin, cutmax ) ;
1442}
1443
1444
1445/* Nouvelle-Fonction */
1446template <class T>
1447void RzCopieImage(Image<T>& copie, RzImage const& pim,
1448 int org_pim_x , int org_pim_y,
1449 int pim_lpav_x, int pim_lpav_y,
1450 int org_copie_x, int org_copie_y,
1451 double cutmin , double cutmax)
1452{
1453 switch (pim.PixelType()) {
1454 case kuint_2: {
1455 ImageU2 src((RzImage&)pim);
1456 CopieImage(copie, src, org_pim_x , org_pim_y,
1457 pim_lpav_x, pim_lpav_y, org_copie_x,
1458 org_copie_y, cutmin, cutmax );
1459 break;
1460 }
1461 case kint_2: {
1462 ImageI2 src((RzImage&)pim);
1463 CopieImage(copie, src, org_pim_x , org_pim_y,
1464 pim_lpav_x, pim_lpav_y, org_copie_x,
1465 org_copie_y, cutmin, cutmax );
1466 break;
1467 }
1468 case kint_4: {
1469 ImageI4 src((RzImage&)pim);
1470 CopieImage(copie, src, org_pim_x , org_pim_y,
1471 pim_lpav_x, pim_lpav_y, org_copie_x,
1472 org_copie_y, cutmin, cutmax );
1473 break;
1474 }
1475 case kr_4: {
1476 ImageR4 src((RzImage&)pim);
1477 CopieImage(copie, src, org_pim_x , org_pim_y,
1478 pim_lpav_x, pim_lpav_y, org_copie_x,
1479 org_copie_y, cutmin, cutmax );
1480 break;
1481 }
1482 case kr_8:
1483 case kuint_4:
1484 case kuint_1:
1485 case kint_1:
1486 cerr << " RzCopieImage(...) / Error, Unsupported image type (kr_8/ kuint_4/ kuint_1/ kint_1) "
1487 << (int)pim.PixelType() << "\n";
1488 break;
1489 default:
1490 cerr << " RzCopieImage(...) / Error, Unknown image type !" << (int)pim.PixelType() << "\n";
1491 break;
1492 }
1493}
1494
1495
1496/* Nouvelle-Fonction */
1497template <class T>
1498void RzCopieImage(Image<T>& copie, RzImage const& pim)
1499{
1500 switch (pim.PixelType()) {
1501 case kuint_2: {
1502 ImageU2 src((RzImage&)pim);
1503 CopieImage(copie, src);
1504 break;
1505 }
1506 case kint_2: {
1507 ImageI2 src((RzImage&)pim);
1508 CopieImage(copie, src);
1509 break;
1510 }
1511 case kint_4: {
1512 ImageI4 src((RzImage&)pim);
1513 CopieImage(copie, src);
1514 break;
1515 }
1516 case kr_4: {
1517 ImageR4 src((RzImage&)pim);
1518 CopieImage(copie, src);
1519 break;
1520 }
1521 case kr_8:
1522 case kuint_4:
1523 case kuint_1:
1524 case kint_1:
1525 cerr << " RzCopieImage() / Error, Unsupported image type (kr_8/ kuint_4/ kuint_1/ kint_1) "
1526 << (int)pim.PixelType() << "\n";
1527 break;
1528 default:
1529 cerr << " RzCopieImage() / Error, Unknown image type ! " << (int)pim.PixelType() << "\n";
1530 break;
1531 }
1532}
1533
1534/* Nouvelle-Fonction */
1535template <class T>
1536void RzCopiePave(Image<T> & pave, RzImage const & pim,
1537 float xc, float yc,
1538 double cutmin, double cutmax)
1539{
1540int ix, iy;
1541
1542xc -= 0.5 * (float)(pave.XSize()-1);
1543yc -= 0.5 * (float)(pave.YSize()-1);
1544// RzCopiePave tient compte de l'origine de l'image de depart Reza 18/9/96
1545xc -= pim.XOrg(); yc -= pim.YOrg();
1546
1547if ( xc >= 0.) ix = (int)xc;
1548else ix = (int)(xc-1.0);
1549if ( yc >= 0.) iy = (int)yc;
1550else iy = (int)(yc-1.0);
1551
1552RzCopieImage(pave, pim, ix, iy, 0, 0, 0, 0, cutmin, cutmax) ;
1553}
1554
1555
1556/* Nouvelle-Fonction */
1557void RzPrintImage(RzImage & img)
1558{
1559switch (img.PixelType())
1560 {
1561 case kuint_1:
1562 {
1563 ImageU1 src((RzImage&)img);
1564 cout << src ;
1565 break;
1566 }
1567 case kuint_2:
1568 {
1569 ImageU2 src((RzImage&)img);
1570 cout << src ;
1571 break;
1572 }
1573 case kint_2:
1574 {
1575 ImageI2 src((RzImage&)img);
1576 cout << src ;
1577 break;
1578 }
1579 case kint_4:
1580 {
1581 ImageI4 src((RzImage&)img);
1582 cout << src ;
1583 break;
1584 }
1585 case kr_4:
1586 {
1587 ImageR4 src((RzImage&)img);
1588 cout << src ;
1589 break;
1590 }
1591 case kr_8:
1592 case kuint_4:
1593 case kint_1:
1594 cerr << " RzPrintImage() / Error, Unsupported image type (kr_8/kuint_4/ kint_1) "
1595 << (int)img.PixelType() << "\n";
1596 break;
1597 default:
1598 cerr << " RzPrintImage() / Error, Unknown image type " << (int)img.PixelType() << "\n";
1599 break;
1600 }
1601}
1602
1603
1604// ********** INSTANCES
1605#if defined(__xlC) || defined(__aCC__)
1606void instancetempcimage(int n)
1607{
1608// #pragma define_template
1609/* Cette fonction sert uniquement a forcer le compilo a instancier les
1610 classes/fonctions template */
1611
1612int m = n-50;
1613ImageU1 iu1(n,n), xiu1(m,m);
1614ImageU2 iu2(n,n), xiu2(m,m);
1615ImageI2 ii2(n,n), xii2(m,m);
1616ImageI4 ii4(n,n), xii4(m,m);
1617ImageR4 ir4(n,n), xir4(m,m);
1618RzImage rzi(kr_4, n, n);
1619
1620cout << iu1;
1621cout << iu2;
1622cout << ii2;
1623cout << ii4;
1624cout << ir4;
1625
1626CopieImageF(iu2, xiu2, 50, 50);
1627CopieImageF(iu2, xii2, 50, 50);
1628CopieImageF(iu2, xii4, 50, 50);
1629CopieImageF(iu2, xir4, 50, 50);
1630CopieImageF(ii2, xiu2, 50, 50);
1631CopieImageF(ii2, xii2, 50, 50);
1632CopieImageF(ii2, xii4, 50, 50);
1633CopieImageF(ii2, xir4, 50, 50);
1634CopieImageF(ii4, xiu2, 50, 50);
1635CopieImageF(ii4, xii2, 50, 50);
1636CopieImageF(ii4, xii4, 50, 50);
1637CopieImageF(ii4, xir4, 50, 50);
1638CopieImageF(ir4, xiu2, 50, 50);
1639CopieImageF(ir4, xii2, 50, 50);
1640CopieImageF(ir4, xii4, 50, 50);
1641CopieImageF(ir4, xir4, 50, 50);
1642
1643CopieImage(iu2, xiu2);
1644CopieImage(iu2, xii2);
1645CopieImage(iu2, xii4);
1646CopieImage(iu2, xir4);
1647CopieImage(ii2, xiu2);
1648CopieImage(ii2, xii2);
1649CopieImage(ii2, xii4);
1650CopieImage(ii2, xir4);
1651CopieImage(ii4, xiu2);
1652CopieImage(ii4, xii2);
1653CopieImage(ii4, xii4);
1654CopieImage(ii4, xir4);
1655CopieImage(ir4, xiu2);
1656CopieImage(ir4, xii2);
1657CopieImage(ir4, xii4);
1658CopieImage(ir4, xir4);
1659
1660CopieImage(iu2, xiu2, 50, 50);
1661CopieImage(iu2, xii2, 50, 50);
1662CopieImage(iu2, xii4, 50, 50);
1663CopieImage(iu2, xir4, 50, 50);
1664CopieImage(ii2, xiu2, 50, 50);
1665CopieImage(ii2, xii2, 50, 50);
1666CopieImage(ii2, xii4, 50, 50);
1667CopieImage(ii2, xir4, 50, 50);
1668CopieImage(ii4, xiu2, 50, 50);
1669CopieImage(ii4, xii2, 50, 50);
1670CopieImage(ii4, xii4, 50, 50);
1671CopieImage(ii4, xir4, 50, 50);
1672CopieImage(ir4, xiu2, 50, 50);
1673CopieImage(ir4, xii2, 50, 50);
1674CopieImage(ir4, xii4, 50, 50);
1675CopieImage(ir4, xir4, 50, 50);
1676
1677CopiePave(iu2, xiu2, (float)25., (float)25.);
1678CopiePave(iu2, xii2, (float)25., (float)25.);
1679CopiePave(iu2, xii4, (float)25., (float)25.);
1680CopiePave(iu2, xir4, (float)25., (float)25.);
1681CopiePave(ii2, xiu2, (float)25., (float)25.);
1682CopiePave(ii2, xii2, (float)25., (float)25.);
1683CopiePave(ii2, xii4, (float)25., (float)25.);
1684CopiePave(ii2, xir4, (float)25., (float)25.);
1685CopiePave(ii4, xiu2, (float)25., (float)25.);
1686CopiePave(ii4, xii2, (float)25., (float)25.);
1687CopiePave(ii4, xii4, (float)25.,(float) 25.);
1688CopiePave(ii4, xir4, (float)25., (float)25.);
1689CopiePave(ir4, xiu2, (float)25., (float)25.);
1690CopiePave(ir4, xii2, (float)25., (float)25.);
1691CopiePave(ir4, xii4, (float)25., (float)25.);
1692CopiePave(ir4, xir4, (float)25., (float)25.);
1693
1694RzCopieImage(iu2, rzi, 50, 50);
1695RzCopieImage(ii2, rzi, 50, 50);
1696RzCopieImage(ii4, rzi, 50, 50);
1697RzCopieImage(ir4, rzi, 50, 50);
1698
1699RzCopieImage(iu2, rzi);
1700RzCopieImage(ii2, rzi);
1701RzCopieImage(ii4, rzi);
1702RzCopieImage(ir4, rzi);
1703
1704RzCopiePave(iu2, rzi, (float)25., (float)25.);
1705RzCopiePave(ii2, rzi, (float)25., (float)25.);
1706RzCopiePave(ii4, rzi, (float)25., (float)25.);
1707RzCopiePave(ir4, rzi, (float)25., (float)25.);
1708
1709return;
1710}
1711
1712#endif
1713
1714#ifdef __CXX_PRAGMA_TEMPLATES__
1715#pragma define_template Image<uint_1>
1716#pragma define_template Image<uint_2>
1717#pragma define_template Image<int_2>
1718#pragma define_template Image<int_4>
1719#pragma define_template Image<r_4>
1720
1721// pour supprimer les message Warning: Unresolved:
1722// __ls__XR7ostreamRC10Image__TUc
1723
1724ostream& operator << (ostream& s, ImageU1 const& pim)
1725{
1726cout << "operator << (ostream, ImageU1) Not implemented ..." << endl;
1727return(s);
1728}
1729
1730// CopieImageF
1731#pragma define_template CopieImageF < uint_1 , uint_1 >
1732#pragma define_template CopieImageF < uint_1 , uint_2 >
1733#pragma define_template CopieImageF < uint_1 , int_2 >
1734#pragma define_template CopieImageF < uint_1 , int_4 >
1735#pragma define_template CopieImageF < uint_1 , r_4 >
1736
1737#pragma define_template CopieImageF < uint_2 , uint_2 >
1738#pragma define_template CopieImageF < uint_2 , int_2 >
1739#pragma define_template CopieImageF < uint_2 , int_4 >
1740#pragma define_template CopieImageF < uint_2 , r_4 >
1741
1742#pragma define_template CopieImageF < int_2 , uint_2 >
1743#pragma define_template CopieImageF < int_2 , int_2 >
1744#pragma define_template CopieImageF < int_2 , int_4 >
1745#pragma define_template CopieImageF < int_2 , r_4 >
1746
1747#pragma define_template CopieImageF < int_4 , uint_2 >
1748#pragma define_template CopieImageF < int_4 , int_2 >
1749#pragma define_template CopieImageF < int_4 , int_4 >
1750#pragma define_template CopieImageF < int_4 , r_4 >
1751
1752#pragma define_template CopieImageF < r_4 , uint_2 >
1753#pragma define_template CopieImageF < r_4 , int_2 >
1754#pragma define_template CopieImageF < r_4 , int_4 >
1755#pragma define_template CopieImageF < r_4 , r_4 >
1756
1757// CopieImage
1758#pragma define_template CopieImage < uint_2 , uint_2 >
1759#pragma define_template CopieImage < uint_2 , int_2 >
1760#pragma define_template CopieImage < uint_2 , int_4 >
1761#pragma define_template CopieImage < uint_2 , r_4 >
1762
1763#pragma define_template CopieImage < int_2 , uint_2 >
1764#pragma define_template CopieImage < int_2 , int_2 >
1765#pragma define_template CopieImage < int_2 , int_4 >
1766#pragma define_template CopieImage < int_2 , r_4 >
1767
1768#pragma define_template CopieImage < int_4 , uint_2 >
1769#pragma define_template CopieImage < int_4 , int_2 >
1770#pragma define_template CopieImage < int_4 , int_4 >
1771#pragma define_template CopieImage < int_4 , r_4 >
1772
1773#pragma define_template CopieImage < r_4 , uint_2 >
1774#pragma define_template CopieImage < r_4 , int_2 >
1775#pragma define_template CopieImage < r_4 , int_4 >
1776#pragma define_template CopieImage < r_4 , r_4 >
1777
1778// CopiePave
1779#pragma define_template CopiePave < uint_2 , uint_2 >
1780#pragma define_template CopiePave < uint_2 , int_2 >
1781#pragma define_template CopiePave < uint_2 , int_4 >
1782#pragma define_template CopiePave < uint_2 , r_4 >
1783
1784#pragma define_template CopiePave < int_2 , uint_2 >
1785#pragma define_template CopiePave < int_2 , int_2 >
1786#pragma define_template CopiePave < int_2 , int_4 >
1787#pragma define_template CopiePave < int_2 , r_4 >
1788
1789#pragma define_template CopiePave < int_4 , uint_2 >
1790#pragma define_template CopiePave < int_4 , int_2 >
1791#pragma define_template CopiePave < int_4 , int_4 >
1792#pragma define_template CopiePave < int_4 , r_4 >
1793
1794#pragma define_template CopiePave < r_4 , uint_2 >
1795#pragma define_template CopiePave < r_4 , int_2 >
1796#pragma define_template CopiePave < r_4 , int_4 >
1797#pragma define_template CopiePave < r_4 , r_4 >
1798
1799//RzCopieImage
1800#pragma define_template RzCopieImage < uint_2 >
1801#pragma define_template RzCopieImage < int_2 >
1802#pragma define_template RzCopieImage < int_4 >
1803#pragma define_template RzCopieImage < r_4 >
1804
1805//RzCopiePave
1806#pragma define_template RzCopiePave < uint_2 >
1807#pragma define_template RzCopiePave < int_2 >
1808#pragma define_template RzCopiePave < int_4 >
1809#pragma define_template RzCopiePave < r_4 >
1810
1811
1812#endif
1813
1814
[270]1815#if defined(ANSI_TEMPLATES)
[220]1816template class Image<uint_1>;
1817template class Image<uint_2>;
1818template class Image<int_2>;
1819template class Image<int_4>;
1820template class Image<r_4>;
1821
1822#if !defined(__aCC__) // HP - aCC a du mal avec les fonctions templates
1823
1824template void CopieImageF<uint_2, uint_2>(Image<uint_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1825template void CopieImageF<uint_2, int_2>(Image<uint_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1826template void CopieImageF<uint_2, int_4>(Image<uint_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1827template void CopieImageF<uint_2, r_4>(Image<uint_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1828template void CopieImageF< int_2, uint_2>(Image< int_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1829template void CopieImageF< int_2, int_2>(Image< int_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1830template void CopieImageF< int_2, int_4>(Image< int_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1831template void CopieImageF< int_2, r_4>(Image< int_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1832template void CopieImageF< int_4, uint_2>(Image< int_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1833template void CopieImageF< int_4, int_2>(Image< int_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1834template void CopieImageF< int_4, int_4>(Image< int_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1835template void CopieImageF< int_4, r_4>(Image< int_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1836template void CopieImageF< r_4, uint_2>(Image< r_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1837template void CopieImageF< r_4, int_2>(Image< r_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1838template void CopieImageF< r_4, int_4>(Image< r_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1839template void CopieImageF< r_4, r_4>(Image< r_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1840
1841template void CopieImage<uint_2, uint_2>(Image<uint_2>&, Image<uint_2> const&);
1842template void CopieImage<uint_2, int_2>(Image<uint_2>&, Image< int_2> const&);
1843template void CopieImage<uint_2, int_4>(Image<uint_2>&, Image< int_4> const&);
1844template void CopieImage<uint_2, r_4>(Image<uint_2>&, Image< r_4> const&);
1845template void CopieImage< int_2, uint_2>(Image< int_2>&, Image<uint_2> const&);
1846template void CopieImage< int_2, int_2>(Image< int_2>&, Image< int_2> const&);
1847template void CopieImage< int_2, int_4>(Image< int_2>&, Image< int_4> const&);
1848template void CopieImage< int_2, r_4>(Image< int_2>&, Image< r_4> const&);
1849template void CopieImage< int_4, uint_2>(Image< int_4>&, Image<uint_2> const&);
1850template void CopieImage< int_4, int_2>(Image< int_4>&, Image< int_2> const&);
1851template void CopieImage< int_4, int_4>(Image< int_4>&, Image< int_4> const&);
1852template void CopieImage< int_4, r_4>(Image< int_4>&, Image< r_4> const&);
1853template void CopieImage< r_4, uint_2>(Image< r_4>&, Image<uint_2> const&);
1854template void CopieImage< r_4, int_2>(Image< r_4>&, Image< int_2> const&);
1855template void CopieImage< r_4, int_4>(Image< r_4>&, Image< int_4> const&);
1856template void CopieImage< r_4, r_4>(Image< r_4>&, Image< r_4> const&);
1857
1858template void CopieImage<uint_2, uint_2>(Image<uint_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1859template void CopieImage<uint_2, int_2>(Image<uint_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1860template void CopieImage<uint_2, int_4>(Image<uint_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1861template void CopieImage<uint_2, r_4>(Image<uint_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1862template void CopieImage< int_2, uint_2>(Image< int_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1863template void CopieImage< int_2, int_2>(Image< int_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1864template void CopieImage< int_2, int_4>(Image< int_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1865template void CopieImage< int_2, r_4>(Image< int_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1866template void CopieImage< int_4, uint_2>(Image< int_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1867template void CopieImage< int_4, int_2>(Image< int_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1868template void CopieImage< int_4, int_4>(Image< int_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1869template void CopieImage< int_4, r_4>(Image< int_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1870template void CopieImage< r_4, uint_2>(Image< r_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1871template void CopieImage< r_4, int_2>(Image< r_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1872template void CopieImage< r_4, int_4>(Image< r_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1873template void CopieImage< r_4, r_4>(Image< r_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1874
1875template void CopiePave<uint_2, uint_2>(Image<uint_2>&, Image<uint_2> const&, float, float, double, double);
1876template void CopiePave<uint_2, int_2>(Image<uint_2>&, Image< int_2> const&, float, float, double, double);
1877template void CopiePave<uint_2, int_4>(Image<uint_2>&, Image< int_4> const&, float, float, double, double);
1878template void CopiePave<uint_2, r_4>(Image<uint_2>&, Image< r_4> const&, float, float, double, double);
1879template void CopiePave< int_2, uint_2>(Image< int_2>&, Image<uint_2> const&, float, float, double, double);
1880template void CopiePave< int_2, int_2>(Image< int_2>&, Image< int_2> const&, float, float, double, double);
1881template void CopiePave< int_2, int_4>(Image< int_2>&, Image< int_4> const&, float, float, double, double);
1882template void CopiePave< int_2, r_4>(Image< int_2>&, Image< r_4> const&, float, float, double, double);
1883template void CopiePave< int_4, uint_2>(Image< int_4>&, Image<uint_2> const&, float, float, double, double);
1884template void CopiePave< int_4, int_2>(Image< int_4>&, Image< int_2> const&, float, float, double, double);
1885template void CopiePave< int_4, int_4>(Image< int_4>&, Image< int_4> const&, float, float, double, double);
1886template void CopiePave< int_4, r_4>(Image< int_4>&, Image< r_4> const&, float, float, double, double);
1887template void CopiePave< r_4, uint_2>(Image< r_4>&, Image<uint_2> const&, float, float, double, double);
1888template void CopiePave< r_4, int_2>(Image< r_4>&, Image< int_2> const&, float, float, double, double);
1889template void CopiePave< r_4, int_4>(Image< r_4>&, Image< int_4> const&, float, float, double, double);
1890template void CopiePave< r_4, r_4>(Image< r_4>&, Image< r_4> const&, float, float, double, double);
1891
1892
1893template void RzCopieImage<uint_2>(Image<uint_2> &, RzImage const &, int, int, int, int, int, int, double, double);
1894template void RzCopieImage< int_2>(Image< int_2> &, RzImage const &, int, int, int, int, int, int, double, double);
1895template void RzCopieImage< int_4>(Image< int_4> &, RzImage const &, int, int, int, int, int, int, double, double);
1896template void RzCopieImage< r_4>(Image< r_4> &, RzImage const &, int, int, int, int, int, int, double, double);
1897
1898template void RzCopieImage<uint_2>(Image<uint_2> &, RzImage const &);
1899template void RzCopieImage< int_2>(Image< int_2> &, RzImage const &);
1900template void RzCopieImage< int_4>(Image< int_4> &, RzImage const &);
1901template void RzCopieImage< r_4>(Image< r_4> &, RzImage const &);
1902
1903template void RzCopiePave<uint_2>(Image<uint_2> &, RzImage const &, float, float, double, double);
1904template void RzCopiePave< int_2>(Image< int_2> &, RzImage const &, float, float, double, double);
1905template void RzCopiePave< int_4>(Image< int_4> &, RzImage const &, float, float, double, double);
1906template void RzCopiePave< r_4>(Image< r_4> &, RzImage const &, float, float, double, double);
1907
1908#endif // Pb avec HP aCC
1909
1910#endif
1911
1912
1913#ifdef __GNU_TEMPLATES__
1914template class Image<bool>;
1915template class Image<uint_1>;
1916template class Image<uint_2>;
1917template class Image<int_2>;
1918template class Image<int_4>;
1919template class Image<r_4>;
1920
1921
1922template void CopieImageF(Image<uint_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1923template void CopieImageF(Image<uint_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1924template void CopieImageF(Image<uint_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1925template void CopieImageF(Image<uint_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1926template void CopieImageF(Image< int_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1927template void CopieImageF(Image< int_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1928template void CopieImageF(Image< int_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1929template void CopieImageF(Image< int_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1930template void CopieImageF(Image< int_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1931template void CopieImageF(Image< int_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1932template void CopieImageF(Image< int_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1933template void CopieImageF(Image< int_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1934template void CopieImageF(Image< r_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1935template void CopieImageF(Image< r_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1936template void CopieImageF(Image< r_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1937template void CopieImageF(Image< r_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1938
1939template void CopieImage(Image<uint_2>&, Image<uint_2> const&);
1940template void CopieImage(Image<uint_2>&, Image< int_2> const&);
1941template void CopieImage(Image<uint_2>&, Image< int_4> const&);
1942template void CopieImage(Image<uint_2>&, Image< r_4> const&);
1943template void CopieImage(Image< int_2>&, Image<uint_2> const&);
1944template void CopieImage(Image< int_2>&, Image< int_2> const&);
1945template void CopieImage(Image< int_2>&, Image< int_4> const&);
1946template void CopieImage(Image< int_2>&, Image< r_4> const&);
1947template void CopieImage(Image< int_4>&, Image<uint_2> const&);
1948template void CopieImage(Image< int_4>&, Image< int_2> const&);
1949template void CopieImage(Image< int_4>&, Image< int_4> const&);
1950template void CopieImage(Image< int_4>&, Image< r_4> const&);
1951template void CopieImage(Image< r_4>&, Image<uint_2> const&);
1952template void CopieImage(Image< r_4>&, Image< int_2> const&);
1953template void CopieImage(Image< r_4>&, Image< int_4> const&);
1954template void CopieImage(Image< r_4>&, Image< r_4> const&);
1955
1956template void CopieImage(Image<uint_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1957template void CopieImage(Image<uint_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1958template void CopieImage(Image<uint_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1959template void CopieImage(Image<uint_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1960template void CopieImage(Image< int_2>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1961template void CopieImage(Image< int_2>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1962template void CopieImage(Image< int_2>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1963template void CopieImage(Image< int_2>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1964template void CopieImage(Image< int_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1965template void CopieImage(Image< int_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1966template void CopieImage(Image< int_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1967template void CopieImage(Image< int_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1968template void CopieImage(Image< r_4>&, Image<uint_2> const&, int, int, int, int, int, int, double, double);
1969template void CopieImage(Image< r_4>&, Image< int_2> const&, int, int, int, int, int, int, double, double);
1970template void CopieImage(Image< r_4>&, Image< int_4> const&, int, int, int, int, int, int, double, double);
1971template void CopieImage(Image< r_4>&, Image< r_4> const&, int, int, int, int, int, int, double, double);
1972
1973template void CopiePave(Image<uint_2>&, Image<uint_2> const&, float, float, double, double);
1974template void CopiePave(Image<uint_2>&, Image< int_2> const&, float, float, double, double);
1975template void CopiePave(Image<uint_2>&, Image< int_4> const&, float, float, double, double);
1976template void CopiePave(Image<uint_2>&, Image< r_4> const&, float, float, double, double);
1977template void CopiePave(Image< int_2>&, Image<uint_2> const&, float, float, double, double);
1978template void CopiePave(Image< int_2>&, Image< int_2> const&, float, float, double, double);
1979template void CopiePave(Image< int_2>&, Image< int_4> const&, float, float, double, double);
1980template void CopiePave(Image< int_2>&, Image< r_4> const&, float, float, double, double);
1981template void CopiePave(Image< int_4>&, Image<uint_2> const&, float, float, double, double);
1982template void CopiePave(Image< int_4>&, Image< int_2> const&, float, float, double, double);
1983template void CopiePave(Image< int_4>&, Image< int_4> const&, float, float, double, double);
1984template void CopiePave(Image< int_4>&, Image< r_4> const&, float, float, double, double);
1985template void CopiePave(Image< r_4>&, Image<uint_2> const&, float, float, double, double);
1986template void CopiePave(Image< r_4>&, Image< int_2> const&, float, float, double, double);
1987template void CopiePave(Image< r_4>&, Image< int_4> const&, float, float, double, double);
1988template void CopiePave(Image< r_4>&, Image< r_4> const&, float, float, double, double);
1989
1990
1991template void RzCopieImage(Image<uint_2> &, RzImage const &, int, int, int, int, int, int, double, double);
1992template void RzCopieImage(Image< int_2> &, RzImage const &, int, int, int, int, int, int, double, double);
1993template void RzCopieImage(Image< int_4> &, RzImage const &, int, int, int, int, int, int, double, double);
1994template void RzCopieImage(Image< r_4> &, RzImage const &, int, int, int, int, int, int, double, double);
1995
1996template void RzCopieImage(Image<uint_2> &, RzImage const &);
1997template void RzCopieImage(Image< int_2> &, RzImage const &);
1998template void RzCopieImage(Image< int_4> &, RzImage const &);
1999template void RzCopieImage(Image< r_4> &, RzImage const &);
2000
2001template void RzCopiePave(Image<uint_2> &, RzImage const &, float, float, double, double);
2002template void RzCopiePave(Image< int_2> &, RzImage const &, float, float, double, double);
2003template void RzCopiePave(Image< int_4> &, RzImage const &, float, float, double, double);
2004template void RzCopiePave(Image< r_4> &, RzImage const &, float, float, double, double);
2005
2006#endif
2007
Note: See TracBrowser for help on using the repository browser.