section of routines in detect.i

functions in detect.i -

 
 
 
find_1d_minmax


             find_1d_minmax(a)  
 
      -or- find_1d_minmax(a, what)  
    Find local minima/maxima in 1-D array  A.  If WHAT is nil or zero, the  
    function returns an array of integers  with same shape as A and set to  
    +1 where A is a local maximum, to -1 where A is a local minimum and to  
    0  elsewhere.  Otherwise, the  function returns  the indices  of local  
    maxima or local minima depending  whether WHAT is positive or negative  
    (the result may be empty).  WHAT may also be a string: "any", "min" or  
    "max".  
    
    Contiguous extrema,  say a  local maximum LOCMAX  and a  local minimum  
    LOCMIN, are separated by a strict hysteresis (or a gap) such that:  
    
       LOCMAX - LOCMIN > HYSTERESIS*(max(A) - min(A)) >= 0  
    
    The default  is HYSTERESIS=0, i.e. all strict  local minima/maxima are  
    detected.  However,  in order  to avoid being  too sensitive  to local  
    extrema  (for  instance  because  of  noise), the  hysteresis  of  the  
    algorithm  can  be  adjusted  by  keywords INF,  SUP,  ALEV,  RLEV  or  
    HYSTERESIS.   Note  that  the   easiest  keywords  to  play  with  are  
    HYSTERESIS or ATOL and RTOL (SUP and INF are more tricky to use).  
    
    HYSTERESIS = level of hysteresis  relative to peak-to-peak value of A.  
          HYSTERESIS   must   be  conformable   with   A  and   everywhere  
          non-negative (this  is not checked).  HYSTERESIS  is another way  
          to  specify the absolute  tolerance and  is only  significant if  
          ALEV is not specified.   Specifying HYSTERESIS gives an absolute  
          tolerance:  
             ALEV = (max(A) - min(A))*HYSTERESIS.  
          Hence the lower  is the hysteresis, the more  local extrema will  
          be  detected.   As  a  rule  of  thumb, a  good  value  for  the  
          hysteresis is the 3-4 divided by the signal-to-noise-ratio.  
    
    ALEV = absolute level of  hysteresis.  ALEV must be conformable with A  
          and such that  ALEV >= 0 everywhere (this  is not checked).  The  
          default is  the same as with ALEV=0  (unless  keyword HYSTERESIS  
          is specified).  
    
    RLEV = relative level of hysteresis.  RLEV must be conformable with A  
          and such  that 0 <= RLEV  < 1 everywhere (this  is not checked).  
          The default is the same as with RLEV=0.  
    
    INF = inferior  bound with respect to  a maximum: A(i) may  be a local  
          maximum with respect to A(j) if  and only if A(j) < INF(i).  INF  
          must  have the  same number  of elements  as A.   If INF  is not  
          specified,  it is  computed from  the  value of  ALEV and  RLEV.  
          Given ALEV and RLEV, the inferior bound is:  
              INF = A - (ALEV + RLEV*abs(A))  
    
    SUP = superior  bound with respect to  a minimum: A(i) may  be a local  
          minimum with respect to A(j) if  and only if A(j) > SUP(i).  SUP  
          must  have the  same number  of elements  as A.   If SUP  is not  
          specified,  it is  computed from  the  value of  ALEV and  RLEV.  
          Given ALEV and RLEV, the superior bound is such that:  
              A = SUP - (ALEV + RLEV*abs(SUP))  
          or:  
              SUP = (A + ALEV)/(1 - sign(SUP)*RLEV)  
          since 0 <= RLEV < 1  then SUP has the same  sign as A + ALEV and  
          finally:  
              SUP = (A + ALEV)/(1 - sign(A + ALEV)*RLEV)  
    
SEE ALSO: plot_1d_minmax  
 
 
 
