import cv2 from PIL import Image import numpy as np def a_hash_a(image_path): # 打开图片 image = Image.open(image_path) # 缩小图片尺寸到8x8 image = image.resize((8, 8), Image.Resampling.LANCZOS) # 转换为灰度图 image = image.convert('L') # 将图片转换为numpy数组 data = np.array(image) # 计算所有像素的灰度平均值 mean_value = data.mean() # 比较每个像素的灰度与平均值,生成hash值 hash_str = ''.join(['1' if i > mean_value else '0' for i in data.flatten()]) # 返回64位的hash值 return int(hash_str, 2) def a_hash_b(image_path): # 打开图片 image = Image.open(image_path) # 缩小图片尺寸到32x32 image = image.resize((32, 32), Image.Resampling.LANCZOS) # 转换为灰度图 image = image.convert('L') # 将图片转换为numpy数组 data = np.array(image) # 应用DCT变换 dct = dct_transform(data) # 取左上角8x8的DCT系数 dct_low = dct[:8, :8] # 计算DCT系数的平均值 mean_value = dct_low.flatten().mean() # 比较每个DCT系数与平均值,生成hash值 hash_str = ''.join(['1' if i >= mean_value else '0' for i in dct_low.flatten()]) # 返回64位的hash值 return int(hash_str, 2) def dct_transform(image): # 将图片转换为灰度图 gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 应用2D离散余弦变换 dct = cv2.dct(np.float32(gray_image)) return dct if __name__ == '__main__': hash_value1 = a_hash_a('../images/3.jpeg') hash_value2 = a_hash_a('../images/2.jpg') print(f'running 1... {hash_value1} 2... {hash_value2}')