Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems: 
	The method getHistogram(BufferedImage) is undefined for the type ImageReader
	The method createHistogramPanel(int[], String) is undefined for the type ImageReader
Fix this. // Гистограмма для sawtooth1Image()
			private void sawtooth1Image() {
			if (image != null) {
			// Запрос значения порогов в цикле до тех пор, пока пользователь не введет правильные значения
			float t1 = 0, t2 = 0;
			boolean valid = false;
			while (!valid) {
			t1 = userInput("Введите значение порога 1: ", 0, 1);
			t2 = userInput("Введите значение порога 2: ", 0, 1);
			if (t2 > t1) {
			valid = true;
			} else {
			JOptionPane.showMessageDialog(null, "Значение порога 2 должно быть больше порога 1");
			}
			}

			BufferedImage sawtoothContrastImage = sawtoothContrastUp(image, t1, t2);

			setImageIcon(sawtoothContrastImage);
			saveImage(sawtoothContrastImage);

			int[] originalHistogram = getHistogram(image);
			int[] sawtoothHistogram = getHistogram(sawtoothContrastImage);

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

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

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

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

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

			BufferedImage sawtoothContrastImage = sawtoothContrastDown(image, t1, t2);

			setImageIcon(sawtoothContrastImage);
			saveImage(sawtoothContrastImage);

			int[] originalHistogram = getHistogram(image);
			int[] sawtoothHistogram = getHistogram(sawtoothContrastImage);

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

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

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

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

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

			BufferedImage sawtoothContrastImage1 = sawtoothContrastUp(image, t1, t2);

			BufferedImage sawtoothContrastImage2 = sawtoothContrastDown(image, t1, t2);

			BufferedImage combinedImage = combineImages(sawtoothContrastImage1, sawtoothContrastImage2);

			setImageIcon(combinedImage);
			saveImage(combinedImage);

			int[] originalHistogram = getHistogram(image);
			int[] sawtoothHistogram = getHistogram(combinedImage);

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

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

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

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

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

			BufferedImage sawtoothContrastImage1 = sawtoothContrastUp(image, t1, t2);

			BufferedImage sawtoothContrastImage2 = sawtoothContrastDown(image, t1, t2);

			BufferedImage combinedImage = combineImages(sawtoothContrastImage1, sawtoothContrastImage2, sawtoothContrastImage1);

			setImageIcon(combinedImage);
			saveImage(combinedImage);

			int[] originalHistogram = getHistogram(image);
			int[] sawtoothHistogram = getHistogram(combinedImage);

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

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

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

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