	FUNCTION image_filterer, img, width=width, indices=indices, average=average
;	------------------------------------------------------------
;+					                  19-April-94
;       NAME: filter
;
;       PURPOSE: Return the input image filtered with either median 
;		 filter (default) or average filter.  
;
;       METHOD: Default uses a three point median filter.  The returned 
;		variable is either the filter image or a vector of filtered
;		values corresponding to the input "indices" of the input
;		image.  An average filter is also available.
;
;       CALLING SEQUENCE:  
;		filtered_img = filter(img, [width=width, indices=indices, 
;				average=average] )
;
;
;       PARAMETERS: 	img		input image 
;
;	KEYWORDS:	
;			width		filter size (default is 3).
;			average		use an average filter instead
;					of median.
;			indices		a list of "img" elements for 
;					which computed filtered values are
;					returned.
;
;	CALLS: 	 COORD_V2L
;
;       HISTORY: 
;		19-Apr-94, written by gal and drafted from spikes by 
;		A.McAllister, following a B.Labonte algorythm, 10-jun-93.
;               10-nov-96 - S.L.Freeland renamed to <image_filterer> 
;                           from filter.pro
;                           (avoid collision with common variable names)
;
;-
;		------------------------------------------------------------

sz=size(img)
xmax=sz(1)-1
ymax=sz(2)-1

if n_elements(width) eq 0 then width = 3	;default filter size

if n_elements(average) eq 0 then begin
  medn=median(img,width)                        ;default median
endif else medn = smooth(img,width)		;use average filter

for i=0,ymax do begin			;vertical boundries
   ym=(i-1)>0
   yp=(i+1)<ymax
   if n_elements(average) eq 0 then begin
     medy0=median(img(0:1,ym:yp))  
     ll=coord_v2l([0,i],sz)
     medn(ll)=medy0		;update x0 column
   endif else begin
     medy0=total(img(0:1,ym:yp))/n_elements(img(0:1,ym:yp)) ;average filter
     ll=coord_v2l([0,i],sz)
     medn(ll)=medy0		;update x0 column
   endelse

   if n_elements(average) eq 0 then begin
     medym=median(img((xmax-1):xmax,ym:yp))
     ll=coord_v2l([xmax,i],sz)
     medn(ll)=medym		;update xmax column
   endif else begin
     medym=total(img((xmax-1):xmax,ym:yp))/n_elements(img((xmax-1):xmax,ym:yp)) 	;average filter
     ll=coord_v2l([xmax,i],sz)
     medn(ll)=medym		;update xmax column
   endelse
endfor

for j=0,xmax do	begin		;horizontal boundries
   xm=(j-1)>0
   xp=(j+1)<xmax
   if n_elements(average) eq 0 then begin
     medx0=median(img(xm:xp,0:1))
     ll=coord_v2l([j,0],sz)
     medn(ll)=medx0		;update y0 row
   endif else begin 
     medx0=total(img(xm:xp,0:1))/n_elements(img(xm:xp,0:1)) 	;average filter
     ll=coord_v2l([j,0],sz)
     medn(ll)=medx0		;update y0 row
   endelse

   if n_elements(average) eq 0 then begin
     medxm=median(img(xm:xp,(ymax-1):ymax))
     ll=coord_v2l([j,ymax],sz)
     medn(ll)=medxm		;update ymax row
   endif else begin
     medxm=total(img(xm:xp,(ymax-1):ymax))/n_elements(img(xm:xp,(ymax-1):ymax)) 	 	;average filter
     ll=coord_v2l([j,ymax],sz)
     medn(ll)=medxm		;update ymax row
   endelse
endfor

if (n_elements(indices) ne 0) then medn = medn(indices)

return, medn			;filtered image

end
