【问题标题】:android compare 2 images and highlight differenceandroid比较2张图片并突出差异
【发布时间】:2016-10-24 23:23:07
【问题描述】:

将提供 2 张图片。我们需要找到它们之间的差异并突出显示它们。

到目前为止,我在 JAVA 中看到了这个 solution,但由于 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);
}

提前致谢。

【问题讨论】:

  • 您面临的问题是什么?您是否可以提供任何代码来帮助我们查看您已经尝试过的内容?任何堆栈跟踪或错误日志?
  • 我已经添加了代码的详细信息以及我得到的结果。谢谢
  • 只是一个评论,但您验证图像大小相同的测试是错误的。它应该是 || 而不是 &amp;&amp;
  • @Sunreef 你也可以发布图片吗?可能他们不同吗?通常你需要允许一些 eps 差异,比如(Color.red(firstImage.getPixel(i,j)) - Color.red(secondImage.getPixel(i,j))) &lt; eps &amp;&amp; (Color.blue(firstImage.getPixel(i,j)) - Color.blue(secondImage.getPixel(i,j))) &lt; eps &amp;&amp; (Color.green(firstImage.getPixel(i,j)) - Color.green(secondImage.getPixel(i,j))) &lt; eps,试试 eps=3

标签: java android opencv


【解决方案1】:

在数字色度计的帮助下,我检测到视觉上看起来相似的图像的颜色之间存在非常细微的差异,这与@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);
}

【讨论】:

  • 为了获得最佳性能,请使用 getPixels(),而不是 getPixel(),并将数组中的每个键与 while() 匹配。处理高清图像大约需要 2 秒的差异,实时处理视频需要更高的速度。
【解决方案2】:

逐像素比较图像,您可以这样做:

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);
}

【讨论】:

  • 我看到了一些重构,但逻辑没有变化。我错过了什么吗?
  • @taarraas 你是对的。我没有测试过 Haris 的代码,但我刚刚测试过,它工作正常
猜你喜欢
  • 1970-01-01
  • 2023-02-13
  • 2022-12-15
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-12
相关资源
最近更新 更多