【问题标题】:Simple Way to Compare Two Images in Python在 Python 中比较两个图像的简单方法
【发布时间】:2019-02-12 00:48:03
【问题描述】:

我需要从自动下载背景图像的 Windows 10 中的“资产”文件夹中复制图像。其中一些图像将永远不会显示并在某些时候被删除。为了确保我在删除所有新图像之前已经看到它们,我创建了一个 Python 脚本,将这些图像复制到不同的文件夹中。为了提高效率,我需要一种方法来比较仅复制新图像的两个图像。我需要做的就是使用一个函数来获取两张图像,并用一种​​简单的方法将它们进行比较,以确保这两张图像在视觉上并不相同。一个简单的测试是获取一个图像文件并将其复制并比较副本和原始文件,在这种情况下,该函数应该能够分辨出这些是相同的图像。 如何在 python 中比较两个图像?我需要简单有效的方法来做到这一点。我看过的几个答案有点复杂。

【问题讨论】:

  • “比较”是什么意思?准确的像素值或不同质量的类似图像?
  • 而比较函数只需要返回“相同”或“不同”?
  • 我想您看到的复杂答案是比较实际图像。你真的不需要这样做。您只需要测试两个文件是否包含完全相同的字节。最简单的方法是比较这些文件的哈希值。您可以使用(例如)标准 hashlib 模块中的 MD5 或 SHA-256。
  • 它们是图像重要吗?如果您有解决方案,无论文件是什么,它都能同样有效吗?
  • 在这里查看答案:Finding duplicate files via hashlib?

标签: python image


【解决方案1】:

我之前遇到过类似的问题。我使用 PIL.Image.tobytes() 将图像转换为字节对象,然后在字节对象上调用 hash() 并比较哈希值。

【讨论】:

  • 根据您的经验,您是否遇到过这种方法不起作用的情况?
  • 不,我只是使用它来捕获一些屏幕截图,并确保我不会复制副本。除非您要处理数十亿张图像,否则我不会担心碰撞。
  • @Amani 我强烈建议您为此使用来自hashlib 的加密哈希函数,而不是内置的hash,以减少哈希冲突的机会。而且真的没有必要使用PIL.Image.tobytes,除非你已经将图像文件转换成不同的图像文件格式。只需使用文件中字节的哈希值。
【解决方案2】:

在 python 中比较两个图像

选项 1: 使用ImageChops 模块,它包含许多算术图像操作,称为通道操作(“chops”)。这些可用于各种用途,包括特殊效果、图像合成、算法绘画等。

示例:

ImageChops.difference(image1, image2) ⇒ 图像

返回两个图像之间差异的绝对值。
out = abs(image1 - image2)

选项 2:

Scikit-image 是 SciPy 的图像处理工具箱。

在 scikit-image 中,请使用compare_ssim计算两个图像之间的平均结构相似度指数

参考资料:

Python Compare Two Images

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 2011-05-10
    • 2012-02-15
    • 1970-01-01
    • 2017-03-10
    • 2011-07-11
    • 2010-09-06
    相关资源
    最近更新 更多