docs: private void computeDerivatives(double sigma) {
  		this.Lx2 = new float[width][height];
  		this.Ly2 = new float[width][height];
  		this.Lxy = new float[width][height];
  
  		float[][][] grad = new float[width][height][];
  		for (int y = 0; y < height; y++)
  			for (int x = 0; x < width; x++)
  				grad[x][y] = sobel(x, y);
  
  		int radius = (int) (2 * sigma);
  		int window = 1 + 2 * radius;
  		float[][] gaussian = new float[window][window];
  		for (int j = -radius; j <= radius; j++)
  			for (int i = -radius; i <= radius; i++)
  				gaussian[i + radius][j + radius] = (float) gaussian(i, j, sigma);
  
  		for (int y = 0; y < height; y++) {
  			for (int x = 0; x < width; x++) {
  
  				for (int dy = -radius; dy <= radius; dy++) {
  					for (int dx = -radius; dx <= radius; dx++) {
  						int xk = x + dx;
  						int yk = y + dy;
  						if (xk < 0 || xk >= width)
  							continue;
  						if (yk < 0 || yk >= height)
  							continue;
  
  						double gw = gaussian[dx + radius][dy + radius];
  
  						this.Lx2[x][y] += gw * grad[xk][yk][0]
  								* grad[xk][yk][0];
  						this.Ly2[x][y] += gw * grad[xk][yk][1]
  								* grad[xk][yk][1];
  						this.Lxy[x][y] += gw * grad[xk][yk][0]
  								* grad[xk][yk][1];
  					}
  				}
  			}
  		}
  	}