|
|
@@ -0,0 +1,54 @@
|
|
|
+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}')
|