code: protected static float[] createGaussianKernel(int radius) {
          if (radius < 1) {
              throw new IllegalArgumentException("Radius must be >= 1");
          }
  
          float[] data = new float[radius * 2 + 1];
  
          float sigma          = radius / 3.0f;
          float twoSigmaSquare = 2.0f * sigma * sigma;
          float sigmaRoot      = (float) Math.sqrt(twoSigmaSquare * Math.PI);
          float total          = 0.0f;
  
          for (int i = -radius; i <= radius; i++) {
              float distance = i * i;
              int   index    = i + radius;
  
              data[index] =  (float) Math.exp(-distance / twoSigmaSquare) / sigmaRoot;
              total       += data[index];
          }
  
          for (int i = 0; i < data.length; i++) {
              data[i] /= total;
          }
  
          return data;
      }
docs: Create a Gaussian kernel for the transformation.
  
  @param  radius the kernel radius.
  
  @return the Gaussian kernel.