pic_util.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import cv2
  2. from PIL import Image
  3. import numpy as np
  4. def a_hash_a(image_path):
  5. # 打开图片
  6. image = Image.open(image_path)
  7. # 缩小图片尺寸到8x8
  8. image = image.resize((8, 8), Image.Resampling.LANCZOS)
  9. # 转换为灰度图
  10. image = image.convert('L')
  11. # 将图片转换为numpy数组
  12. data = np.array(image)
  13. # 计算所有像素的灰度平均值
  14. mean_value = data.mean()
  15. # 比较每个像素的灰度与平均值,生成hash值
  16. hash_str = ''.join(['1' if i > mean_value else '0' for i in data.flatten()])
  17. # 返回64位的hash值
  18. return int(hash_str, 2)
  19. def a_hash_b(image_path):
  20. # 打开图片
  21. image = Image.open(image_path)
  22. # 缩小图片尺寸到32x32
  23. image = image.resize((32, 32), Image.Resampling.LANCZOS)
  24. # 转换为灰度图
  25. image = image.convert('L')
  26. # 将图片转换为numpy数组
  27. data = np.array(image)
  28. # 应用DCT变换
  29. dct = dct_transform(data)
  30. # 取左上角8x8的DCT系数
  31. dct_low = dct[:8, :8]
  32. # 计算DCT系数的平均值
  33. mean_value = dct_low.flatten().mean()
  34. # 比较每个DCT系数与平均值,生成hash值
  35. hash_str = ''.join(['1' if i >= mean_value else '0' for i in dct_low.flatten()])
  36. # 返回64位的hash值
  37. return int(hash_str, 2)
  38. def dct_transform(image):
  39. # 将图片转换为灰度图
  40. gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  41. # 应用2D离散余弦变换
  42. dct = cv2.dct(np.float32(gray_image))
  43. return dct
  44. if __name__ == '__main__':
  45. hash_value1 = a_hash_a('../images/3.jpeg')
  46. hash_value2 = a_hash_a('../images/2.jpg')
  47. print(f'running 1... {hash_value1} 2... {hash_value2}')