图片相似度识别:dHash算法
之前已经介绍了aHash算法的基本原理及python实现代码(戳:),本次来继续介绍图片相似度识别的另一常用哈希算法——dHash。
1
dHash算法
aHash中文叫差异哈希算法,在对图片进行哈希转换时,通过左右两个像素大小的比较,得到最终哈希序列。
基本原理:
缩小尺寸。将图片缩小为9*8大小,此时照片有72个像素点。
灰度化处理。
计算差异值,获得最后哈希值(与aHash主要区别处)。比较每行左右两个像素,如果左边的像素比右边的更亮(左边像素值大于右边像素值),则记录为1,否则为0。因为每行有9个像素,左右两个依次比较可得出8个值,所以8行像素共可以得出64个值,因此此时哈希值为长度是64的0-1序列。
图片配对,计算汉明距离。
2
Python实现
本例中依然计算以下两张图片的相似度:
(image1)
(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 = 0for index in range(len(hash1)):if hash1[index] != hash2[index]:num += 1return numif __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 / 64print('dist is '+'%d' % dist)print('similarity is ' +'%d' % similarity)print('time is '+ '%f'%(end-start))
最终结果:
可见两张图片相似度非常低。
3
优缺点
优点:速度快,判断效果比aHash好
·
·
·
·
·
·
爱我,请给我好看
