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

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

我怎样才能高效而自信地比较两幅图像,就像人类能够看到它们明显相同一样?

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

Update

我写了这个 playbook :

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

有人能告诉我什么是合适的截止时间吗?

Update II

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

Linux相关问答推荐

IntelliJ(PyCharm)不再识别Linux中的AltGr快捷键

在64位Linux Mint 21.2 Mate上呈现nvim中的文本对象时出现问题

Bash:将多行转换为单行的命令

从 ALSA USB 硬件设备获取 USB 设备文件路径

为什么 `std::this_thread::yield()` 比 `std::this_thread::sleep_for(0s)` 慢 10 倍?

如果 bash 中已经存在文件名,则创建新文件但添加数字

使用带有 gnome-keyring 的 Git 凭证助手作为 Sudo 时出错

如何在 Linux 命令行上解析 CSV 文件?

如何增加 /proc/pid/cmdline 4096 字节限制?

如何更改某些文件模式/扩展名的权限?

优雅地杀死在 Linux 上运行的 .NET Core 守护进程

如何从 linux 的命令行将 Sublime Text 2 文件打开到选项卡,而不是新窗口

使用 ssh 判断远程主机上是否存在文件

使用inotify的正确方法是什么?

并行运行 shell 脚本

什么是适用于 Linux 的好的 Prolog IDE?

zsh:找不到命令 laravel

在 Linux 中,名称与正则表达式匹配的文件的磁盘使用情况?

编译 OpenGL 程序 GL/glew.h 缺失

编辑文件时保留 samba 共享的文件权限