- 12, May 2024
- #1
Я все еще новичок в программировании и столкнулся с проблемой с кодом Java.
Буду очень благодарен за предложения и комментарии.
Проблема заключается в следующем: Я нашел в Интернете Java-код, предназначенный для сравнения двух изображений и выделения различий между ними.
Однако код работает с помощью цикла, который сравнивает значение RGB каждого пикселя двух изображений и выделяет его определенным цветом, если значение равно.
Однако это приводит к проблеме, заключающейся в том, что даже малейшее смещение угла камеры или условий освещения между двумя изображениями приводит к разным значениям RGB пикселей, из-за чего код выделяет их как разницу, даже если изображения в основном идентичны.
Код написан ниже, и я добавил ссылку на фотографии, показывающие примеры результатов работы кода.
Что бы вы предложили изменить в коде? Заранее благодарим вас за помощь. Код: импортировать java.awt.image.BufferedImage; импортировать java.io.File; импортировать java.io.IOException; импортировать javax.imageio.ImageIO; общественный класс PictureOverlayTest { /*
*/ частное изображение BufferedImage1; частное изображение BufferedImage2; частное изображение BufferedImage3; частная строка pathImage3; public PictureOverlayTest (String filePathAndName1, String filePathAndName2, Строка filePathAndName3) выдает IOException { /*
*/ Файл файл = новый файл (filePathAndName1); this.image1 = ImageIO.read(файл); файл = новый файл (filePathAndName2); this.image2 = ImageIO.read(файл); this.pathImage3 = filePathAndName3; проверитьИСравнить(); } Private void checkAndCompare() выдает IOException { /*
*/
Цвет синий = Цвет.синий;
Желтый цвет = Цвет.желтый;
если (image1.getHeight() == image2.getHeight()
& & image1.getWidth() == image2.getWidth()) {
image3 = новый BufferedImage(image1.getWidth(), image1.getHeight(),
изображение1.getType());
for (int y = 0; y < image1.getHeight(); y++) {
for (int x = 0; x < image1.getWidth(); x++) {
int colorImage1 = image1.getRGB(x, y);
int colorImage2 = image2.getRGB(x, y);
если (colorImage1 == colorImage2) {
image3.setRGB(x, y, blue.getRGB());
} еще {
image3.setRGB(x, y,жёлтый.getRGB());
// Какой бы цвет вы ни выбрали.
По умолчанию он черный. } } } сохранитьКартину3(); System.out.println("Сообщение: сравнение изображений завершено"); } еще {
System.out.println("Ошибка: размеры изображения не совпадают"); } } Private void savePicture3() выдает IOException { /*
*/
Файл файл = новый файл (pathImage3);
если (file.createNewFile()) {
ImageIO.write(изображение3, «bmp», файл);
}
}
}
импортировать java.io.IOException;
общественный класс Main {
public static void main(String[] args) {
// TODO Автоматически сгенерированная заглушка метода
пытаться {
Тест PictureOverlayTest = новый PictureOverlayTest(
"C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test1.png",
"C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test2.png",
"C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test3.png");
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
Вот ссылка на примеры изображений результата ( https://postimg.cc/gallery/rkXfPr7
)
Буду очень благодарен за предложения и комментарии.
Проблема заключается в следующем: Я нашел в Интернете Java-код, предназначенный для сравнения двух изображений и выделения различий между ними.
Однако код работает с помощью цикла, который сравнивает значение RGB каждого пикселя двух изображений и выделяет его определенным цветом, если значение равно.
Однако это приводит к проблеме, заключающейся в том, что даже малейшее смещение угла камеры или условий освещения между двумя изображениями приводит к разным значениям RGB пикселей, из-за чего код выделяет их как разницу, даже если изображения в основном идентичны.
Код написан ниже, и я добавил ссылку на фотографии, показывающие примеры результатов работы кода.
Что бы вы предложили изменить в коде? Заранее благодарим вас за помощь. Код: импортировать java.awt.image.BufferedImage; импортировать java.io.File; импортировать java.io.IOException; импортировать javax.imageio.ImageIO; общественный класс PictureOverlayTest { /*
- Четыре переменных: три для нужных BufferedImages, одна строка для
- Путь третьего изображения, которого еще нет.
*/ частное изображение BufferedImage1; частное изображение BufferedImage2; частное изображение BufferedImage3; частная строка pathImage3; public PictureOverlayTest (String filePathAndName1, String filePathAndName2, Строка filePathAndName3) выдает IOException { /*
- Конструктор, чтобы этот метод можно было использовать повторно и в чистоте. Потребности
- три струны. Пути и имена файлов всех трех изображений. Изображение 1
- и 2 уже должны существовать, изображение 3 будет создано, если все
- требования соблюдены. Конструктор создает первые два буферизованных
- изображения, устанавливает все необходимые переменные и запускает функцию checkAndCompare().
- метод
*/ Файл файл = новый файл (filePathAndName1); this.image1 = ImageIO.read(файл); файл = новый файл (filePathAndName2); this.image2 = ImageIO.read(файл); this.pathImage3 = filePathAndName3; проверитьИСравнить(); } Private void checkAndCompare() выдает IOException { /*
- Эта функция создает синий цвет, сравнивает размеры обоих
- изображения, и если они одинаковые, создается третье изображение. Затем это
- циклически перебирает два изображения и сравнивает каждый пиксель. Если пиксели
- одинаковы, третье изображение в этой точке получает синий пиксель
*/
Цвет синий = Цвет.синий;
Желтый цвет = Цвет.желтый;
если (image1.getHeight() == image2.getHeight()
& & image1.getWidth() == image2.getWidth()) {
image3 = новый BufferedImage(image1.getWidth(), image1.getHeight(),
изображение1.getType());
for (int y = 0; y < image1.getHeight(); y++) {
for (int x = 0; x < image1.getWidth(); x++) {
int colorImage1 = image1.getRGB(x, y);
int colorImage2 = image2.getRGB(x, y);
если (colorImage1 == colorImage2) {
image3.setRGB(x, y, blue.getRGB());
} еще {
image3.setRGB(x, y,жёлтый.getRGB());
// Какой бы цвет вы ни выбрали.
По умолчанию он черный. } } } сохранитьКартину3(); System.out.println("Сообщение: сравнение изображений завершено"); } еще {
System.out.println("Ошибка: размеры изображения не совпадают"); } } Private void savePicture3() выдает IOException { /*
- Этот метод сохраняет созданное изображение в файл на вашем компьютере.
- Оператор if() используется для проверки успешности файла.
- создано во избежание нежелательных ошибок. Имейте в виду, что вы
- необходимо изменить «bmp» в ImageIO.write() на любой формат, который вы хотите
- на самом деле хочу
*/
Файл файл = новый файл (pathImage3);
если (file.createNewFile()) {
ImageIO.write(изображение3, «bmp», файл);
}
}
}
импортировать java.io.IOException;
общественный класс Main {
public static void main(String[] args) {
// TODO Автоматически сгенерированная заглушка метода
пытаться {
Тест PictureOverlayTest = новый PictureOverlayTest(
"C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test1.png",
"C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test2.png",
"C:\\Users\\Rabee Taha\\Desktop\\Java Test Pics\\test3.png");
} catch (IOException e) {
// TODO Автоматически сгенерированный блок catch
е.printStackTrace();
}
}
}
Вот ссылка на примеры изображений результата ( https://postimg.cc/gallery/rkXfPr7
)