您的位置:首页 > 其它

图片相似度识别:dHash算法

2021-03-23 20:44 148 查看

1

dHash算法

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

基本原理:

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

  2. 灰度化处理

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

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


2

Python实现

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

(image1)

(image2)


  • 完整算法


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))

最终结果:

可见两张图片相似度非常低。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: