/** Adds Gaussian/normal i.i.d noise to each pixel in the image. */
  public static void addGaussian(ImageSInt16 img, Random rand, double sigma, int min, int max) {
    final int h = img.getHeight();
    final int w = img.getWidth();

    short[] data = img.data;

    for (int y = 0; y < h; y++) {
      int index = img.getStartIndex() + y * img.getStride();
      for (int x = 0; x < w; x++) {
        int value = (data[index]) + (int) (rand.nextGaussian() * sigma);
        if (value < min) value = min;
        if (value > max) value = max;

        data[index++] = (short) value;
      }
    }
  }
  /** Adds uniform i.i.d noise to each pixel in the image. Noise range is min <= X < max. */
  public static void addUniform(ImageSInt16 img, Random rand, int min, int max) {
    final int h = img.getHeight();
    final int w = img.getWidth();

    int range = max - min;

    short[] data = img.data;

    for (int y = 0; y < h; y++) {
      int index = img.getStartIndex() + y * img.getStride();
      for (int x = 0; x < w; x++) {
        int value = (data[index]) + rand.nextInt(range) + min;
        if (value < -32768) value = -32768;
        if (value > 32767) value = 32767;

        data[index++] = (short) value;
      }
    }
  }