tuoheng_algN/test/水印/余弦相似度计算.py

97 lines
3.3 KiB
Python
Raw Normal View History

2025-01-21 09:26:34 +08:00
## -*- 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/1.jpg')
image2 = cv2.imread('../image/2.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(hash1, hash2)
#将距离转化为相似度
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)