@ -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'] |
@ -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 | |||||
@ -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'] |
@ -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'] |
@ -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'] |