试图解决防止重复图像被上传的问题。
我有两个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上