【问题标题】:Comparing two byte arrays which represent two pictures比较代表两张图片的两个字节数组
【发布时间】:2012-08-04 14:31:06
【问题描述】:

我正在为 android 编写一个小型应用程序,我需要在两张图片之间进行比较。 图片表示为两字节数组。

是否有算法可以比较它们?我需要检查他们之间所做的更改。

【问题讨论】:

  • 它们是否需要完全相等或者是否有某种接近阈值?如果它们需要相等,您可以使用Arrays.equals():docs.oracle.com/javase/7/docs/api/java/util/…, byte[])
  • 它们不必完全相等。我正在编写运动检测器,所以我想每次比较帧以检查是否进行了任何更改。谢谢
  • 我认为optical flow 是您正在寻找的。如果可以的话,OpenCV 中有一个实现。 opencv.willowgarage.com/documentation/cpp/…
  • 假设字节数组只包含图像数据(没有文件头,这在两个看似相同的图像之间可能不同),一个简单的算法来找到不同的字节数将只是遍历数组逐个字节地比较,总结差异......
  • 查看各种 cmets,似乎要求的是一种算法,它将比较两个图像并提供两者之间差异的描述。根本问题似乎是如何描述两个图像之间的差异。因此,这不仅仅是确定哪些像素不同的问题,而是提供某种衡量图像如何不同的方法。是否需要图像识别或提供差异测量就足够了?

标签: java android image-comparison


【解决方案1】:

这取决于您是只想标记它们不同,还是记录它们之间的每个差异。

仅检查它们是否不同(正如 Hunter McMillen 指出的那样)-http://docs.oracle.com/javase/7/docs/api/java/util/Arrays.html

boolean different = Arrays.equals(byteArray1, byteArray2);

存储个体差异(假设您的图片大小相同):

byte[] differenceArray = new byte[byteArray1.length];
for (int i = 0; i < byteArray1.length; i++) {
    differenceArray[i] = (byte) (byteArray1[i] - byteArray2[i]);
}

编辑:

如果您想要字节数组的二维(例如 800x600),您可以这样做:

byte[][] differenceArray = new byte[byteArray1.length][byteArray1[0].length];
for (int x = 0; x < byteArray1.length; x++) {
    for (int y = 0; y < byteArray1[0].length; y++) {
        differenceArray[x][y] = (byte) (byteArray1[x][y] - byteArray2[x][y]);
    }
}

如果两个图像之间没有差异,则差异数组将全为0,否则数字将是字节之间的差异。

【讨论】:

  • 我想你不明白我问了什么。假设我的图片是 800*600 像素。我想将我的字节数组转换为数组[800][600],然后比较它们,如果我不够清楚,对不起
  • 这些解决方案不是您想要的吗?代码的第一位显示如何判断两个数组是否完全匹配,第二位代码显示如何存储两个图像之间的差异,当且仅当表示的像素时,数组的每个单元格都是非零的在两张图片中发生了变化。
  • 如果你想要额外的维度,那么你可以在它们周围包裹第二个 for 循环。无论如何,Array.equals() 可能比我的第一个解决方案更好。
  • 如果两个图像相同,则差异数组将全为零,否则数字将表示字节之间的数字距离。
猜你喜欢
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2010-09-07
相关资源
最近更新 更多