docs: public void process(ImagePyramid<GrayF32> image1 , ImagePyramid<GrayF32> image2 )
  	{
  		// Process the pyramid from low resolution to high resolution
  		boolean first = true;
  		for( int i = image1.getNumLayers()-1; i >= 0; i-- ) {
  			GrayF32 layer1 = image1.getLayer(i);
  			GrayF32 layer2 = image2.getLayer(i);
  
  			resizeForLayer(layer1.width,layer2.height);
  
  			// compute image derivatives
  			gradient.process(layer1,deriv1X,deriv1Y);
  			gradient.process(layer2,deriv2X,deriv2Y);
  			hessian.process(deriv2X,deriv2Y,deriv2XX,deriv2YY,deriv2XY);
  
  			if( !first ) {
  				// interpolate initial flow from previous layer
  				interpolateFlowScale(layer1.width, layer1.height);
  			} else {
  				// for the very first layer there is no information on flow so set everything to 0
  				first = false;
  
  				flowU.reshape(layer1.width, layer1.height);
  				flowV.reshape(layer1.width, layer1.height);
  
  				ImageMiscOps.fill(flowU,0);
  				ImageMiscOps.fill(flowV,0);
  			}
  
  			// compute flow for this layer
  			processLayer(layer1,layer2,deriv1X,deriv1Y,deriv2X,deriv2Y,deriv2XX,deriv2YY,deriv2XY);
  		}
  	}