medarr.pro

来自「basic median filter simulation」· PRO 代码 · 共 137 行

PRO
137
字号
PRO medarr, inarr, outarr, mask, output_mask;+; NAME:;       MEDARR; PURPOSE:;       Compute the median at each pixel across a set of 2-d images; EXPLANATION:;       Each pixel in the output array contains  the median of the ;       corresponding pixels in the input arrays.   Useful, for example to ;       combine a stack of CCD images, while removing cosmic ray hits.;;       This routine became partially obsolete in V5.6 with the introduction;       of the DIMENSION keyword to the intrinsic MEDIAN() function.   However,;       it is  still useful if a input mask is needed (though it is much ;       faster to set invalid pixels to NaN values.); CALLING SEQUENCE:;       MEDARR, inarr, outarr, [ mask, output_mask ]; INPUTS:;       inarr  -- A three dimensional array containing the input arrays to ;                 combine together.  Each of the input arrays must be two ;                 dimensional and must have the same dimensions.  These arrays;                 should then be stacked together into a single 3-D array,;                 creating INARR.;; OPTIONAL INPUT:;       mask   -- Same structure as inarr, byte array with 1b where;                 pixels are to be included, 0b where they are to be;                 excluded.    For floating point images, it is much faster to ;                 set masked pixels in inarr equal to !VALUES.F_NAN (see below),;                 rather than use the mask parameter.;                ; OUTPUTS:;       outarr -- The output array.  It will have dimensions equal to the;                 first two dimensions of the input array.;; OPTIONAL OUPUT:;       output_mask -- Same structure as outarr, byte array with 1b;                      pixels are valid, 0b where all the input pixels;                      have been masked out.; RESTRICTIONS:;        This procedure was *SLOW* when using the Mask parameter because it has;        to loop over  each pixel of the image.  ;; EXAMPLE:;       Suppose one wants to combine three floating point 1024 x 1024 bias ;       frames which have been read into the IDL variables im1,im2,im3;;       IDL> bigim = fltarr(1024,1024,3)        ;Create big array to hold images;       IDL> bigim(0,0,0) = im1 & bigim(0,0,1) = im2 & bigim(0,0,2) = im2  ;       IDL> medarr, bigim, avgbias;;       The variable avgbias will be the desired 1024x 1024 float image.; PROCEDURE:;       If the MASK parameter is not set, then MEDARR is just a wrapper for ;       MEDIAN(/EVEN, dimension = 3).    If the MASK parameter is set,;       a scalar median function over the third dimension is looped over ;       each pixel of the first two dimensions.   The /EVEN keyword is used;       with MEDIAN (which averages the two middle values), since this avoids ;       biasing the output for an even number of images.;;       Any values set to NAN (not a number) are ignored when computing the;       median.    If all values for a pixel location are NAN, then the median;       is also returned as NAN.;; MODIFICATION HISTORY:;       Written by Michael R. Greason, STX, 12 June 1990.;       Don't use MEDIAN function for even number of images.;          W. Landsman Sep 1996;       Mask added.  RS Hill, HSTX, 13 Mar. 1997;       Converted to IDL V5.0   W. Landsman   September 1997;       Use /EVEN keyword to MEDIAN    W. Landsman  September 1997;       Rearranged code for faster execution   W. Landsman January 1998;       Faster execution for odd number of images   W. Landsman July 2000;       V5.4 fix for change in SIZE() definition of undefined variable ;                W. Landsman/E. Young   May 2001;       Use MEDIAN(/DIMEN) for V5.6 or later   W. Landsman   November 2002;       Use keyword_set() instead of ARG_present() to test for presence of mask;           parameter  D. Hanish/W. Landsman   June 2003;       Assume since V5.6  W. Landsman  Feb 2004; ;- On_error,2;                       Check parameters. if N_params() LT 2 then begin                  ; # parameters.        print, "Syntax -  MEDARR, inputarr, outputarr [, maskarr, output_mask]"        return endif  s = size(inarr) if s[0] NE 3 then $                    ; Input array size.        message, "Input array must have 3 dimensions" if (N_elements(mask) EQ 0) then begin        outarr = median(inarr,dimension=3,/even)        return endif;                       Create the output array. ncol = s[1] nrow = s[2] narr = s[3] type = s[s[0] + 1] outarr = make_array( dimen = [ncol,nrow], /NOZERO, TYPE = type ) output_mask = make_array (dimen = [ncol,nrow], VALUE = 1b);                       Combine the input arrays into the output array.  sm = size(mask)  if N_elements(mask) LT 4 then $ 	 message,'Input mask not valid... must have 3 dimensions'  w = where(sm[0:3] eq s[0:3], cw)  if cw eq 4 then begin     mask_given = 1b   endif else begin     message,'Mask not valid... must be same shape as input cube.'  endelse for j = 0l, (nrow-1) do begin            for i = 0l, (ncol-1) do begin                good_pixels = 1b                          wmask = where(mask[i,j,*],cwm)                       if cwm gt 0 then begin                          marr = inarr[i,j,wmask]                        endif else begin                          good_pixels = 0b                          output_mask[i,j] = 0b                       endelse                  if good_pixels then outarr[i,j] = median(marr,/EVEN)                  endfor endfor  return end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?