2016-06-22 3 views
2

2 Изображения будут предоставлены. Нам нужно найти различия между ними и выделить их.андроид сравнить 2 изображения и выделить разницу

До сих пор я видел это solution в JAVA, но поскольку BufferedImage не поддерживается в android, я не могу продолжить дальше. Я приблизился к сравнению пикселей из 2 растровых изображений, но столкнулся с проблемой впереди.

Я также попытался сравнения пикселей два растрового изображения, но это выдвигает на первый план все не белые цвета

void findDifference(Bitmap firstImage, Bitmap secondImage) 
{ 
    if (firstImage.getHeight() != secondImage.getHeight() && firstImage.getWidth() != secondImage.getWidth()) 
     Toast.makeText(this, "Images size are not same", Toast.LENGTH_LONG).show(); 

    boolean isSame = true; 

    for (int i = 0; i < firstImage.getWidth(); i++) 
    { 
     for (int j = 0; j < firstImage.getHeight(); j++) 
     { 
      if (firstImage.getPixel(i,j) == secondImage.getPixel(i,j)) 
      { 
      } 
      else 
      { 
       differentPixels.add(new Pixel(i,j)); 
       secondImage.setPixel(i,j, Color.YELLOW); //for now just changing difference to yello color 
       isSame = false; 
      } 
     } 
    } 
    imgOutput.setImageBitmap(secondImage); 
} 

Спасибо заранее.

+0

В чем проблема, с которой вы столкнулись? Есть ли у вас код, который вы можете предоставить, чтобы помочь нам понять, что вы уже пробовали? любые стеки или журналы ошибок? – Guardanis

+0

Я добавил детали кода и какой результат у меня есть. Спасибо – Haris

+1

Просто комментарий, но ваш тест, чтобы убедиться, что ваши изображения имеют одинаковый размер, неверны. IT должен быть '||' вместо '&&' – Sunreef

ответ

5

С помощью цифрового колориметра я обнаружил там очень небольшая разница между цветом визуально ищет похожих изображений весьма похожих какие @taarraas также предлагается. поэтому я взял пороговое значение и решил это так.

private static final int threashold = 10; 

void findDifference(Bitmap firstImage, Bitmap secondImage) 
{ 
    if (firstImage.getHeight() != secondImage.getHeight() || firstImage.getWidth() != secondImage.getWidth()) 
     Toast.makeText(this, "Images size are not same", Toast.LENGTH_LONG).show(); 

    boolean isSame = true; 

    for (int i = 0; i < firstImage.getWidth(); i++) 
    { 
     for (int j = 0; j < firstImage.getHeight(); j++) 
     { 
      int pixel = firstImage.getPixel(i,j); 
      int redValue = Color.red(pixel); 
      int blueValue = Color.blue(pixel); 
      int greenValue = Color.green(pixel); 

      int pixel2 = secondImage.getPixel(i,j); 
      int redValue2 = Color.red(pixel2); 
      int blueValue2 = Color.blue(pixel2); 
      int greenValue2 = Color.green(pixel2); 

      if (Math.abs(redValue2 - redValue) + Math.abs(blueValue2 - blueValue) + Math.abs(greenValue2 - greenValue) <= threashold) 
//    if (firstImage.getPixel(i,j) == secondImage.getPixel(i,j)) 
      { 
      } 
      else 
      { 
       differentPixels.add(new Pixel(i,j)); 
       secondImage.setPixel(i,j, Color.YELLOW); //for now just changing difference to yello color 
       isSame = false; 
      } 
     } 
    } 
    imgOutput.setImageBitmap(secondImage); 
} 
+0

. Для лучшей производительности используйте getPixels(), а не getPixel() и сопоставляйте каждый ключ в массиве с while(). ~ 2 секунды разницы по процессу hd-изображение, в режиме реального времени видео требуется больше скорости. –

0

Сравнивая пиксель изображения на пиксель вы можете сделать это следующим образом:

private void findDifference(Bitmap firstImage, Bitmap secondImage) { 
    Bitmap bmp = secondImage.copy(secondImage.getConfig(), true); 

    if (firstImage.getWidth() != secondImage.getWidth() 
      || firstImage.getHeight() != secondImage.getHeight()) { 
     return; 
    } 

    for (int i = 0; i < firstImage.getWidth(); i++) { 
     for (int j = 0; j < firstImage.getHeight(); j++) { 
      if (firstImage.getPixel(i, j) != secondImage.getPixel(i, j)) { 
       bmp.setPixel(i, j, Color.YELLOW); 
      } 
     } 
    } 

    imgOutput.setImageBitmap(bmp); 
} 
+0

Я вижу некоторые рефакторинг, но никаких изменений в логике. Я что-то пропустил? – taarraas

+0

@taarraas Вы правы. Я не тестировал код Хариса, но я только что протестировал его, и он отлично работает – antonio

Смежные вопросы