vlambda博客
学习文章列表

图片相似度识别:dHash算法

之前已经介绍了aHash算法的基本原理及python实现代码(戳:),本次来继续介绍图片相似度识别的另一常用哈希算法——dHash。

1

dHash算法

    aHash中文叫差异哈希算法,在对图片进行哈希转换时,通过左右两个像素大小的比较,得到最终哈希序列。

基本原理

  1. 缩小尺寸。将图片缩小为9*8大小,此时照片有72个像素点。

  2. 灰度化处理

  3. 计算差异值,获得最后哈希值(与aHash主要区别处)。比较每行左右两个像素,如果左边的像素比右边的更亮(左边像素值大于右边像素值),则记录为1,否则为0因为每行有9个像素,左右两个依次比较可得出8个值,所以8行像素共可以得出64个值,因此此时哈希值为长度是64的0-1序列。

  4. 图片配对,计算汉明距离

2

Python实现

本例中依然计算以下两张图片的相似度:

图片相似度识别:dHash算法

(image1)

图片相似度识别:dHash算法

(image2)

  • 完整算法

from PIL import Imageimport osimport numpy as npimport 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好


往期推荐

· 

· 

· 

· 

· 

· 



爱我,请给我好看