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