python计算图片的相似度

python计算图片的相似度


这里需要用到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
1.png
2.png
2.png
3.png
3.png
4.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亲测可行,如有错误之处,请大佬指正。

猜你喜欢

转载自blog.csdn.net/nejssd/article/details/90291116
今日推荐