Cố gắng giải quyết vấn đề ngăn hình ảnh trùng lặp được tải lên.So sánh hai hình ảnh cách python/linux
Tôi có hai JPG. Nhìn vào họ tôi có thể thấy rằng họ đang ở trong thực tế giống hệt nhau. Nhưng đối với một số lý do họ có kích thước tập tin khác nhau (một là kéo từ một bản sao lưu, khác là một tải lên) và vì vậy họ có một checksum md5 khác nhau.
Làm thế nào tôi có thể so sánh hai hình ảnh một cách hiệu quả và tự tin giống như một con người có thể thấy rằng chúng giống hệt nhau?
Ví dụ: http://static.peterbe.com/a.jpg và http://static.peterbe.com/b.jpg
Cập nhật
tôi đã viết kịch bản này:
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)
Sau đó, tôi đã tải về hai hình ảnh giống hệt trực quan và chạy kịch bản. Đầu ra:
58.9830484122
Ai có thể cho tôi biết điểm ngắt phù hợp là gì?
Cập nhật II
Sự khác biệt giữa a.jpg và b.jpg là điều thứ hai đã được lưu với PIL:
b=Image.open('a.jpg')
b.save(open('b.jpg','wb'))
này dường như áp dụng một số thay đổi chất lượng rất rất nhẹ. Bây giờ tôi đã giải quyết vấn đề của tôi bằng cách áp dụng cùng một PIL lưu vào tập tin được tải lên mà không làm bất cứ điều gì với nó và nó bây giờ hoạt động!
Theo như tôi có thể cả hai đều không có dữ liệu Exif. –
'reduce (operator.add (...))' -> 'sum (...)'. – jfs
Đối với những gì nó có giá trị (chủ yếu là trong tài liệu tham khảo để thông tin nền) này giống như một phiên bản đơn giản của câu hỏi này: http://stackoverflow.com/questions/1819124/image-comparison-algorithm –