from PIL import Image
import os
def calculate(image1, image2):
g = image1.histogram() # 得到的是一个很长的列表,里面为整数
s = image2.histogram()
assert len(g) == len(s), "error"
data = []
for index in range(0, len(g)):
if g[index] != s[index]:
data.append(1 - abs(g[index] - s[index]) / max(g[index], s[index]))
else:
data.append(1)
return sum(data) / len(g)
# 将data里面的值进行相加,然后除以g列表的个数和
def split_image(image, part_size):
pw, ph = part_size
w, h = image.size
sub_image_list = []
assert w % pw == h % ph == 0, "error"
for i in range(0, w, pw):
for j in range(0, h, ph):
sub_image = image.crop((i, j, i + pw, j + ph)).copy()
sub_image_list.append(sub_image)
return sub_image_list
def classfiy_histogram_with_split(image1, image2, size=(256, 256), part_size=(64, 64)):
'''
'image1' 和 'image2' 都是Image 对象.
可以通过'Image.open(path)'进行创建。
'size' 重新将 image 对象的尺寸进行重置,默认大小为256 * 256 .
'part_size' 定义了分割图片的大小.默认大小为64*64 .
返回值是 'image1' 和 'image2'对比后的相似度,相似度越高,图片越接近,达到100.0说明图片完全相同。
'''
img1 = image1.resize(size).convert("RGB")
sub_image1 = split_image(img1, part_size)
img2 = image2.resize(size).convert("RGB")
sub_image2 = split_image(img2, part_size)
sub_data = 0
for im1, im2 in zip(sub_image1, sub_image2):
sub_data += calculate(im1, im2)
x = size[0] / part_size[0]
y = size[1] / part_size[1]
pre = round((sub_data / (x * y)), 6)
# print("\033[1;36m {0}和{1}的相似度:{0}%\033[0m".format(image1, image2, pre * 100))
return pre * 100
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: # 对比图片
image1 = Image.open(sour_img_dir+"\\"+i) # image1源图片
image2 = Image.open(dest_img_dir+"\\"+k) # image2对比图片
result = classfiy_histogram_with_split(image1, image2)
if result >= 95:
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)
本文主要代码了来源于:https://www.cnblogs.com/wozijisun/p/6478388.html
和上一篇一样只是添加了部分简单代码,写的不怎么好,菜鸟一个。。。。。。