这里需要用到PIL,如果没有安装PIL,需要先pip install pillow
计算方法
一、将图片缩放为10×10(缩放比例因图片大小而异)
二、读取每一点灰度化后的像素
三、计算每一行的像素平均值
四、生成特征序列。 把每一点的像素与所在行的像素平均值作比较,如果大于像素平均值,则特征序列+‘1’,反之+‘0’。最后得到的特征序列是由1和0组成的字符串(如:11001101101111001)。
五、对比两张图片的特征序列,相同的位数越多,图片相似度越高。我们可以把相似度定义为:相似度 = 特征序列相同的位数➗特征序列长度
完整代码
from PIL import Image
def hash_img(img):#计算图片的特征序列
a=[]#存储图片的像素
hash_img=''#特征序列
width,height=10,10#图片缩放大小
img=img.resize((width,height))#图片缩放为width×height
for y in range(img.height):
b=[]
for x in range(img.width):
pos=x,y
color_array = img.getpixel(pos)#获得像素
color=sum(color_array)/3#灰度化
b.append(int(color))
a.append(b)
for y in range(img.height):
avg=sum(a[y])/len(a[y])#计算每一行的像素平均值
for x in range(img.width):
if a[y][x]>=avg:#生成特征序列,如果此点像素大于平均值则为1,反之为0
hash_img+='1'
else:
hash_img+='0'
return hash_img
def similar(img1,img2):#求相似度
hash1=hash_img(img1)#计算img1的特征序列
hash2=hash_img(img2)#计算img2的特征序列
differnce=0
for i in range(len(hash1)):
differnce+=abs(int(hash1[i])-int(hash2[i]))
similar=1-(differnce/len(hash1))
return similar
img1=Image.open('1.png')
img2=Image.open('2.png')
print('%.1f%%' % (similar(img1,img2) * 100))
测试
1.png
2.png
3.png
4.png
img1=Image.open('1.png')
img2=Image.open('2.png')
print('%.1f%%' % (similar(img1,img2) * 100))
img3=Image.open('3.png')
img4=Image.open('4.png')
print('%.1f%%' % (similar(img3,img4) * 100))
输出结果:
61.0%
89.0%
1.png和2.png的相似度为61%
3.png和4.png的相似度为89%
以上代码在python 3.7亲测可行,如有错误之处,请大佬指正。