当前位置:   article > 正文

对比多张图片相似度(PYTHON)_python在线图片相似性检测对比系统

python在线图片相似性检测对比系统

可以使用图像处理软件或者编程语言进行相似度对比。常用的指标有:

    1. 均方误差(MSE):计算每个像素的差异,再求平均值。公式:MSE = 1/nΣ(i=1,n)(I1(i)-I2(i))^2,其中I1和I2是两张图片对应像素的灰度值,n是像素数量。MSE越小,表示图片越相似。

    2. 结构相似度指标(SSIM):考虑到人眼对于图像细节的敏感程度,比MSE更能反映图像的相似度。SSIM计算公式较为复杂,包含对于亮度、对比度、结构等因素的综合考虑。

    3. 归一化互相关(NCC):计算两张图片的互相关系数,越接近1则表示图片越相似。公式:NCC = Σ(i=1,n)(I1(i)-u1)*(I2(i)-u2) / sqrt(Σ(i=1,n)(I1(i)-u1)^2*Σ(i=1,n)(I2(i)-u2)^2),其中u1和u2是图片的均值。

    使用以上指标进行对比比较直观,但要注意的是,不同指标适用于不同类型的图片,具体选择应根据实际情况而定。

以下是代码实现(python):

  1. # coding=utf-8
  2. import cv2
  3. from skimage.metrics import structural_similarity
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. """
  7. 图片相似度
  8. """
  9. # 方法一、均方误差(MSE)
  10. def mse(imageA, imageB):
  11. """
  12. 均方误差(MSE):计算每个像素的差异,再求平均值。
  13. 公式:MSE = 1/nΣ(i=1,n)(I1(i)-I2(i))^2,
  14. 其中I1和I2是两张图片对应像素的灰度值,n是像素数量。
  15. 注意:两张图片必须有相同的维度,
  16. MSE越小,表示图片越相似
  17. @param imageA: 图片1
  18. @param imageB: 图片2
  19. @return: MSE越小,表示图片越相似
  20. """
  21. # print(imageA.astype("float"))
  22. # print(imageB.astype("float"))
  23. # 对应像素相减并将结果累加
  24. err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
  25. # 进行误差归一化
  26. err /= float(imageA.shape[0] * imageA.shape[1])
  27. # 返回结果,值越小,表示图片越相似
  28. return err
  29. # 方法二、结构相似度指标(SSIM)
  30. def ssim(imageA, imageB):
  31. """
  32. 考虑到人眼对于图像细节的敏感程度,
  33. 比MSE更能反映图像的相似度。
  34. SSIM计算公式较为复杂,包含对于亮度、对比度、结构等因素的综合考虑。
  35. @param imageA: 图片1
  36. @param imageB: 图片2
  37. @return: SSIM计算公式较为复杂包含对于亮度、对比度、结构等因素的综合考虑。
  38. """
  39. # ssim_val = cv2.SSIM(imageA, imageB)
  40. # ssim_val = structural_similarity(imageA, imageB, data_range=255, multichannel=True)
  41. ssim_val = structural_similarity(imageA, imageB, data_range=255, channel_axis=1)
  42. return ssim_val
  43. # 方法三、归一化互相关(NCC)
  44. def ncc(imageA, imageB):
  45. """
  46. 归一化互相关(NCC):计算两张图片的互相关系数,越接近1则表示图片越相似。
  47. 公式:NCC = Σ(i=1,n)(I1(i)-u1)*(I2(i)-u2) / sqrt(Σ(i=1,n)(I1(i)-u1)^2*Σ(i=1,n)(I2(i)-u2)^2),
  48. 其中u1和u2是图片的均值。
  49. @param imageA: 图片1
  50. @param imageB: 图片2
  51. @return: ncc_val 越接近1则表示图片越相似
  52. """
  53. meanA = np.mean(imageA)
  54. meanB = np.mean(imageB)
  55. ncc_val = np.sum((imageA - meanA) * (imageB - meanB)) / (
  56. np.sqrt(np.sum((imageA - meanA) ** 2)) * np.sqrt(np.sum((imageB - meanB) ** 2)))
  57. return ncc_val
  58. def compare_images(imageA, imageB, title):
  59. # 分别计算输入图片的MSE和SSIM指标值的大小
  60. m = mse(imageA, imageB)
  61. s = ssim(imageA, imageB)
  62. # 创建figure
  63. fig = plt.figure(title)
  64. plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, s))
  65. # plt.suptitle("MSE: %.2f, SSIM: %.2f" % (m, 1))
  66. # 显示第一张图片
  67. ax = fig.add_subplot(1, 2, 1)
  68. plt.imshow(imageA, cmap=plt.cm.gray)
  69. plt.axis("off")
  70. # 显示第二张图片
  71. ax = fig.add_subplot(1, 2, 2)
  72. plt.imshow(imageB, cmap=plt.cm.gray)
  73. plt.axis("off")
  74. plt.tight_layout()
  75. plt.show()
  76. def test1():
  77. # # 读取图片
  78. original1 = cv2.imread("1.png")
  79. contrast1 = cv2.imread("2.png")
  80. shopped1 = cv2.imread("4.png")
  81. h1, w1 = cv2.imread("1.png", cv2.IMREAD_GRAYSCALE).shape
  82. original1 = cv2.resize(original1, (h1, w1))
  83. contrast1 = cv2.resize(contrast1, (h1, w1))
  84. shopped1 = cv2.resize(shopped1, (h1, w1))
  85. # 将彩色图转换为灰度图
  86. original = cv2.cvtColor(original1, cv2.COLOR_BGR2GRAY)
  87. contrast = cv2.cvtColor(contrast1, cv2.COLOR_BGR2GRAY)
  88. shopped = cv2.cvtColor(shopped1, cv2.COLOR_BGR2GRAY)
  89. # # 初始化figure对象
  90. # fig = plt.figure("Images")
  91. # images = ("Original", original), ("Enhance", contrast), ("Others", shopped)
  92. # # 遍历每张图片
  93. # for (i, (name, image)) in enumerate(images):
  94. # # 显示图片
  95. # ax = fig.add_subplot(1, 3, i + 1)
  96. # ax.set_title(name)
  97. # plt.imshow(image, cmap=plt.cm.gray)
  98. # plt.axis("off")
  99. # plt.tight_layout()
  100. # plt.show()
  101. # 比较图片
  102. compare_images(original, original, "Original vs Original")
  103. compare_images(original, contrast, "Original vs Enhance")
  104. compare_images(original, shopped, "Original vs Others")
  105. def test2():
  106. img1 = cv2.imread("2.png", cv2.IMREAD_GRAYSCALE)
  107. img2 = cv2.imread("4.png", cv2.IMREAD_GRAYSCALE)
  108. h1, w1 = img1.shape
  109. img1 = cv2.resize(img1, (h1, w1))
  110. img2 = cv2.resize(img2, (h1, w1))
  111. print('mse : ', mse(img1, img2))
  112. print('ssim : ', ssim(img1, img2))
  113. print('ncc : ', ncc(img1, img2))
  114. if __name__ == '__main__':
  115. # test2()
  116. test1()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/287737
推荐阅读
相关标签
  

闽ICP备14008679号