docs: public static void process(GrayF32 orig,
  							   GrayF32 derivXX,
  							   GrayF32 derivYY,
  							   GrayF32 derivXY) {
  		final float[] data = orig.data;
  		final float[] imgX = derivXX.data;
  		final float[] imgY = derivYY.data;
  		final float[] imgXY = derivXY.data;
  
  		final int width = orig.getWidth();
  		final int height = orig.getHeight() - 2;
  		final int stride = orig.stride;
  
  		for (int y = 2; y < height; y++) {
  			int indexX = derivXX.startIndex + derivXX.stride * y + 2;
  			int indexY = derivYY.startIndex + derivYY.stride * y + 2;
  			int indexXY = derivXY.startIndex + derivXY.stride * y + 2;
  
  			int indexSrc = orig.startIndex + stride * y + 2;
  			
  			final int endX = indexSrc + width - 4;
  
  			for (; indexSrc < endX; indexSrc++) {
  				float center = 2*data[indexSrc];
  				imgX[indexX++] = (data[indexSrc - 2] - center + data[indexSrc + 2]) * 0.5f;
  				imgY[indexY++] = (data[indexSrc - 2*stride] - center + data[indexSrc + 2*stride]) * 0.5f;
  				imgXY[indexXY++] = (data[indexSrc - stride -1] - data[indexSrc - stride + 1]
  						- data[indexSrc + stride - 1] + data[indexSrc + stride + 1]) * 0.5f;
  			}
  		}
  	}