Select Git revision
centroider.pro
-
Laura Schreiber authoredLaura Schreiber authored
centroider.pro 3.57 KiB
; $Id: centroider.pro, v 1.0 Aug 1999 e.d. $
;
;+
; NAME:
; CENTROIDER
;
; PURPOSE:
; Sub-pixel centering of an image by iterative fractional shift.
;
; CATEGORY:
; Signal processing. Interpolation.
;
; CALLING SEQUENCE:
; Result = CENTROIDER(Image)
;
; INPUTS:
; Image: 2D array to be centered
;
; KEYWORD PARAMETERS:
; XC, YC: Reference pixel for centroid computation. The default is the
; Image maximum.
;
; CENTROID_BOX: Width of box centered at the reference pixel used to
; compute the Image centroid. The default is equal to the (rounded)
; FWHM of the peak at the reference position. A minimum value of
; 3 pixels is fixed.
;
; CENTROID_TOL: This keyword defines the stopping condition for the
; iterative algorithm, i.e. the maximum allowed off-centering of
; the Image centroid. The default is CENTROID_TOL = 0.05 pixels.
;
; CENTROID_IT: Use this keyword to fix the maximum number of
; iterations. The default is 20, even though centering is achieved
; in fewer iterations (tipically 5).
;
; INTERP_TYPE: Set this keyword to a string identifying one of the
; interpolation techiques supported by IMAGE_SHIFT. For more details
; see the function IMAGE_SHIFT in the file 'image_shift.pro'.
;
; OUTPUTS:
; Result: Centered array
;
; OPTIONAL OUTPUTS:
; XSHIFT, YSHIFT: Use these output keywords to retrieve the total shifts
; performed to center the Image, starting from the reference position.
; The quantities XC + X_SHIFT and YC + Y_SHIFT represent and estimate
; of the true centroid location in the original Image
;
; RESTRICTIONS:
; The Image is shifted by interpolation techniques, which are suited to
; well sampled data. This method should not applied to undersampled
; images.
;
; PROCEDURE:
; Compute first the offset of the image centroid and shift the array in
; order to cancel the off-centering. The operation is iterated until the
; offset is smaller than a pre-fixed tolerance.
; The centroid is computed on a small box centered at a reference position,
; which generally coincides with the image maximum.
; The image shift is performed by interpolation.
;
; MODIFICATION HISTORY:
; Written by: Emiliano Diolaiti, August 1999.
; Adapted from an algorithm described in:
; Christou J.C., Bonaccini D., "Technical Report ESO VLT",
; Doc. No. GEN-TRE-ESO-11620-1261 (1996)
;-
FUNCTION centroider, image, XC = xc, YC = yc, CENTROID_BOX = box, $
CENTROID_TOL = tol, CENTROID_IT = maxit, $
XSHIFT = xs, YSHIFT = ys, _EXTRA = extra
on_error, 2
; reference pixel
if n_elements(xc) * n_elements(yc) eq 0 then begin
m = get_max(image) & x = m[0] & y = m[1]
endif else begin
x = xc & y = yc
endelse
x = round(x) & y = round(y)
; box size to compute centroid
if n_elements(box) eq 0 then $
b = fwhm(image, X = x, Y = y) else b = box
b = round(b)
if n_elements(b) eq 1 then b = [b, b]
b = b < size52(image, /DIM) & b = b + 1 - b mod 2 & b = b > 3
; other parameters
if n_elements(tol) eq 0 then tol = 0.05
if n_elements(maxit) eq 0 then maxit = 20
imag = image & it = 0 & xs = 0. & ys = 0.
; iteration
repeat begin
it = it + 1
; compute centroid
c = centroid(sub_array(imag, b[0], b[1], $
REFERENCE = [x, y], LX = lx, LY = ly))
dx = x - lx - c[0] & dy = y - ly - c[1]
; shift image to center centroid
xs = xs + dx & ys = ys + dy
imag = image_shift(imag, xs, ys, _EXTRA = extra, shift_data)
convergence = abs(dx) lt tol and abs(dy) lt tol
endrep until convergence or it eq maxit
if it eq maxit and not convergence then begin
imag = image & xs = 0. & ys = 0.
endif
return, imag
end