docs: @Override
  	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);
  
  			// declare memory for this layer
  			deriv2X.reshape(layer1.width,layer1.height);
  			deriv2Y.reshape(layer1.width,layer1.height);
  			warpDeriv2X.reshape(layer1.width,layer1.height);
  			warpDeriv2Y.reshape(layer1.width,layer1.height);
  			warpImage2.reshape(layer1.width,layer1.height);
  
  			// compute the gradient for the second image
  			gradient.process(layer2,deriv2X,deriv2Y);
  
  			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;
  
  				initFlowX.reshape(layer1.width,layer1.height);
  				initFlowY.reshape(layer1.width,layer1.height);
  				flowX.reshape(layer1.width,layer1.height);
  				flowY.reshape(layer1.width,layer1.height);
  
  				ImageMiscOps.fill(flowX,0);
  				ImageMiscOps.fill(flowY,0);
  				ImageMiscOps.fill(initFlowX,0);
  				ImageMiscOps.fill(initFlowY,0);
  			}
  
  			// compute flow for this layer
  			processLayer(layer1,layer2,deriv2X,deriv2Y);
  		}
  	}