| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- 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}')
|