docs: public void process( T image , GrayF32 intensity ) {
  		int maxFeatures = (int)(maxFeaturesFraction*image.width*image.height);
  		candidatesLow.reset();
  		candidatesHigh.reset();
  		this.image = image;
  
  		if( stride != image.stride ) {
  			stride = image.stride;
  			offsets = DiscretizedCircle.imageOffsets(radius, image.stride);
  		}
  		helper.setImage(image,offsets);
  
  		for (int y = radius; y < image.height-radius; y++) {
  			int indexIntensity = intensity.startIndex + y*intensity.stride + radius;
  			int index = image.startIndex + y*image.stride + radius;
  			for (int x = radius; x < image.width-radius; x++, index++,indexIntensity++) {
  
  				int result = helper.checkPixel(index);
  
  				if( result < 0 ) {
  					intensity.data[indexIntensity] = helper.scoreLower(index);
  					candidatesLow.add(x,y);
  				} else if( result > 0) {
  					intensity.data[indexIntensity] = helper.scoreUpper(index);
  					candidatesHigh.add(x,y);
  				} else {
  					intensity.data[indexIntensity] = 0;
  				}
  			}
  			// check on a per row basis to reduce impact on performance
  			if( candidatesLow.size + candidatesHigh.size >= maxFeatures )
  				break;
  		}
  	}