Сделай четыре кнопки, которые будут выполнять следующие Пилообразное контрастирование: 1) одна пила вверх; 2)одна пил в вниз; 3) две пилы в разные стороны; 4) 3 три пилы. Также гистограмма для каждой кнопки для исходного и преобразованного изображения. // Гистограмма для sawtoottImage()
	private JButton openButton, processButton, brightness1Button,brightness2Button, contrast1Button,contrast2Button,contrast3Button, sawtooth1Button, gaussButton,cannyButton;
	private JLabel imageLabel;
	private BufferedImage image;
	private BigDecimal imageWidth, imageHeight;

	public ImageReader() {
		super("Image Reader");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// initialize imageWidth and imageHeight to zero to avoid NullPointerException
		imageWidth = BigDecimal.ZERO;
		imageHeight = BigDecimal.ZERO;

		openButton = new JButton("Open");
		openButton.addActionListener(this);

		processButton = new JButton("Process");
		processButton.addActionListener(this);

		brightness1Button = new JButton("Brightness N1");
		brightness1Button.addActionListener(this);
		
		brightness2Button = new JButton("Brightness N2");
		brightness2Button.addActionListener(this);
		
		contrast1Button = new JButton("Contrasts Н1");
		contrast1Button.addActionListener(this);
		
		contrast2Button = new JButton("Contrasts Н2");
		contrast2Button.addActionListener(this);
		
		contrast3Button = new JButton("Contrasts Н3");
		contrast3Button.addActionListener(this);
		
		sawtooth1Button = new JButton("Sawtooth N1");
		sawtooth1Button.addActionListener(this);
		
		gaussButton = new JButton("Gauss");
		gaussButton.addActionListener(this);
		
		cannyButton = new JButton("Canny");
		cannyButton.addActionListener(this);
		
		

		imageLabel = new JLabel();
		imageLabel.setVerticalAlignment(JLabel.CENTER);
		imageLabel.setHorizontalAlignment(JLabel.CENTER);

		JPanel buttonPanel = new JPanel();
		buttonPanel.add(openButton);
		buttonPanel.add(processButton);
		buttonPanel.add(brightness1Button);
		buttonPanel.add(brightness2Button);
		buttonPanel.add(contrast1Button);
		buttonPanel.add(contrast2Button);
		buttonPanel.add(contrast3Button);
		buttonPanel.add(sawtooth1Button);
		buttonPanel.add(gaussButton);
		buttonPanel.add(cannyButton);
		public void actionPerformed(ActionEvent e) {
			if (e.getSource() == openButton) {
			openImage();
			} else if (e.getSource() == processButton) {
			processImage();
			
			 File processFile = new File(".bmp");
           
             try {
                 ImageIO.write(image, "BMP", processFile);
               
             } catch (IOException ex) {
                 JOptionPane.showMessageDialog(this, "Ошибка сохранения изображения");
             }
         
     
			
			} else if (e.getSource() == brightness1Button) {
			brightnessImage();

			}
			
			else if (e.getSource() == brightness2Button) {
				brightness1Image();

				}
			
			else if (e.getSource() == contrast1Button) {
			contrastImage();
			}
			
			else if (e.getSource() == contrast2Button) {
				contrast2Image();
				}
			
			else if (e.getSource() == contrast3Button) {
				contrast3Image();
				}
			else if (e.getSource() == sawtooth1Button) {
				sawtoothImage();
			}
			else if (e.getSource() == gaussButton) {
			gaussImage();
			}

			else if (e.getSource() == cannyButton) {
			cannyImage();
			}

			
			
			}

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);
if (brightness >= 0 && brightness < 256) {
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);
}
}