之前已经介绍了aHash算法的基本原理及python实现代码(图片相似度识别:aHash算法),本次来继续介绍图片相似度识别的另一常用哈希算法——dHash。
1 dHash算法
aHash中文叫差异哈希算法,在对图片进行哈希转换时,通过左右两个像素大小的比较,得到最终哈希序列。
基本原理:
2 Python实现
本例中依然计算以下两张图片的相似度:
from PIL import Image
import os
import numpy as np
import time
#差异哈希算法
def dHash(image):
image_new=image
#计算均值
avreage = np.mean(image_new)
hash=[]
#每行前一个像素大于后一个像素为1,相反为0,生成哈希
for i in range(8):
for j in range(8):
if image[i,j]>image[i,j+1]:
hash.append(1)
else:
hash.append(0)
return hash
#计算汉明距离
def Hamming_distance(hash1,hash2):
num = 0
for index in range(len(hash1)):
if hash1[index] != hash2[index]:
num += 1
return num
if __name__ == "__main__":
image1 = Image.open('image1.png')
image2 = Image.open('image2.png')
#缩小尺寸并灰度化
start = time.time()
image1=np.array(image1.resize((9, 8), Image.ANTIALIAS).convert('L'), 'f')
image2=np.array(image2.resize((9, 8), Image.ANTIALIAS).convert('L'), 'f')
hash1 = dHash(image1)
hash2 = dHash(image2)
dist = Hamming_distance(hash1, hash2)
end = time.time()
#将距离转化为相似度
similarity = 1 - dist * 1.0 / 64
print('dist is '+'%d' % dist)
print('similarity is ' +'%d' % similarity)
print('time is '+ '%f'%(end-start))
最终结果:
可见两张图片相似度非常低。
3 优缺点
优点:速度快,判断效果比aHash好