Переделай код, чтобы пила направлена вниз.  // Гистограмма для 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, 1);
					t2 = userInput("Введите значение порога 2: ", 0, 1);
					if (t2 > t1) {
					// Применяем контрастирование для всех значений, превышающих пороги
					for (int y = 0; y < sawtoothContrastImage.getHeight(); y++) {
					for (int x = 0; x < sawtoothContrastImage.getWidth(); x++) {
					int rgb = image.getRGB(x, y);
					int red = (rgb >> 16) & 0xFF;
					int green = (rgb >> 8) & 0xFF;
					int blue = rgb & 0xFF;
					if (red < t1 * 255) {
					red = 0;
					} else if (red < t2 * 255) {
					red = (int) (((red - t1 * 255) / (t2 - t1)) * 255);
					} else {
					red = 255;
					}
					if (green < t1 * 255) {
					green = 0;
					} else if (green < t2 * 255) {
					green = (int) (((green - t1 * 255) / (t2 - t1)) * 255);
					} else {
					green = 255;
					}
					if (blue < t1 * 255) {
					blue = 0;
					} else if (blue < t2 * 255) {
					blue = (int) (((blue - t1 * 255) / (t2 - t1)) * 255);
					} else {
					blue = 255;
					}
					sawtoothContrastImage.setRGB(x, y, (red << 16) | (green << 8) | blue);
					}
					}
					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;
		 }