前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图片相似度识别:dHash算法

图片相似度识别:dHash算法

作者头像
三猫
发布2019-10-24 20:50:35
4.1K0
发布2019-10-24 20:50:35
举报

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

1 dHash算法

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

基本原理:

  1. 缩小尺寸。将图片缩小为9*8大小,此时照片有72个像素点。
  2. 灰度化处理
  3. 计算差异值,获得最后哈希值(与aHash主要区别处)。比较每行左右两个像素,如果左边的像素比右边的更亮(左边像素值大于右边像素值),则记录为1,否则为0。因为每行有9个像素,左右两个依次比较可得出8个值,所以8行像素共可以得出64个值,因此此时哈希值为长度是64的0-1序列。
  4. 图片配对,计算汉明距离

2 Python实现

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

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

最终结果:

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

3 优缺点

优点:速度快,判断效果比aHash好

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习养成记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档