【问题标题】:Comparing images in Python by reading the binary data通过读取二进制数据比较 Python 中的图像
【发布时间】:2013-10-12 03:47:35
【问题描述】:

我想与 python 中的图像进行比较,比如 imageA.jpg 和 imageB.jpg。我是这样做的:

f = open('./imageA.jpg','rb')
imgA = f.read()
f.close()
f = open('./imageB.jpg','rb')
imgB = f.read()
f.close()
imagesEqual = imgA == imgB

最后一行主要检查从两个图像文件中读取的二进制数据的字符串是否相等。 现在,很多 stackoverflow 问题和谷歌搜索建议使用 Python 模块,如 ImageChops 或 OpenCV。我这样做的方式不正确吗?如果有,为什么?

谢谢!

【问题讨论】:

  • 如果你想要精确的文件相等,那很好。如果您想允许一些差异(例如,imageA 中的 1 个像素比 imageB 中的相同像素轻一点),那么它当然没用 ;-)
  • 即使两个图像直到最后一个像素都完全相同,但如果某些标题(jfif,exif)不同,它们也不会相等。您不是在比较图形,而是在比较字节。
  • 那么 2 张图片可以有相同的 exif/jiff 标头数据吗?如何比较仅是图像数据而不是文件头数据的字节?

标签: python image compare


【解决方案1】:

如果您只想知道它们是否不同,那就试试吧:

import filecmp
if filecmp.cmp(filename1, filename2, shallow=False):

来自In Python, is there a concise way of comparing whether the contents of two text files are the same?

【讨论】:

  • 这里的不同意味着图像不同或文件不同?我想检查图像是否不同。这是否避免了比较上面 Hyperboreus 提到的标头数据(exif 或 jiff)?
【解决方案2】:

使用您的代码比较文件,而不是图像。如果您想比较图像的真实内容(像素值),您应该打开并加载两个图像 (imgA=Image.open('./imageA.jpg'), imgA .load()) 并比较它们,因为有时两个相同图像的文件可能包含不同的标题、元数据……在这种情况下,图像相同但文件不同。

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2015-05-20
    • 2013-07-02
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多