## -*- coding: utf-8 -*- # !/usr/bin/env python # 余弦相似度计算 import time import cv2 from PIL import Image from numpy import average, dot, linalg # 对图片进行统一化处理 def get_thum(image, size=(64, 64), greyscale=False): # 利用image对图像大小重新设置, Image.ANTIALIAS为高质量的 image = image.resize(size, Image.ANTIALIAS) if greyscale: # 将图片转换为L模式,其为灰度图,其每个像素用8个bit表示 image = image.convert('L') return image # 计算图片的余弦距离 def image_similarity_vectors_via_numpy(image1, image2): image1 = get_thum(image1) image2 = get_thum(image2) images = [image1, image2] vectors = [] norms = [] for image in images: vector = [] for pixel_tuple in image.getdata(): vector.append(average(pixel_tuple)) vectors.append(vector) # linalg=linear(线性)+algebra(代数),norm则表示范数 # 求图片的范数 norms.append(linalg.norm(vector, 2)) a, b = vectors a_norm, b_norm = norms # dot返回的是点积,对二维数组(矩阵)进行计算 res = dot(a / a_norm, b / b_norm) return res #差值感知算法 def dHash(image): #缩放9*8 image=cv2.resize(image,(9,8),interpolation=cv2.INTER_CUBIC) #转换灰度图 image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY) # print(image.shape) hash=[] #每行前一个像素大于后一个像素为1,相反为0,生成哈希 for i in range(8): for j in range(8): if image[i,j]>image[i,j+1]: hash.append(1) else: hash.append(0) return hash #计算汉明距离 def Hamming_distance(hash1,hash2): num = 0 for index in range(len(hash1)): if hash1[index] != hash2[index]: num += 1 return num if __name__ == '__main__': # 把图片表示成一个向量,通过计算向量之间的余弦距离来表征两张图片的相似度 0.9760 image1 = cv2.imread('image/AI.jpg') image2 = cv2.imread('image/AI1.jpg') image3 = cv2.imread('image/AI2.jpg') image4 = cv2.imread('image/AI3.jpg') image5 = cv2.imread('image/AI4.jpg') image6 = cv2.imread('a.jpg') image7 = cv2.imread('AI.jpg') hash1 = dHash(image1) hash2 = dHash(image2) hash3 = dHash(image3) hash4 = dHash(image4) hash5 = dHash(image5) hash6 = dHash(image6) hash7 = dHash(image7) start = time.time() dist = Hamming_distance(hash6, hash7) #将距离转化为相似度 similarity = 1 - dist * 1.0 / 64 print(dist) print(similarity, time.time() - start) # cosin = image_similarity_vectors_via_numpy(image1, image2) # print('图片余弦相似度', cosin) # cosin1 = image_similarity_vectors_via_numpy(image1, image3) # print('图片余弦相似度', cosin1) # cosin2 = image_similarity_vectors_via_numpy(image1, image4) # print('图片余弦相似度', cosin2) # cosin3 = image_similarity_vectors_via_numpy(image1, image5) # print('图片余弦相似度', cosin3) # cosin4 = image_similarity_vectors_via_numpy(image5, image6) # print('图片余弦相似度', cosin4) # cosin5 = image_similarity_vectors_via_numpy(image1, image6) # print('图片余弦相似度', cosin5)