docs: protected void declareDataStructures(PyramidDiscrete<I> image) {
  		numPyramidLayers = image.getNumLayers();
  
  		previousDerivX = (D[])Array.newInstance(derivType,image.getNumLayers());
  		previousDerivY = (D[])Array.newInstance(derivType,image.getNumLayers());
  		currentDerivX = (D[])Array.newInstance(derivType,image.getNumLayers());
  		currentDerivY = (D[])Array.newInstance(derivType,image.getNumLayers());
  
  		for( int i = 0; i < image.getNumLayers(); i++ ) {
  			int w = image.getWidth(i);
  			int h = image.getHeight(i);
  
  			previousDerivX[i] = GeneralizedImageOps.createSingleBand(derivType, w, h);
  			previousDerivY[i] = GeneralizedImageOps.createSingleBand(derivType, w, h);
  			currentDerivX[i] = GeneralizedImageOps.createSingleBand(derivType, w, h);
  			currentDerivY[i] = GeneralizedImageOps.createSingleBand(derivType, w, h);
  		}
  
  		Class imageClass = image.getImageType().getImageClass();
  		previousImage = FactoryPyramid.discreteGaussian(image.getScales(), -1, 1, false, ImageType.single(imageClass));
  		previousImage.initialize(image.getInputWidth(), image.getInputHeight());
  
  		for( int i = 0; i < tracks.length; i++ ) {
  			Track t = new Track();
  			t.klt = new PyramidKltFeature(numPyramidLayers,featureRadius);
  			tracks[i] = t;
  		}
  	}