Tratando de resolver el problema de evitar la carga de imágenes duplicadas.Comparar dos imágenes, el modo python/linux
Tengo dos archivos JPG. Mirándolos, puedo ver que son, de hecho, idénticos. Pero, por algún motivo, tienen un tamaño de archivo diferente (uno es extraído de una copia de seguridad, el otro es otra carga) y tienen una suma de comprobación md5 diferente.
¿Cómo puedo comparar eficientemente y con confianza dos imágenes en el mismo sentido en que un ser humano podría ver que son claramente idénticas?
Ejemplo: http://static.peterbe.com/a.jpg y http://static.peterbe.com/b.jpg
actualización
escribí este guión:
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)
Entonces descargado las dos imágenes visualmente idénticos y ejecutar el script. Salida:
58.9830484122
¿Alguien me puede decir cuál debe ser el corte adecuado?
Actualización II
La diferencia entre a.jpg b.jpg y es que el segundo ha sido guardado con PIL:
b=Image.open('a.jpg')
b.save(open('b.jpg','wb'))
Al parecer, esto se aplica algunas modificaciones de calidad muy muy ligeros. ¡Ahora resolví mi problema aplicando el mismo salvado de PIL al archivo que estaba subiendo sin hacer nada con él y ahora funciona!
Por lo que puede que ninguno de ellos tenga los datos EXIF. –
'reduce (operator.add (...))' -> 'suma (...)'. – jfs
Por lo que vale (principalmente en referencias a información de fondo) esto es como una versión simplificada de esta pregunta: http://stackoverflow.com/questions/1819124/image-comparison-algorithm –