有史以来最全的图像相似度算法

浅浅的花香味﹌ 2023-10-03 11:13 21阅读 0赞

使用四种方法计算图片相似度:

MD5、直方图、PSNR、SSIM

  1. import numpy as np
  2. from PIL import Image
  3. from skimage.metrics import structural_similarity
  4. import cv2
  5. import os
  6. import hashlib
  7. import math
  8. '''
  9. 粗暴的md5比较 返回是否完全相同
  10. '''
  11. def md5_similarity(img1_path, img2_path):
  12. file1 = open(img1_path, "rb")
  13. file2 = open(img2_path, "rb")
  14. md = hashlib.md5()
  15. md.update(file1.read())
  16. res1 = md.hexdigest()
  17. md = hashlib.md5()
  18. md.update(file2.read())
  19. res2 = md.hexdigest()
  20. return res1 == res2
  21. def normalize(data):
  22. return data / np.sum(data)
  23. '''
  24. 直方图相似度
  25. 相关性比较 cv2.HISTCMP_CORREL:值越大,相似度越高
  26. 相交性比较 cv2.HISTCMP_INTERSECT:值越大,相似度越高
  27. 卡方比较 cv2.HISTCMP_CHISQR:值越小,相似度越高
  28. 巴氏距离比较 cv2.HISTCMP_BHATTACHARYYA:值越小,相似度越高
  29. '''
  30. def hist_similarity(img1, img2, hist_size=256):
  31. imghistb1 = cv2.calcHist([img1], [0], None, [hist_size], [0, 256])
  32. imghistg1 = cv2.calcHist([img1], [1], None, [hist_size], [0, 256])
  33. imghistr1 = cv2.calcHist([img1], [2], None, [hist_size], [0, 256])
  34. imghistb2 = cv2.calcHist([img2], [0], None, [hist_size], [0, 256])
  35. imghistg2 = cv2.calcHist([img2], [1], None, [hist_size], [0, 256])
  36. imghistr2 = cv2.calcHist([img2], [2], None, [hist_size], [0, 256])
  37. distanceb = cv2.compareHist(normalize(imghistb1), normalize(imghistb2), cv2.HISTCMP_CORREL)
  38. distanceg = cv2.compareHist(normalize(imghistg1), normalize(imghistg2), cv2.HISTCMP_CORREL)
  39. distancer = cv2.compareHist(normalize(imghistr1), normalize(imghistr2), cv2.HISTCMP_CORREL)
  40. meandistance = np.mean([distanceb, distanceg, distancer])
  41. return meandistance
  42. def PSNR(img1, img2):
  43. mse = np.mean((img1/255. - img2/255.) ** 2)
  44. if mse == 0:
  45. return 100
  46. PIXEL_MAX = 1
  47. return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
  48. def SSIM(img1, img2):
  49. gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
  50. gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
  51. # 计算两个灰度图像之间的结构相似度
  52. score, diff = structural_similarity(gray1, gray2, win_size=101, full=True)
  53. # diff = (diff * 255).astype("uint8")
  54. # print("SSIM:{}".format(score))
  55. return score, diff
  56. if __name__ == '__main__':
  57. img1_path = 'dui/1.png'
  58. img2_path = 'dui/2.png'
  59. img1 = cv2.imread(img1_path)
  60. img2 = cv2.imread(img2_path)
  61. # 1.粗暴的md5比较 返回是否完全相同
  62. print('md5_similarity:', md5_similarity(img1_path, img2_path))
  63. # 2.直方图相似度
  64. print('hist_similarity:', hist_similarity(img1, img2))
  65. # 3.PSNR
  66. print('PSNR:', PSNR(img1, img2))
  67. # 4.SSIM
  68. print('SSIM:', SSIM(img1, img2))

发表评论

表情:
评论列表 (有 0 条评论,21人围观)

还没有评论,来说两句吧...

相关阅读

    相关 图像相似Hash算法

    本博客中使用的代码见本文末尾        度量两张图片的相似度有许多算法,本文讲介绍工程领域中最常用的图片相似度算法之一——Hash算法。Hash算法准确的说有三种,分别为