Viewing contents of file '../idllib/astron/contrib/varosi/vlibm/allpro/max_entropy.pro'
;+
;PURPOSE:
; Deconvolution of data by Maximum Entropy analysis, given the
; instrument point spread response function (spatially invariant psf).
; Data can be an observed image or spectrum, result is always positive.
; Default is convolutions using FFT (faster when image size = power of 2).
;CALLING:
; for i=1,Niter do begin
; Max_Entropy, image_data, psf, image_deconv, multipliers, FT_PSF=psf_ft
;INPUTS:
; data = observed image or spectrum, should be mostly positive,
; with mean sky (background) near zero.
; psf = Point Spread Function of instrument (response to point source,
; must sum to unity).
; deconv = result of previous call to Max_Entropy,
; multipliers = the Lagrange multipliers of max.entropy theory
; (on first call, set = 0, giving flat first result).
;OUTPUTS:
; deconv = deconvolution result of one more iteration by Max_Entropy.
; multipliers = the Lagrange multipliers saved for next iteration.
;KEYWORDS:
; FT_PSF = passes (out/in) the Fourier transform of the PSF,
; so that it can be reused for the next time procedure is called,
; /NO_FT overrides the use of FFT, using the IDL function convol() instead.
; /LINEAR switches to Linear convergence mode, much slower than the
; default Logarithmic convergence mode.
; LOGMIN = minimum value constraint for taking Logarithms (default=1.e-9).
;EXTERNAL CALLS:
; function convolve( image, psf ) for convolutions using FFT or otherwise.
;METHOD:
; Iteration with PSF to maximize entropy of solution image with
; constraint that the solution convolved with PSF fits data image.
; Based on paper by Hollis, Dorband, Yusef-Zadeh, Ap.J. Feb.1992,
; which refers to Agmon, Alhassid, Levine, J.Comp.Phys. 1979.
;HISTORY: written by Frank Varosi at NASA/GSFC, 1992.
;-
pro max_entropy, data, psf, deconv, multipliers, FT_PSF=psf_ft, NO_FT=noft, $
LINEAR=Linear, LOGMIN=Logmin, RE_CONVOL_IMAGE=Re_conv
if N_elements( multipliers ) LE 1 then begin
multipliers = data
multipliers(*) = 0
endif
deconv = exp( convolve( multipliers, psf, FT_PSF=psf_ft, $
/CORREL, NO_FT=noft ) )
totd = total( data )
deconv = deconv * ( totd/total( deconv ) )
Re_conv = convolve( deconv, psf, FT_PSF=psf_ft, NO_FT=noft )
scale = total( Re_conv )/totd
if keyword_set( Linear ) then begin
multipliers = multipliers + (data * scale - Re_conv)
endif else begin
if N_elements( Logmin ) NE 1 then Logmin=1.e-9
multipliers = multipliers + $
aLog( ( ( data * scale )>Logmin ) / (Re_conv>Logmin) )
endelse
end