
;+ *************************************************************************************
; NAME:
;	EXTRACT_SOURCES
;
; PURPOSE:
;	Cette procedure recherche et extrait d'une image 2D, une ou plusieurs 
;	sources (volume gaussien)	
;
; CATEGORY:
;	RH_2D, recherche de positions
;
; CALLING SEQUENCE:
;	EXTRACT_SOURCES, Image, Tgauss, FACT=facteur, NBMAX=nbmax, SEUIL=seuil, FMAX=fmax
;
; INPUTS:
;	Image:	Tableau contenant l'image
;
; KEYWORD PARAMETERS:
;	FACT:	facteur d'interpolation lineaire de l'image (defaut = 2)
;	NBMAX:	Nombre maximum de volumes gaussiens à extraire de l'image
;		(defaut = 1)
;	SEUIL:	critere de mi-hauteur pour la recherche des 8 distances
;		(defaut=2)
;	NIVEAU:	niveau de recherche exprime en % de la valeur maximum de
;		l'image (defaut = 0.8 soit 80% du maximum)
;
; OUTPUTS:
;	Tgauss: tableau de structures contenant la description des volumes
;		gaussien extraits de l'image
;
; EXAMPLE:
;
; MODIFICATION HISTORY:
;	Ecrit par: C Renie, decembre 1997 
;- *************************************************************************************


PRO extract_sources,tab,tgauss, FACT=facteur, NBMAX=nbmax, SEUIL=seuil, FMAX=fmax

IF NOT KEYWORD_SET(facteur) THEN facteur = 1
IF NOT KEYWORD_SET(nbmax) THEN nbmax = 1
IF NOT KEYWORD_SET(seuil) THEN seuil = 2.0
IF NOT KEYWORD_SET(fmax) THEN fmax = 0.8

; Preparation du tableau sur lequel s'effectue la recherhe
  result=SIZE(tab)
  dimx=result(1)*facteur
  dimy=result(2)*facteur
  ;tabtrv=REBIN(tab,dimx,dimy)
  tabtrv=CONGRID(tab,dimx,dimy, CUBIC=-0.5)
  
; recherche du maximum de l'image et des index associes
  maxtab=MAX(tabtrv,i)
  xmax=i MOD dimx
  ymax=i/dimx
  niveau_recherche=fmax*maxtab
 
  index=0
  temp = tgauss(index)
  
  IF (xmax LT 5*facteur) OR (xmax GT dimx-facteur*5) OR (ymax LT 5*facteur) OR $
  (ymax GT dimy-facteur*5) THEN BEGIN
  	niveau_recherche=maxtab
  ;	PRINT, xmax/facteur, ymax/facteur
  ENDIF
  WHILE ( (niveau_recherche LT maxtab) AND ( index LT nbmax) ) DO BEGIN
  
; determination de la gaussienne qui decrit le mieux la source
	TRV_GAUS, tabtrv, xmax, ymax, temp,seuil
	
; Sauvegarde des infos
	;IF temp.gra LT temp.grb THEN BEGIN
	;	petitaxe = temp.grb
	;	grdaxe = temp.gra
	;	temp.tet = temp.tet + (!PI/2)
	;	temp.gra = petitaxe
	;	temp.grb = grdaxe
	;ENDIF
	tgauss(index).gra=temp.gra*(facteur^2)
	tgauss(index).grb=temp.grb*(facteur^2)
	tgauss(index).tet=temp.tet
	tgauss(index).max = temp.max
	tgauss(index).xmax=temp.xmax/facteur
	tgauss(index).ymax=temp.ymax/facteur   

; Preparation du nouveau tableau pou recherche du prochain centre
	IF nbmax GT 1 THEN BEGIN
		; soustraction de la gaussienne du tableau precedent
		tab_sous = FLTARR(dimx,dimy)
		calc_volgauss, temp, dimx, dimy, tab_sous
		tabtrv = tabtrv - tab_sous
		
		; determination du nouveau maximum
		maxtab=MAX(tabtrv,i)
		xmax=i MOD dimx
		ymax=i/dimx
		; test pour verifier que le max est dans des limites acceptables
		IF (xmax LT 5*facteur) OR (xmax GT dimx-facteur*5) OR $
		(ymax LT 5*facteur) OR (ymax GT dimy-facteur*5) THEN $
		niveau_recherche=maxtab 
	ENDIF	
	index = index+1
  ENDWHILE
; on marque la fin du tableau au cas ou la boucle s'est terminee parcequ'il n'y a plus
; de centre repondant au critere de la valeur maximale
  IF index LT nbmax THEN tgauss(index).max = -1.0

END
