Сравнение двух изображений и выделение различий прямоугольниками.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Сравнение двух изображений и выделение различий прямоугольниками.

Сообщение 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

Подробнее здесь: https://stackoverflow.com/questions/462 ... rectangles
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»