小编典典

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

linux

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

我有两个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保存,而无需进行任何操作,从而解决了我的问题,它现在可以正常工作!


阅读 532

收藏
2020-06-02

共1个答案

小编典典

有一个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上

2020-06-02