Редактирование: обновлен код: приведенный ниже код теперь правильно рисует прямоугольники вокруг нескольких фигур, но по-прежнему имеет небольшую проблему, связанную с иногда созданием нескольких прямоугольников в одной фигуре.
У меня есть 2 изображения, которые я сравниваю попиксельно друг с другом, и я хочу, чтобы моя программа создавала прямоугольники вокруг области различия (несколько прямоугольников с несколькими экземплярами различий). До сих пор мне удавалось сделать это с одним прямоугольником, поэтому, если бы у меня было несколько «экземпляров», все они были бы в одном большом прямоугольнике. Теперь я пытаюсь заставить программу создать несколько прямоугольников, но сталкиваюсь с исключением IndexOutOfBoundsException.
Сама программа накладывает два сравниваемых изображения с непрозрачностью и выводит полученное наложение изображение вместе с прямоугольниками в новый файл. Оба сравниваемых изображения имеют одинаковую ширину и высоту.
Я называю прямоугольники, которые хочу нарисовать, «областями» внутри кода.
Список регионов постоянно обновляется во время сравнения.
Первый вопрос, который я задал себе, заключался в том, когда точка различия (разница в пикселях) принадлежит региону?
Моей попыткой было определить «допуск», поэтому, пока сравниваемый пиксель находится в пределах допуска последней найденной точки различия, он принадлежит к одной и той же области. Я быстро понял, что это не работает, как только на моем изображении появляется форма в виде гигантской буквы U, причем верхние точки находятся достаточно далеко друг от друга, чтобы выходить за пределы допуска. И теперь я как бы застрял, потому что чувствую, что иду по неправильному пути.
Ниже приведен код, который у меня есть:
private void compareImages() throws IOException{
BufferedImage img1;
BufferedImage img2;
try {
img1 = ImageIO.read(new File(path_to_img1));
img2 = ImageIO.read(new File(path_to_img2));
} catch (Throwable e) {
System.out.println("Unable to load the Images!");
return;
}
BufferedImage dest = new BufferedImage(img1.getWidth(), img1.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D gfx = dest.createGraphics();
gfx.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.65f));
//Compare Images pixel by pixel
int sX = 9999; //Start X
int sY = 9999; //Start Y
int eX = 0; //End X
int eY = 0; //End Y
boolean isDrawable = false;
boolean loadedRegion = false;
List regions = new ArrayList();
List check_regions = new ArrayList();
Rectangle tmp_comparison;
int regionID = 0;
int tolerance = 25;
for (int i = 0; i < img1.getHeight(); i++) {
for (int j = 0; j < img1.getWidth(); j++) {
loadedRegion = false;
regionID = 0;
sX = 9999;
sY = 9999;
eX = 0;
eY = 0;
if ( img1.getRGB(j, i) != img2.getRGB(j, i) ){
isDrawable = true;
if (regions.size() != 0){
//Attempting to locate a matching existing Region
tmp_comparison = new Rectangle(j, i, 1, 1);
for (int trID = 0; trID
Подробнее здесь: https://stackoverflow.com/questions/462 ... rectangles
Сравнение двух изображений и выделение различий прямоугольниками. ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1730172804
Anonymous
Редактирование: обновлен код: приведенный ниже код теперь правильно рисует прямоугольники вокруг нескольких фигур, но по-прежнему имеет небольшую проблему, связанную с иногда созданием нескольких прямоугольников в одной фигуре.
У меня есть 2 изображения, которые я сравниваю попиксельно друг с другом, и я хочу, чтобы моя программа создавала прямоугольники вокруг области различия (несколько прямоугольников с несколькими экземплярами различий). До сих пор мне удавалось сделать это с одним прямоугольником, поэтому, если бы у меня было несколько «экземпляров», все они были бы в одном большом прямоугольнике. Теперь я пытаюсь заставить программу создать несколько прямоугольников, но сталкиваюсь с исключением IndexOutOfBoundsException.
Сама программа накладывает два сравниваемых изображения с непрозрачностью и выводит полученное наложение изображение вместе с прямоугольниками в новый файл. Оба сравниваемых изображения имеют одинаковую ширину и высоту.
Я называю прямоугольники, которые хочу нарисовать, «областями» внутри кода.
Список регионов постоянно обновляется во время сравнения.
Первый вопрос, который я задал себе, заключался в том, когда точка различия (разница в пикселях) принадлежит региону?
Моей попыткой было определить «допуск», поэтому, пока сравниваемый пиксель находится в пределах допуска последней найденной точки различия, он принадлежит к одной и той же области. Я быстро понял, что это не работает, как только на моем изображении появляется форма в виде гигантской буквы U, причем верхние точки находятся достаточно далеко друг от друга, чтобы выходить за пределы допуска. И теперь я как бы застрял, потому что чувствую, что иду по неправильному пути.
Ниже приведен код, который у меня есть:
private void compareImages() throws IOException{
BufferedImage img1;
BufferedImage img2;
try {
img1 = ImageIO.read(new File(path_to_img1));
img2 = ImageIO.read(new File(path_to_img2));
} catch (Throwable e) {
System.out.println("Unable to load the Images!");
return;
}
BufferedImage dest = new BufferedImage(img1.getWidth(), img1.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D gfx = dest.createGraphics();
gfx.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.65f));
//Compare Images pixel by pixel
int sX = 9999; //Start X
int sY = 9999; //Start Y
int eX = 0; //End X
int eY = 0; //End Y
boolean isDrawable = false;
boolean loadedRegion = false;
List regions = new ArrayList();
List check_regions = new ArrayList();
Rectangle tmp_comparison;
int regionID = 0;
int tolerance = 25;
for (int i = 0; i < img1.getHeight(); i++) {
for (int j = 0; j < img1.getWidth(); j++) {
loadedRegion = false;
regionID = 0;
sX = 9999;
sY = 9999;
eX = 0;
eY = 0;
if ( img1.getRGB(j, i) != img2.getRGB(j, i) ){
isDrawable = true;
if (regions.size() != 0){
//Attempting to locate a matching existing Region
tmp_comparison = new Rectangle(j, i, 1, 1);
for (int trID = 0; trID
Подробнее здесь: [url]https://stackoverflow.com/questions/46221501/comparing-2-images-and-marking-differences-with-rectangles[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия