local variable minBrightness defined in an enclosing scope must be final. fix this.  
			private void contrast2Image() {
				if (image != null) {
				BufferedImage contrastStretchedImage = linearContrastStretch_H2(image);
				setImageIcon(contrastStretchedImage);
				saveImage(contrastStretchedImage);

				// Создаем гистограмму исходного изображения
				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[] contrastStretchedHistogram = new int[256];
				// Переменные для минимального и максимального значений яркости
				int minBrightness = 255;
				int maxBrightness = 0;
				for (int i = 0; i < contrastStretchedImage.getWidth(); i++) {
				for (int j = 0; j < contrastStretchedImage.getHeight(); j++) {
				int pixel = contrastStretchedImage.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 < minBrightness) {
				minBrightness = brightness;
				}
				if (brightness > maxBrightness) {
				maxBrightness = brightness;
				}
				contrastStretchedHistogram[brightness]++;
				}
				}

				// Создаем окно для отображения гистограмм
				JFrame histogramFrame = new JFrame("Гистограммы");
				histogramFrame.setLayout(new GridLayout(2, 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(contrastStretchedHistogram).max().getAsInt();
				for (int i = 0; i < 256; i++) {
				// Применяем линейное растяжение контраста к гистограмме
				int newBrightness = (int) (255.0 * (i - minBrightness) / (maxBrightness - minBrightness));
				int height = (int) (300.0 * contrastStretchedHistogram[newBrightness] / 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 linearContrastStretch_H2(BufferedImage image) {
			// Проходим по всем пикселям изображения и находим минимальное и максимальное значение яркости
			int minBrightness = 255;
			int maxBrightness = 0;
			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 < minBrightness) {
			minBrightness = brightness;
			}
			if (brightness > maxBrightness) {
			maxBrightness = brightness;
			}
			}
			}
			BufferedImage contrastStretchedImage = 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);
			// Вычисляем новое значение яркости с помощью линейного растяжения контраста
			int newBrightness = (int) (255.0 * (brightness - minBrightness) / (maxBrightness - minBrightness));
			// Создаем новый пиксель с измененным значением яркости
			int newPixel = (255 << 24) | (newBrightness << 16) | (newBrightness << 8) | newBrightness;
			contrastStretchedImage.setRGB(i, j, newPixel);
			}
			}
			// Возвращаем изображение с примененным линейным растяжением контраста
			return contrastStretchedImage;
			}