code: public void process(GrayF32 intensity , GrayS8 direction , float lower , float upper ) {
  		if( lower < 0 )
  			throw new IllegalArgumentException("Lower must be >= 0!");
  		InputSanityCheck.checkSameShape(intensity, direction);
  
  		// set up internal data structures
  		this.intensity = intensity;
  		this.direction = direction;
  		this.lower = lower;
  		queuePoints.reset();
  		contours.clear();
  
  		// step through each pixel in the image
  		for( int y = 0; y < intensity.height; y++ ) {
  			int indexInten = intensity.startIndex + y*intensity.stride;
  
  			for( int x = 0; x < intensity.width; x++ , indexInten++ ) {
  				// start a search if a pixel is found that's above the threshold
  				if( intensity.data[indexInten] >= upper ) {
  					trace( x,y,indexInten);
  				}
  			}
  		}
  	}
docs: Performs hysteresis thresholding using the provided lower and upper thresholds.
  
  @param intensity Intensity image after edge non-maximum suppression has been applied.  Modified.
  @param direction 4-direction image.  Not modified.
  @param lower Lower threshold.
  @param upper Upper threshold.