from PIL import Image
import math
import operator
from functools import reduce
import os
def image_contrast(img1, img2):
""" 来源虫师,----准确度不是很高
:param img1:对比的图片1
:param img2: 对比的图片2
:return: 得到的数值越大说明差距越大,数值越小越相近,为0.0时说明图片一样
"""
image1 = Image.open(img1)
image2 = Image.open(img2)
# 把图像对象转换为直方图数据,存在list、h1、h2中
h1 = image1.histogram()
h2 = image2.histogram()
result = math.sqrt(reduce(operator.add, list(map(lambda a, b: (a-b)**2, h1, h2)))/len(h1))
'''
sqrt:计算平方根,reduce函数:前一次调用的结果和sequence的下一个元素传递给operator.add
operator.add(x,y)对应表达式:x+y
这个函数是方差的数学公式:S^2= ∑(X-Y) ^2 / (n-1)
'''
return result
def compare_many_pic(sour_img_dir,dest_img_dir):
"""
:param sour_img_dir:源图片目录
:param dest_img_dir: 对比图片目录
:return: 每一个源图片和所有的对比图片相对比
"""
data1 = [] # 存放源图片
data2 = [] # 存放被对比的图片
data3 = {} # 存放相似度较高的对比结果
if os.path.isdir(sour_img_dir): # 判断是否为目录
s_img = os.listdir(sour_img_dir) # 遍历目录下的图片
for i in s_img:
if i.endswith(".jpg") or i.endswith(".png"): # 查找后缀是.png或.jpg的图片
data1.append(i)
print("源图片为:%s" % data1) # 打印源图片
else:
print("给定的源图片不存在")
if os.path.isdir(dest_img_dir):
d_img = os.listdir(dest_img_dir)
for i in d_img:
if i.endswith(".jpg") or i.endswith(".png"):
data2.append(i)
print("对比图片是:", data2) # 打印对比图片
else:
print("给定的对比图片不存在")
for i in data1: # 源图片
for k in data2: # 对比图片
result = image_contrast(sour_img_dir+"\\"+i, dest_img_dir+"\\"+k)
if result <= 5.0:
print("\033[1;36m 源-{0}-和对比-{1}-的相识度较高,对比结果: {2}\033[0m".format(i, k, result))
data3["源" + i] = ["对比" + k, int(result)]
else:
print("{0}和{1}的对比结果: {2}".format(i, k, result))
print("\033[1;36m 相识度较高的有:{0}\033[0m".format(data3))
if __name__ == '__main__':
sour_img_dir = r"C:\Users\html_\Pictures\Saved Pictures" # 源图片目录
dest_img_dir = r"C:\Users\html_\Pictures\Saved Pictures\百度图片" # 对比图片目录
compare_many_pic(sour_img_dir, dest_img_dir)
本文主要代码来源于虫师,我只是写了一些多张图片对比的逻辑代码
关于Pillow库的详细文档: