云计算期末大作业 论文图像复用的机器自动检查 魏如蓝 10172100262
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

122 lines
2.9 KiB

3 years ago
  1. import math
  2. import unittest
  3. # 正则化图像
  4. def regularizeImage(img, size = (32, 32)):
  5. return img.resize(size).convert('L')
  6. # 获得图像像素矩阵
  7. def getMatrix(img):
  8. matrix = []
  9. size = img.size
  10. for i in range(size[1]):
  11. pixel = []
  12. for j in range(size[0]):
  13. pixel.append(img.getpixel((j, i)))
  14. matrix.append(pixel)
  15. return matrix
  16. # 计算系数矩阵
  17. def getCoefficient(length):
  18. matrix = []
  19. sqr = 1.0 / math.sqrt(length)
  20. value = []
  21. for i in range(length):
  22. value.append(sqr)
  23. matrix.append(value)
  24. for i in range(1, length):
  25. value = []
  26. for j in range(0, length):
  27. value.append(math.sqrt(2.0 / length) * math.cos(i * math.pi * (j + 0.5) / length))
  28. matrix.append(value)
  29. return matrix
  30. # 计算矩阵转秩
  31. def getTranspose(matrix):
  32. new_matrix = []
  33. for i in range(len(matrix)):
  34. value = []
  35. for j in range(len(matrix[i])):
  36. value.append(matrix[j][i])
  37. new_matrix.append(value)
  38. return new_matrix
  39. # 计算矩阵乘法
  40. def getMultiply(matrix1, matrix2):
  41. new_matrix = []
  42. for i in range(len(matrix1)):
  43. value = []
  44. for j in range(len(matrix2[i])):
  45. ans = 0.0
  46. for h in range(len(matrix1[i])):
  47. ans += matrix1[i][h] * matrix2[h][j]
  48. value.append(ans)
  49. new_matrix.append(value)
  50. return new_matrix
  51. # 计算DCT
  52. def DCT(matrix):
  53. length = len(matrix)
  54. A = getCoefficient(length)
  55. AT = getTranspose(A)
  56. temp = getMultiply(A, matrix)
  57. DCT_matrix = getMultiply(matrix, AT)
  58. return DCT_matrix
  59. # 计算左上角8*8并转化为list
  60. def submatrix_list(matrix, size = (8, 8)):
  61. value = []
  62. for i in range(size[0]):
  63. for j in range(size[1]):
  64. value.append(matrix[i][j])
  65. return value
  66. # 计算hash值
  67. def getHashCode(sub_list):
  68. length = len(sub_list)
  69. mean = sum(sub_list) / length
  70. result = []
  71. for i in sub_list:
  72. if i > mean:
  73. result.append(1)
  74. else:
  75. result.append(0)
  76. return result
  77. # 比较hash值
  78. def compHashCode(hc1, hc2):
  79. cnt = 0
  80. for i, j in zip(hc1, hc2):
  81. if i == j:
  82. cnt += 1
  83. return cnt
  84. # 计算感知哈希算法相似度
  85. def calpHashSimilarity(img1, img2):
  86. img1 = regularizeImage(img1)
  87. img2 = regularizeImage(img2)
  88. matrix1 = getMatrix(img1)
  89. matrix2 = getMatrix(img2)
  90. DCT1 = DCT(matrix1)
  91. DCT2 = DCT(matrix2)
  92. sub_list1 = submatrix_list(DCT1)
  93. sub_list2 = submatrix_list(DCT2)
  94. hc1 = getHashCode(sub_list1)
  95. hc2 = getHashCode(sub_list2)
  96. return compHashCode(hc1, hc2)
  97. # 单元测试
  98. class TestpHash(unittest.TestCase):
  99. def test_getHashCode(self):
  100. self.assertEqual(getHashCode([1, 2, 3]), [0, 0, 1])
  101. if __name__ == '__main__':
  102. unittest.main()
  103. __all__ = ['calpHashSimilarity']