Viewing contents of file '../idllib/ssw/allpro/amedian.pro'
FUNCTION AMEDIAN,ARRAY,WIDTH
;+
; NAME:
; AMEDIAN
; PURPOSE:
; Works the same as MEDIAN, but the effect tapers off at the edges.
; CALLING SEQUENCE:
; Result = AMEDIAN( ARRAY, WIDTH )
; INPUT PARAMETERS:
; ARRAY = One or two-dimensional array to be median filtered.
; WIDTH = Width of the median filter box.
; OPTIONAL KEYWORD PARAMETERS:
; None.
; COMMON BLOCKS:
; None.
; SIDE EFFECTS:
; None.
; RESTRICTIONS:
; ARRAY must be one or two-dimensional.
; PROCEDURE:
; A larger array is constructed with the border filled with the reflected
; edges of the original array. Then MEDIAN is applied to this larger
; array, and the area corresponding to the original array is returned as
; the result of the function.
; MODIFICATION HISTORY:
; William Thompson, February 1993.
;-
;
ON_ERROR,2
;
; Check the number of parameters.
;
IF N_PARAMS() NE 2 THEN MESSAGE, $
'Syntax: Result = AMEDIAN(ARRAY,WIDTH)'
;
; Check the size of the array.
SZ = SIZE(ARRAY)
IF SZ(0) EQ 0 THEN MESSAGE,'ARRAY not defined'
IF SZ(0) GT 2 THEN MESSAGE,'ARRAY must be one- or two-dimensional'
NX = SZ(1)
IF SZ(0) EQ 2 THEN NY = SZ(2)
;
; Get the size of the border to add onto the array.
;
IF N_ELEMENTS(WIDTH) NE 1 THEN MESSAGE, $
'WIDTH must be a scalar'
W = FIX((WIDTH+1)/2)
;
; Form the larger array to apply the median filter function to.
;
IF SZ(0) EQ 1 THEN BEGIN
A = FLTARR(NX+2*W)
A(W) = ARRAY
A(0) = REVERSE(A(1:W))
A(NX+W) = REVERSE(A(NX-W-1:NX-2))
END ELSE BEGIN
A = FLTARR(NX+2*W, NY+2*W)
A(W,W) = ARRAY
A(0,W) = REVERSE(ARRAY(1:W,*),1)
A(NX+W,W) = REVERSE(ARRAY(NX-W-1:NX-2,*),1)
A(0,0) = REVERSE(A(*,W+1:2*W),2)
A(0,NY+W) = REVERSE(A(*,NY-1:NY+W-2),2)
ENDELSE
;
; Apply the median filter function, and extract the part corresponding to the
; original array.
;
A = MEDIAN(A,WIDTH)
IF SZ(0) EQ 1 THEN A = A(W:NX+W-1) ELSE A = A(W:NX+W-1,W:NY+W-1)
;
RETURN,A
END