Переделай код, чтобы самому задавать количество зубцов от 1 до 4. И чтобы то, что не входит в пилу, было неизменяемым.
private void sawtooth4Image() {
if (image != null) {
BufferedImage combinedImage = deepCopy(image); // Создаем копию исходного изображения
int teethNumber = userInput("Введите количество зубцов: "); // Запрашиваем количество зубцов
// Запрос значения порогов в цикле до тех пор, пока пользователь не введет правильные значения
float t1 = 0, t2 = 0;
boolean valid = false;
while (!valid) {
t1 = userInput("Введите значение порога 1: ", 0, 255);
t2 = userInput("Введите значение порога 2: ", 0, 255);
if (t2 > t1) {
BufferedImage[] sawtoothContrastImages = ImageReader.sawtoothContrastU(image, t1, t2, teethNumber); // Создаем массив изображений с контрастированными зубцами
// Объединяем полученные изображения
for (int y = 0; y < combinedImage.getHeight(); y++) {
for (int x = 0; x < combinedImage.getWidth(); x++) {
boolean isInRange = false;
int red, green, blue;
for (BufferedImage img : sawtoothContrastImages) {
int rgb = img.getRGB(x, y);
red = (rgb >> 16) & 0xFF;
green = (rgb >> 8) & 0xFF;
blue = rgb & 0xFF;
float gray = (float) ((red + green + blue) / 3.0);
if (gray >= t1 && gray <= t2) {
isInRange = true;
break;
}
}
if (isInRange) {
int rgb = sawtoothContrastImages[y % sawtoothContrastImages.length].getRGB(x, y);
red = (rgb >> 16) & 0xFF;
green = (rgb >> 8) & 0xFF;
blue = rgb & 0xFF;
combinedImage.setRGB(x, y, (red << 16) | (green << 8) | blue);
} else {
combinedImage.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
valid = true;
} else {
JOptionPane.showMessageDialog(null, “Значение порога 2 должно быть больше порога 1”);
}
}
setImageIcon(combinedImage);
saveImage(combinedImage);
int[] originalHistogram = ImageReader.getImageHistogram(image);
int[] sawtoothHistogram = ImageReader.getImageHistogram(combinedImage);
JFrame histogramFrame = new JFrame(“Гистограммы”);
histogramFrame.setLayout(new GridLayout(1, 2, 10, 10));
JPanel originalHistogramPanel = ImageReader.createHistogramPanel(originalHistogram, “Гистограмма исходного изображения”);
JPanel sawtoothHistogramPanel = ImageReader.createHistogramPanel(sawtoothHistogram, “Гистограмма после контрастирования”);
histogramFrame.add(originalHistogramPanel);
histogramFrame.add(sawtoothHistogramPanel);
histogramFrame.pack();
histogramFrame.setLocationRelativeTo(null);
histogramFrame.setVisible(true);
}
}

public static int userInput(String prompt) {
String input = JOptionPane.showInputDialog(prompt);
return Integer.parseInt(input);
}

public static BufferedImage[] sawtoothContrastU(BufferedImage image, float t1, float t2, int teethNumber) {
BufferedImage[] sawtoothContrastImages = new BufferedImage[teethNumber];
float slope = 255 / (t2 - t1);
float offset = -t1 * slope;
for (int i = 0; i < teethNumber; i++) {
BufferedImage sawtoothImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < image.getHeight(); y++) {
for (int x = 0; x < image.getWidth(); x++) {
int rgb = image.getRGB(x, y);
int red = (rgb >> 16) & 0xFF;
int green = (rgb >> 8) & 0xFF;
int blue = rgb & 0xFF;
float gray = (float) ((red + green + blue) / 3.0);
float sawtoothValue = (gray + (i / (float) teethNumber) * 255) % 510;
if (sawtoothValue > 255)
sawtoothValue = 510 - sawtoothValue;
sawtoothValue = sawtoothValue * slope + offset;
int sawtoothGray = Math.round(sawtoothValue);
int sawtoothRGB = (sawtoothGray << 16) | (sawtoothGray << 8) | sawtoothGray;
sawtoothImage.setRGB(x, y, sawtoothRGB);
}
}
sawtoothContrastImages[i] = sawtoothImage;
}
return sawtoothContrastImages;
}