是否可以使用ruby-vips8检测两个图像是否相同?

时间:2016-04-10 00:02:10

标签: ruby image-processing vips

我正在尝试比较两张图片,看看它们是否相同。它们应该具有相同的尺寸,可能具有相同的尺寸,但有时内容会发生变化,我希望能够检测到它。

在我的情况下,我有两种方法:一种是获取每张图像中的颜色数量。 (就我而言,如果图像不同,颜色数会发生变化)

或者确实使用图像处理器比较文件。 我选择使用ruby-vips8,因为它比RMagick快得多,而在我看来,性能是一件事。

我对ruby-vips8进行了一些划痕,但我找不到比较两个图像或获取颜色数量的方法(因此我可以使用此方法进行比较)。

任何帮助?

ruby-vips8libvips的包装。

http://www.rubydoc.info/gems/ruby-vips8/0.1.0/Vips/ http://www.vips.ecs.soton.ac.uk/index.php?title=VIPS

更新

在用户 Aetherus 的回答中,我意识到我甚至不需要ruby-vips8来完成这样的任务。我正在将这些文件比作String(正如他所建议的那样)。它对我很有用,也很快。

我没有将他的答案标记为最佳,因为我的问题是否可以使用ruby-vips8来表达。是一个特定于lib的场景,所以在这种情况下 user894763 的答案更合适。

1 个答案:

答案 0 :(得分:0)

"相同"和"看起来一样"是两回事。

如果你想验证2张图片"是否相同",那么只需将它们读成2个字符串并进行比较。

def same_image?(path1, path2)
  return true if path1 == path2
  image1 = File.read(path1, 'rb')
  image2 = File.read(path2, 'rb')
  image1 == image2
end

或者如果您的图像很大,那么只需逐字节读取它们并进行比较。

def same_image?(path1, path2)
  return true if path1 == path2
  File.open(path1, 'rb') do |image1|
    File.open(path2, 'rb') do |image2|
      return false if image1.size != image2.size
      while (b1 = image1.read(1024)) and (b2 = image2.read(1024))
        return false if b1 != b2
      end
    end
  end
  true
end

验证2张图片"看起来是否相同"是一项非常艰苦的工作。例如,PNG和JPG可能看起来相同,但它们几乎从不具有相同的像素阵列。即使是2个图像属于同一类型,它们看起来可能相同但实际上第二个图像与第一个图像相比具有一个像素的偏移,或者两个图像之间的饱和度稍微不同,或者......

我从未这样做过,而且我不确定它是否可行。