this method    sawtoottImage() is undefined for the type ImageReader. fix this. }
			else if (e.getSource() == sawtooth1Button) {
			sawtoottImage();
			}// Гистограмма для sawtoottImage()
			private void sawtoothImage() {
				if (image != null) {
				float t1 = userInput("Введите значение порога 1: ", 0, 1); // Запрос значения первого порога
				float t2 = userInput("Введите значение порога 2: ", 0, 1); // Запрос значения второго порога

				BufferedImage sawtoothContrastImage = sawtoothContrast(image, t1, t2); // Вызов функции пилообразного контрастирования с порогами

				setImageIcon(sawtoothContrastImage);
				saveImage(sawtoothContrastImage);

				// Создаем гистограмму исходного изображения
				int[] histogram = new int[256];
				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);
				histogram[brightness]++;
				}
				}

				// Создаем гистограмму преобразованного изображения
				int[] sawtoothHistogram = new int[256];
				for (int i = 0; i < sawtoothContrastImage.getWidth(); i++) {
				for (int j = 0; j < sawtoothContrastImage.getHeight(); j++) {
				int pixel = sawtoothContrastImage.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);
				sawtoothHistogram[brightness]++;
				}
				}

				// Создаем окно для отображения гистограмм
				JFrame histogramFrame = new JFrame("Гистограммы");
				histogramFrame.setLayout(new GridLayout(1, 2, 10, 10));

				// Создаем панель для гистограммы исходного изображения
				JPanel histogramPanel1 = new JPanel() {
				@Override
				protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				int max = Arrays.stream(histogram).max().getAsInt();
				for (int i = 0; i < 256; i++) {
				int height = (int) (300.0 * histogram[i] / max);
				g.fillRect(i, 300 - height, 1, height);
				}
				}
				};
				histogramPanel1.setPreferredSize(new Dimension(256, 300));

				// Создаем панель для гистограммы преобразованного изображения
				JPanel histogramPanel2 = new JPanel() {
				@Override
				protected void paintComponent(Graphics g) {
				super.paintComponent(g);
				int max = Arrays.stream(sawtoothHistogram).max().getAsInt();
				for (int i = 0; i < 256; i++) {
				int height = (int) (300.0 * sawtoothHistogram[i] / max);
				g.fillRect(i, 300 - height, 1, height);
				}
				}
				};
				histogramPanel2.setPreferredSize(new Dimension(256, 300));

				histogramFrame.add(new JLabel("Гистограмма исходного изображения"));
				histogramFrame.add(new JLabel("Гистограмма после контрастирования"));
				histogramFrame.add(histogramPanel1);
				histogramFrame.add(histogramPanel2);
				histogramFrame.pack();
				histogramFrame.setLocationRelativeTo(null);
				histogramFrame.setVisible(true);
				}
				}
 
		 private BufferedImage sawtoothContrast(BufferedImage image, float t1, float t2) {
			 BufferedImage sawtoothContrastImage = new BufferedImage(image.getWidth(), image.getHeight(),
			 BufferedImage.TYPE_INT_RGB);
			 int[][] LUT = new int[256][3];
			 int step = 256 / 5;
			 int k = 0;
			 for (int i = 0; i < 256; i++) {
			 LUT[i][0] = LUT[i][1] = LUT[i][2] = k;
			 if ((i + 1) % step == 0) {
			 k += 51;
			 }
			 }
			 for (int i = 0; i < image.getWidth(); i++) {
			 for (int j = 0; j < image.getHeight(); j++) {
			 int rgb = image.getRGB(i, j);
			 int r = (rgb >> 16) & 0xff;
			 int g = (rgb >> 8) & 0xff;
			 int b = rgb & 0xff;
			 // новые значения яркости
			 int brightness = (int) (0.2126 * r + 0.7152 * g + 0.0722 * b);
			 int newBrightness;
			 if (brightness < t1) {
			 newBrightness = LUT[brightness * 255][0];
			 } else if (brightness >= t1 && brightness < t2) {
			 newBrightness = LUT[(int) (((brightness - t1) / (t2 - t1)) * 255)][1];
			 } else {
			 newBrightness = LUT[(int) ((brightness - t2) / (1 - t2) * 255)][2];
			 }
			 int newRGB = (newBrightness << 16) | (newBrightness << 8) | newBrightness;
			 sawtoothContrastImage.setRGB(i, j, newRGB);
			 }
			 }
			 return sawtoothContrastImage;
			 }
		 
		 private float userInput(String message, float lowerBound, float upperBound) {
			 boolean valid = false;
			 float value = 0;
			 while (!valid) {
			 String input = JOptionPane.showInputDialog(message);
			 try {
			 value = Float.parseFloat(input);
			 if (value >= lowerBound && value <= upperBound) {
			 valid = true;
			 } else {
			 JOptionPane.showMessageDialog(null, "Значение должно быть от " + lowerBound + " до " + upperBound);
			 }
			 } catch (NumberFormatException e) {
			 JOptionPane.showMessageDialog(null, "Ошибка ввода. Попробуйте еще раз.");
			 } catch (NullPointerException e) {
			 System.exit(1);
			 }
			 }
			 return value;
			 }