Cannot make a static reference to the non-static method sawtoothContrastUp(BufferedImage, float, float) from the type ImageReader. FIx this.  
					// Гистограмма для sawtooth3Image()
					private void sawtooth3Image() {
					if (image != null) {
					BufferedImage combinedImage = 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) {
					BufferedImage sawtoothContrastImage1 = ImageReader.sawtoothContrastUp(image, t1, t2); // Применяем контрастирование для верхней пилы
					BufferedImage sawtoothContrastImage2 = ImageReader.sawtoothContrastDown(image, t1, t2); // Применяем контрастирование для нижней пилы

					// Объединяем полученные изображения
					for (int y = 0; y < combinedImage.getHeight(); y++) {
					for (int x = 0; x < combinedImage.getWidth(); x++) {
					int rgb1 = sawtoothContrastImage1.getRGB(x, y);
					int rgb2 = sawtoothContrastImage2.getRGB(x, y);
					int red1 = (rgb1 >> 16) & 0xFF;
					int green1 = (rgb1 >> 8) & 0xFF;
					int blue1 = rgb1 & 0xFF;
					int red2 = (rgb2 >> 16) & 0xFF;
					int green2 = (rgb2 >> 8) & 0xFF;
					int blue2 = rgb2 & 0xFF;
					int red, green, blue;

					// В зависимости от положения пикселя на изображении выбираем соответствующий цвет
					if (y < image.getHeight() / 2) {
					red = red1;
					green = green1;
					blue = blue1;
					} else {
					red = red2;
					green = green2;
					blue = blue2;
					}

					combinedImage.setRGB(x, y, (red << 16) | (green << 8) | blue);
					}
					}

					valid = true;
					} else {
					JOptionPane.showMessageDialog(null, "Значение порога 2 должно быть больше порога 1");
					}
					}

					setImageIcon(combinedImage);
					saveImage(combinedImage);

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

					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 sawtoothContrastUp(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(0, 0, 0).getRGB());
		 } else if (brightness >= t1 && brightness < t2) {
		 int value = (int) (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(255, 255, 255).getRGB());
		 }
		 }
		 }
		 return output;
		 }