из этого кода. 
    private static void eight(Mat image, int t1, int t2) {
        for (int i = 0; i < image.rows(); i++)
            for (int j = 0; j < image.cols(); j++) {
                double[] data = image.get(i, j);

                for (int p = 0; p < image.channels(); p++) {
                    int cell = (int) (255 * (data[p] - (double) t1) / ((double) t2 - (double) t1));
                    if ((double) t2 >= data[p] && data[p] >= (double) t1) data[p] = cell;
                    else data[p] = 255;
                }

                image.put(i, j, data);
            }
 Переделать в этот код // Гистограмма для sawtooth2Image()
				
				private void sawtooth2Image() {
				if (image != null) {
				// Создаем копию исходного изображения
				BufferedImage sawtoothContrastImage = deepCopy(image);

				// Запрос значения порогов в цикле до тех пор, пока пользователь не введет правильные значения
				float t1 = 0, t2 = 0;
				boolean valid = false;
				while (!valid) {
				t1 = userInput("Введите значение порога 1: ", 0, 255);
				t2 = userInput("Введите значение порога 2: ", 0, 255);
				if (t2 > t1) {
				sawtoothContrastImage = sawtoothContrastDown(image, t1, t2);
				valid = true;
				} else {
				JOptionPane.showMessageDialog(null, "Значение порога 2 должно быть больше порога 1");
				}
				}

				setImageIcon(sawtoothContrastImage);
				saveImage(sawtoothContrastImage);

				int[] originalHistogram = ImageReader.getImageHistogram(image);
				int[] sawtoothHistogram = ImageReader.getImageHistogram(sawtoothContrastImage);

				JFrame histogramFrame = new JFrame("Гистограммы");
				histogramFrame.setLayout(new GridLayout(1, 2, 10, 10));

				JPanel originalHistogramPanel = ImageReader.createHistogramPanel(originalHistogram, "Гистограмма исходного изображения");

				JPanel sawtoothHistogramPanel = ImageReader.createHistogramPanel(sawtoothHistogram, "Гистограмма после контрастирования");

				histogramFrame.add(originalHistogramPanel);
				histogramFrame.add(sawtoothHistogramPanel);
				histogramFrame.pack();
				histogramFrame.setLocationRelativeTo(null);
				histogramFrame.setVisible(true);
				}
				}

					// Создание глубокой копии изображения
					private BufferedImage deepCopy1(BufferedImage image) {
					ColorModel colorModel = image.getColorModel();
					boolean isAlphaPremultiplied = colorModel.isAlphaPremultiplied();
					WritableRaster raster = image.copyData(image.getRaster().createCompatibleWritableRaster());
					return new BufferedImage(colorModel, raster, isAlphaPremultiplied, null);
					}
// Функция пилообразного контрастирования с порогами и направлением вниз
		 private BufferedImage sawtoothContrastDown(BufferedImage image, float t1, float t2) {
		 BufferedImage output = new BufferedImage(image.getWidth(), image.getHeight(), image.getType());
		 for (int i = 0; i < image.getWidth(); i++) {
		 for (int j = 0; j < image.getHeight(); j++) {
		 int pixel = image.getRGB(i, j);
		 int red = (pixel >> 16) & 0xff;
		 int green = (pixel >> 8) & 0xff;
		 int blue = pixel & 0xff;
		 int brightness = (int) (0.2126 * red + 0.7152 * green + 0.0722 * blue);
		 if (brightness < t1) {
		 output.setRGB(i, j, new Color(255, 255, 255).getRGB());
		 } else if (brightness >= t1 && brightness < t2) {
		 int value = (int) (255 - 255 * (brightness - t1) / (t2 - t1));
		 output.setRGB(i, j, new Color(value, value, value).getRGB());
		 } else if (brightness >= t2) {
		 output.setRGB(i, j, new Color(0, 0, 0).getRGB());
		 }
		 }
		 }
		 return output;
		 }