【问题标题】:Image comparator returns false图像比较器返回 false
【发布时间】:2013-01-05 13:41:35
【问题描述】:

所以,我在 Android 上使用文件共享应用程序。它会创建一个复制副本并上传到它的服务器。

问题 以下代码适用于我手动创建的重复副本。也就是说,我长按并使用文件管理器将文件复制到同一目录中。然后我的函数返回true。当它比较由于应用程序导致的重复图像和原始图像时,我得到false

MD5 校验和不同,因此无法选择。

代码

    public boolean equals(Bitmap bitmap1, Bitmap bitmap2) {
        ByteBuffer buffer1 = ByteBuffer.allocate(bitmap1.getHeight()
                * bitmap1.getRowBytes());
        bitmap1.copyPixelsToBuffer(buffer1);

        ByteBuffer buffer2 = ByteBuffer.allocate(bitmap2.getHeight()
                * bitmap2.getRowBytes());
        bitmap2.copyPixelsToBuffer(buffer2);

        return Arrays.equals(buffer1.array(), buffer2.array());
    }

这是图片:

原图-

应用创建的重复图像 -

我的代码目前在比较这两个图像时返回 false。 如何让代码返回 true?

【问题讨论】:

  • 你的问题不是很清楚请说清楚。
  • @AliImran 这样更好吗?
  • 你的这条线很混乱When it compares the duplicate image due to the app and the original image 这里你说due to the app 是什么意思?
  • @AliImran 我用于文件共享的第三方应用程序创建图像的副本并上传。那就是我所说的“由于应用程序”所指的重复图像。
  • 问题与第三方应用有关。是否尝试调试您的代码?并检查ByteBuffer 的大小,因为它必须与原始图像不同,这是因为第三方应用程序可能在原始图像中使用了一些压缩。

标签: android image-processing bitmap duplicates


【解决方案1】:

您的问题是由于 JPEG 压缩造成的伪影,如果您始终可以将图像保存为 PNG,那么您的问题很可能已解决。如果你不能这样做,那么你需要一个更好的算法来比较图像。这与Comparing image in url to image in filesystem in python中讨论的问题完全相同

例如,运行前面讨论中提到的算法,我们得到超过 99% 的相似度。有了这个相似度值,你可以说图像是相同的。

【讨论】:

  • 说 jpeg 已被广泛使用。如果我将原始和副本转换为 .png 格式,然后比较它们的校验和,它们会相同吗?或者,如果我将它们与我显示的代码进行比较,它会返回 true 吗?
  • 不,校验和会有所不同。您必须以 PNG 开头和结尾,如果您在中间混合 JPEG,那么您正在使用有损压缩。
  • 请注意,链接讨论中名为 NRMSE 的指标很容易实现,您可以考虑使用它。
  • 链接的讨论是比较图像,在这种情况下是有损压缩的。所以,是的,有办法做到这一点,你已经指出了其中的两个(一个复杂的,一个简单的)。调整大小的图像是什么意思?您想比较调整大小和未调整大小的图像吗?链接的讨论包括一个与 MSE (ece.uwaterloo.ca/~z70wang/publications/SPM09.pdf) 相关的非常好的链接,该链接与讨论中名为 NRMSE 的内容非常接近。
  • 如果图片的尺寸相同(宽x高),那么您可以直接使用前面提到的指标。这不会以任何方式使比较复杂化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
相关资源
最近更新 更多