переделай код, чтобы делалась гистограмма для исходных и преобразованных изображений.  	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == openButton) {
			openImage();
		} else if (e.getSource() == processButton) {
			processImage();
		} else if (e.getSource() == brightnessButton) {
			brightnessImage();
				
		}
		else if (e.getSource() == contrastButton) {
			contrastImage();
	}
		else if (e.getSource() == sawtoothButton) {
			sawtoottImage();
	}
		else if (e.getSource() == gaussButton) {
			gaussImage();
	}
	
		else if (e.getSource() == cannyButton) {
			cannyImage();
	}
		
		else if (e.getSource() == histogramButton) {
			histogramImage();
	}
		
	}
	
	private void histogramImage() {
		// Создаем гистограмму исходного изображения
		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[] transformedHistogram = new int[256];
		// Создаем преобразованное изображение
		BufferedImage transformedImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
		// Ваш код, который преобразует исходное изображение, должен находиться здесь и сохранять результаты в transformedImage
		for (int i = 0; i < transformedImage.getWidth(); i++) {
		for (int j = 0; j < transformedImage.getHeight(); j++) {
		int pixel = transformedImage.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);
		transformedHistogram[brightness]++;
		}
		}

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

		// Создаем панель для первой гистограммы (исходного изображения)
		JPanel histogramPanel1 = new JPanel();
		histogramPanel1.setLayout(new BorderLayout());
		histogramPanel1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Исходное изображение"));

		// Создаем компонент для рисования гистограммы исходного изображения
		JPanel histogramComponent1 = 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);
		}
		}
		};
		histogramComponent1.setPreferredSize(new Dimension(256, 300));

		histogramPanel1.add(histogramComponent1, BorderLayout.CENTER);

		// Создаем панель для второй гистограммы (преобразованного изображения)
		JPanel histogramPanel2 = new JPanel();
		histogramPanel2.setLayout(new BorderLayout());
		histogramPanel2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "Преобразованное изображение"));

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

		histogramPanel2.add(histogramComponent2, BorderLayout.CENTER);

		histogramFrame.add(histogramPanel1);
		histogramFrame.add(histogramPanel2);
		histogramFrame.pack();
		histogramFrame.setLocationRelativeTo(null);
		histogramFrame.setVisible(true);
		}
	private void processImage() {
		if (image != null) {
			BufferedImage binarizedImage = binarizeImage(image);
			setImageIcon(binarizedImage);
		}
	}
	private void brightnessImage() {
		if (image != null) {
			BufferedImage brightnessSliceImage = brightnessSlice(image, 100, 200); // яркость в диапазоне [100, 200]
			setImageIcon(brightnessSliceImage);
		}
	}
	private void contrastImage() {
		if (image != null) {
		BufferedImage contrastStretchedImage = linearContrastStretch(image);
		setImageIcon(contrastStretchedImage);
		}
		}
	
	private void sawtoottImage() {
		if (image != null) {
		BufferedImage[] sawtoothContrastImages = new BufferedImage[4];
		sawtoothContrastImages[0] = sawtoothContrast(image, 0.2f, 0.8f, 1f);
		// Пилообразное контрастирование с различными значениями коэффициента наклона
		sawtoothContrastImages[1] = sawtoothContrast(image, 0.5f, 0.5f, 1f);
		sawtoothContrastImages[2] = sawtoothContrast(image, 0.75f, 0.25f, 1f);
		sawtoothContrastImages[3] = sawtoothContrast(image, 0.9f, 0.1f, 1f);
		// Выводим четыре пилообразных контраста
		for(int i=0;i<4;i++) {
		ImageIcon icon = new ImageIcon(sawtoothContrastImages[i]);
		JOptionPane.showMessageDialog(this, icon, "Sawtooth Contrast "+(i+1), JOptionPane.INFORMATION_MESSAGE);
		}
		setImageIcon(sawtoothContrastImages[0]);
		}
		}
	
	
	private void gaussImage() {
		if (image != null) {
		String inputMask = JOptionPane.showInputDialog(this, "Enter a mask size (odd number):");
		int maskSize = Integer.parseInt(inputMask);
		float[][] mask = gaussianMask(maskSize, maskSize/2);
		BufferedImage gaussImage = applyMask(image, mask);
		setImageIcon(gaussImage);
		}
		}
	

	private void cannyImage() {
		if (image != null) {
		String inputMask = JOptionPane.showInputDialog(this, "Enter a mask size (odd number):");
		int maskSize = Integer.parseInt(inputMask);
		BufferedImage cannyImage = cannyDetector(image, maskSize);
		setImageIcon(cannyImage);
		}
		}