find_2d_max


             map = find_2d_max(img)  
 
     Find disjoint  local maxima in  2-D array IMG  and return an  array of  
     integers MAP with same shape as IMG and set as follow:  
         MAP(x,y) = -1       for bad pixels (or strictly above CMAX)  
         MAP(x,y) =  0       for pixels not assigned to any local maximum  
         MAP(x,y) =  N (N>0) for pixels assigned to N-th local maximum  
     The  maxima  are  labelled  from   the  higher  to  the  lower.  Hence  
     where(MAP==1) gives the indices of pixels around the stronger maximum.  
     The selection  works as follows.   The algorithm starts with  the next  
     (unassigned) higher maximum and  then marks all connected pixels which  
     are greater or equal to a given  threshold.  If a bad pixel or a pixel  
     already assigned to another  maximum is encountered during this stage,  
     the algorithm  gives up this maximum  and proceeds with  the next one.  
     Otherwise,  the marked  region  is  assigned to  the  maximum and  the  
     algorithm proceeds with the  next one.  This algorithm guarantees that  
     the marked regions are all separated (by at least one pixel) from each  
     other and from any bad pixel.  The threshold reads:  
         THRESHOLD = PEAK - RLEV*abs(PEAK) - ALEV  
     where PEAK is the current  maximum, ALEV (ALEV>=0 everywhere) and RLEV  
     (0<=RLEV<1 everywhere) are the absolute and relative threshold levels.  
     ALEV and RLEV are given by keyword. By default, ALEV=0 and RLEV=0.  
       
     Keyword CMIN can be used to  set the minimum value of a local maximum.  
     Since searching all  maxima may be prohibitively long,  it is strongly  
     recommended to limit the depth of the search by the keyword CMIN.  
     Keywords BAD  and/or CMAX can be used  to mark as bad  pixels the ones  
     for which BAD is non-zero and/or which are (strictly) above CMAX.  
     If  specified, keywords ALEV,  RLEV, CMIN,  CMAX and  BAD must  all be  
     conformable with  IMG; you can  therefore setup things on  a per-pixel  
     basis, or columnwise, or rowwise...  
       
  EXAMPLE:    
     For instance, if SIGMA is the standard deviation of noise in the image  
     and  BACKGROUND is  its background  level (both  could  be pixelwise),  
     then:  
         find_2d_max(IMG, cmin=BACKGROUND+3*SIGMA, alev=4*SIGMA)  
     will find all the maxima in  IMG which are above the background with a  
     3 SIGMA  confidence level  and mark the  regions around  every maximum  
     (with value PEAK) where connected pixels are such that:  
         IMG >= PEAK - 4*SIGMA  
   HINTS:  
     1. Use  keyword CMIN  to limit  the  search (possibly  on a  per-pixel  
        basis).  
     2. The search  necessitates to sort  the pixels elligible to  be local  
        maxima (all which are above CMIN,  below CMAX and not in BAD), this  
        sorting can be very long for large images (again use CMIN) but also  
        for integer valued images  (a drawback of the quicksort algorithm?)  
        to overcome this  it is sufficient to add a  small amount of random  
        noise in the image, for instance:  
            find_2d_max(IMG + 1e-9*(random(dimsof(IMG)) - 0.5), ...)  
        but beware that this can make the result (slightly) inpredictible.  
        
SEE ALSO: sort,   find_1d_minmax  
 
 
 
plot_1d_minmax


             plot_1d_minmax, y;  
 
       -or- plot_1d_minmax, y, x;  
       -or- plot_1d_minmax, y, x, list;  
     Plot (X,Y) curve with local minima/maxima.  LIST is the list of  
     extrema as returned by find_1d_minmax; if LIST is nil, find_1d_minmax  
     is used to find the extrema (with argument Y, and values of keywords  
     WHAT, INF, SUP, ALEV, RLEV and/or HYSTERESIS).  
     Unless keyword NOCURVE is true, the curve (X,Y) is plotted as well  
     (with values of keywords TYPE, WIDTH and/or COLOR).  
     Keywords SYMBOL, SIZE, FILL, and COLOR can be used to customize the  
     plotting of local minima/maxima.  If SYMBOL is unspecified and both  
     minima and maxima are to be plotted, triangles pointing to the top (to  
     the bottom) will be used to display maxima (minima).  
     When called as a function, actual LIST is returned.  
SEE ALSO: find_1d_minmax,   plp,   plg