当前位置: 首页 > 面试题库 >

用python / linux方式比较两个图像

侯善
2023-03-14
问题内容

试图解决防止重复图像被上传的问题。

我有两个JPG。看着它们,我可以看到它们实际上是相同的。但是由于某些原因,它们具有不同的文件大小(一个是从备份中拉出的,另一个是另一个上载的),因此它们具有不同的md5校验和。

我如何能高效自信地比较两幅图像,就像人类能够看到它们完全相同一样?

示例:http :
//static.peterbe.com/a.jpg和http://static.peterbe.com/b.jpg

更新资料

我写了这个脚本:

import math, operator
from PIL import Image
def compare(file1, file2):
    image1 = Image.open(file1)
    image2 = Image.open(file2)
    h1 = image1.histogram()
    h2 = image2.histogram()
    rms = math.sqrt(reduce(operator.add,
                           map(lambda a,b: (a-b)**2, h1, h2))/len(h1))
    return rms

if __name__=='__main__':
    import sys
    file1, file2 = sys.argv[1:]
    print compare(file1, file2)

然后,我下载了两个视觉上相同的图像并运行了脚本。输出:

58.9830484122

有人可以告诉我什么是合适的临界值吗?

更新二

a.jpg和b.jpg之间的区别是第二个已使用PIL保存:

b=Image.open('a.jpg')
b.save(open('b.jpg','wb'))

这显然应用了一些非常非常轻的质量修改。现在,我对上传的文件应用了相同的PIL保存,而无需进行任何操作,从而解决了我的问题,它现在可以正常工作!


问题答案:

有一个OSS项目,该项目使用WebDriver拍摄屏幕快照,然后比较图像以查看是否存在任何问题(http://code.google.com/p/fighting-
layout-bugs/)
)。通过将文件打开到流中,然后比较每个位来完成此操作。

您也许可以使用PIL做类似的事情。

编辑:

经过更多研究,我发现

h1 = Image.open("image1").histogram()
h2 = Image.open("image2").histogram()

rms = math.sqrt(reduce(operator.add,
    map(lambda a,b: (a-b)**2, h1, h2))/len(h1))

在http://snipplr.com/view/757/compare-two-pil-images-in-
python/
和http://effbot.org/zone/pil-comparing-
images.htm上



 类似资料:
  • 问题内容: 我有两个地图声明为。在这里可以是另一个(依此类推)。我想检查两个地图是否完全相同,但不知道其深度。除了使用递归,我还可以比较每个地图上被调用的输出吗?还是有比较简单的方法比较地图? 问题答案: 快速回答 您应该使用该方法,因为已经实现了该方法以执行所需的比较。本身就像使用迭代器一样,但这是一种效率较低的方法。另外,正如@Teepeemm所指出的那样,它受元素顺序的影响(基本上是迭代器的

  • 问题内容: 在Java中,我想比较两个地图,如下所示,我们是否有现有的API可以做到这一点? 谢谢 问题答案: 我将使用Set的removeAll()功能来设置键的差异,以查找添加和删除的内容。可以通过使用设置为HashMap的条目进行设置差异来检测实际更改。Entry同时使用键和值实现equals()。 输出量

  • 请帮助我提供一个解决方案,通过使用SeleniumRubyWebDriver比较Web应用程序的两个URL中的两个图像是否相同(我的意思是每个图像中的内容都相同)。 例如:访问下面的网址时,我有一个小图像显示: 访问下面的URL时,我还有另一个图像: 我怎样才能比较这两个图像,看看他们是否是相同的使用Selenium Ruby WebDrive?任何建议都很感激。非常感谢。

  • 问题内容: 我正在寻找一种比较两个图像以查看它们有多相似的方法。谷歌搜索它会产生大量的图像处理结果(裁剪,调整大小等),但是没有什么可以做图像的近似比较。有一个Node.js库,但是它的版本为0.0.1,并且依赖于各种第三方系统软件包,因此不稳定或可移植。 遵循以下原则: 问题答案: 有node-opencv模块,您可以使用它来执行繁重的操作,例如图像比较。 屏幕截图或图标可以变形(缩放,旋转,倾

  • 有两个叫做“a.txt”和“b.txt”的文件都有单词列表。现在我想检查哪些单词在“a.txt”中是额外的,而不是在“b.txt”中。 我需要一个有效的算法,因为我需要比较两个字典。

  • 问题内容: 有两个名为 “ a.txt” 和 “ b.txt”的文件 ,都有一个单词列表。现在,我要检查 “ a.txt”中 哪些单词是多余的,而 “ b.txt”中 哪些单词不是。 我需要一种有效的算法,因为我需要比较两个字典。 问题答案: 这是我的解决方案: