diff --git a/codes/sim/__init__.py b/codes/sim/__init__.py new file mode 100644 index 0000000..06d7405 Binary files /dev/null and b/codes/sim/__init__.py differ diff --git a/codes/sim/aHash.py b/codes/sim/aHash.py new file mode 100644 index 0000000..2073ad7 --- /dev/null +++ b/codes/sim/aHash.py @@ -0,0 +1,40 @@ +# 正则化图像 +def regularizeImage(img, size = (8, 8)): + return img.resize(size).convert('L') + +# 计算hash值 +def getHashCode(img, size = (8, 8)): + + pixel = [] + for i in range(size[0]): + for j in range(size[1]): + pixel.append(img.getpixel((i, j))) + + mean = sum(pixel) / len(pixel) + + result = [] + for i in pixel: + if i > mean: + result.append(1) + else: + result.append(0) + + return result + +# 比较hash值 +def compHashCode(hc1, hc2): + cnt = 0 + for i, j in zip(hc1, hc2): + if i == j: + cnt += 1 + return cnt + +# 计算平均哈希算法相似度 +def calaHashSimilarity(img1, img2): + img1 = regularizeImage(img1) + img2 = regularizeImage(img2) + hc1 = getHashCode(img1) + hc2 = getHashCode(img2) + return compHashCode(hc1, hc2) + +__all__ = ['calaHashSimilarity'] diff --git a/codes/sim/compute_similarity.py b/codes/sim/compute_similarity.py new file mode 100644 index 0000000..c7dcfde --- /dev/null +++ b/codes/sim/compute_similarity.py @@ -0,0 +1,89 @@ +from PIL import Image +from multiprocessing import Process +import sim.histogram as htg +import sim.aHash as ah +import sim.pHash as ph +import sim.dHash as dh +import os +import feature +from flask import redirect,url_for + + +# if __name__ == '__main__': + +class simi: + def similarity(self, path): + print("begin") + # print(m) + # print(path) + + folder_path = "upload/" + path + dirs = os.listdir(folder_path) + + # 文件夹下有tmp张图片 + tmp = 0 + for item in dirs: + if os.path.isfile(os.path.join(folder_path, item)): + tmp += 1 + # print(tmp) + + list = [[] for j in range(int(tmp*(tmp-1)*0.5))] # [[], [], [], [], [], []] + + index = 0 + for i in range(1,tmp+1): + for j in range(i+1,tmp+1): + str1 = folder_path + '/img' + str(i) + '.png' + str2 = folder_path + '/img' + str(j) + '.png' + # print(str1) + # print(index) + # print('------------------') + list[index].append(str1) + list[index].append(str2) + + img1 = Image.open(str1) + img2 = Image.open(str2) + img1_htg = htg.regularizeImage(img1) + img2_htg = htg.regularizeImage(img2) + hg1 = img1_htg.histogram() + hg2 = img2_htg.histogram() + + # draw the histogram in a no-blocking way + sub_thread = Process(target=htg.drawHistogram, args=(hg1, hg2,)) + sub_thread.start() + + # print the histogram similarity + htg_result = htg.calMultipleHistogramSimilarity(img1_htg, img2_htg) + list[index].append(htg_result) + print('依据图片直方图距离计算相似度:{}'.format(htg_result)) + + # aHash Calculation + ah_result = ah.calaHashSimilarity(img1, img2) + list[index].append(ah_result) + print('依据平均哈希算法计算相似度:{}/{}'.format(ah_result, 64)) + + # pHash Calculation + ph_result = ph.calpHashSimilarity(img1, img2) + list[index].append(ph_result) + print('依据感知哈希算法计算相似度:{}/{}'.format(ph_result, 64)) + + # dHash Calculation + dh_result = dh.caldHashSimilarity(img1, img2) + list[index].append(dh_result) + print('依据差异哈希算法计算相似度:{}/{}'.format(dh_result, 64)) + + index = index + 1 + # print(list) + # print(index) + # print(tmp) + + the_feature = feature.feat() + message = the_feature.call_feature_extraction_1(folder_path,list,index,tmp) + + # return redirect(url_for('call_feature',alist = list)) + return message + + + + + + diff --git a/codes/sim/dHash.py b/codes/sim/dHash.py new file mode 100644 index 0000000..894a029 --- /dev/null +++ b/codes/sim/dHash.py @@ -0,0 +1,36 @@ +# 正则化图像 +def regularizeImage(img, size = (9, 8)): + return img.resize(size).convert('L') + +# 计算hash值 +def getHashCode(img, size = (9, 8)): + + result = [] + for i in range(size[0] - 1): + for j in range(size[1]): + current_val = img.getpixel((i, j)) + next_val = img.getpixel((i + 1, j)) + if current_val > next_val: + result.append(1) + else: + result.append(0) + + return result + +# 比较hash值 +def compHashCode(hc1, hc2): + cnt = 0 + for i, j in zip(hc1, hc2): + if i == j: + cnt += 1 + return cnt + +# 计算差异哈希算法相似度 +def caldHashSimilarity(img1, img2): + img1 = regularizeImage(img1) + img2 = regularizeImage(img2) + hc1 = getHashCode(img1) + hc2 = getHashCode(img2) + return compHashCode(hc1, hc2) + +__all__ = ['caldHashSimilarity'] \ No newline at end of file diff --git a/codes/sim/histogram.py b/codes/sim/histogram.py new file mode 100644 index 0000000..9c5d5eb --- /dev/null +++ b/codes/sim/histogram.py @@ -0,0 +1,44 @@ +import matplotlib.pyplot as plt + +# 正则化图像 +def regularizeImage(img, size = (256, 256)): + return img.resize(size).convert('RGB') + +# 画出直方图图像 +def drawHistogram(hg1, hg2): + plt.plot(range(len(hg1)), hg1, color='blue', linewidth=1.5, label='img1') + plt.plot(range(len(hg2)), hg2, color='red', linewidth=1.5, label='img2') + plt.legend(loc='upper left') + plt.title('Histogram Similarity') + plt.show() + +# 分块图像4x4 +def splitImage(img, part_size = (64, 64)): + w, h = img.size + pw, ph = part_size + data = [] + for i in range(0, w, pw): + for j in range(0, h, ph): + data.append(img.crop((i, j, i + pw, j + ph)).copy()) + return data + +# 利用单块图片的直方图距离计算相似度 +def calSingleHistogramSimilarity(hg1, hg2): + if len(hg1) != len(hg2): + raise Exception('样本点个数不一样') + sum = 0 + for x1, x2 in zip(hg1, hg2): + if x1 != x2: + sum += 1 - float(abs(x1 - x2) / max(x1, x2)) + else: + sum += 1 + return sum / len(hg1) + +# 利用分块图片的直方图距离计算相似度 +def calMultipleHistogramSimilarity(img1, img2): + answer = 0 + for sub_img1, sub_img2 in zip(splitImage(img1), splitImage(img2)): + answer += calSingleHistogramSimilarity(sub_img1.histogram(), sub_img2.histogram()) + return float(answer / 16.0) + +__all__ = ['regularizeImage', 'drawHistogram', 'calMultipleHistogramSimilarity'] \ No newline at end of file diff --git a/codes/sim/pHash.py b/codes/sim/pHash.py new file mode 100644 index 0000000..7f998ce --- /dev/null +++ b/codes/sim/pHash.py @@ -0,0 +1,122 @@ +import math +import unittest + +# 正则化图像 +def regularizeImage(img, size = (32, 32)): + return img.resize(size).convert('L') + +# 获得图像像素矩阵 +def getMatrix(img): + matrix = [] + size = img.size + for i in range(size[1]): + pixel = [] + for j in range(size[0]): + pixel.append(img.getpixel((j, i))) + matrix.append(pixel) + return matrix + +# 计算系数矩阵 +def getCoefficient(length): + matrix = [] + sqr = 1.0 / math.sqrt(length) + value = [] + for i in range(length): + value.append(sqr) + matrix.append(value) + for i in range(1, length): + value = [] + for j in range(0, length): + value.append(math.sqrt(2.0 / length) * math.cos(i * math.pi * (j + 0.5) / length)) + matrix.append(value) + return matrix + +# 计算矩阵转秩 +def getTranspose(matrix): + new_matrix = [] + for i in range(len(matrix)): + value = [] + for j in range(len(matrix[i])): + value.append(matrix[j][i]) + new_matrix.append(value) + return new_matrix + +# 计算矩阵乘法 +def getMultiply(matrix1, matrix2): + new_matrix = [] + for i in range(len(matrix1)): + value = [] + for j in range(len(matrix2[i])): + ans = 0.0 + for h in range(len(matrix1[i])): + ans += matrix1[i][h] * matrix2[h][j] + value.append(ans) + new_matrix.append(value) + return new_matrix + +# 计算DCT +def DCT(matrix): + length = len(matrix) + A = getCoefficient(length) + AT = getTranspose(A) + temp = getMultiply(A, matrix) + DCT_matrix = getMultiply(matrix, AT) + return DCT_matrix + +# 计算左上角8*8并转化为list +def submatrix_list(matrix, size = (8, 8)): + value = [] + for i in range(size[0]): + for j in range(size[1]): + value.append(matrix[i][j]) + return value + +# 计算hash值 +def getHashCode(sub_list): + length = len(sub_list) + mean = sum(sub_list) / length + + result = [] + for i in sub_list: + if i > mean: + result.append(1) + else: + result.append(0) + + return result + +# 比较hash值 +def compHashCode(hc1, hc2): + cnt = 0 + for i, j in zip(hc1, hc2): + if i == j: + cnt += 1 + return cnt + +# 计算感知哈希算法相似度 +def calpHashSimilarity(img1, img2): + img1 = regularizeImage(img1) + img2 = regularizeImage(img2) + + matrix1 = getMatrix(img1) + matrix2 = getMatrix(img2) + + DCT1 = DCT(matrix1) + DCT2 = DCT(matrix2) + + sub_list1 = submatrix_list(DCT1) + sub_list2 = submatrix_list(DCT2) + + hc1 = getHashCode(sub_list1) + hc2 = getHashCode(sub_list2) + return compHashCode(hc1, hc2) + +# 单元测试 +class TestpHash(unittest.TestCase): + def test_getHashCode(self): + self.assertEqual(getHashCode([1, 2, 3]), [0, 0, 1]) + +if __name__ == '__main__': + unittest.main() + +__all__ = ['calpHashSimilarity']