首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >以图搜图(二):python dHash算法

以图搜图(二):python dHash算法

作者头像
Dragon水魅
发布2026-01-23 15:00:52
发布2026-01-23 15:00:52
940
举报
different Hash算法

dHash中文叫差异哈希算法,在对图片进行哈希转换时,通过左右两个像素大小的比较,得到最终哈希序列。相比于aHash算法。dHash速度快,判断效果也要好。

实现过程
  1. 缩小尺寸。将图片缩小为9*8大小,此时照片有72个像素点。
  2. 灰度化处理。
  3. 计算差异值,获得最后哈希值(与aHash主要区别处)。比较每行左右两个像素,如果左边的像素比右边的更亮(左边像素值大于右边像素值),则记录为1,否则为0。因为每行有9个像素,左右两个依次比较可得出8个值,所以8行像素共可以得出64个值,因此此时哈希值为长度是64的0-1序列。
  4. 将64位哈希值序列4个4个分割,转为十六进制。
  5. 图片配对,计算汉明距离。
python代码实现
代码语言:javascript
复制
from PIL import Image
import numpy as np


# 得到哈希值
def Get_hash(img):
    hash = ''

    image = Image.open(img)
    image = np.array(image.resize((9, 8), Image.ANTIALIAS).convert('L'), 'f')  # 9*8缩放,'f'表示整个数组都是float32类型
    # 该遍历方法正好是234个像素
    for i in range(8):
        for j in range(8):
            if image[i, j] > image[i, j + 1]:
                hash += '1'
            else:
                hash += '0'
    print(hash)
    hash = ''.join(map(lambda x: '%x' % int(hash[x: x + 4], 2), range(0, 64, 4)))  # %x:转换无符号十六进制
    return hash


# 得到汉明距离
def Get_Hamming(hash1, hash2):
    Hamming = 0

    for i in range(len(hash1)):
        if hash1[i] != hash2[i]:
            Hamming += 1
    return Hamming


def run():
    hash1 = Get_hash(r'D:\cjk1.png')
    hash2 = Get_hash(r'D:\cjk2.png')
    Hamming = Get_Hamming(hash1, hash2)
    print(hash1)
    print(hash2)
    print(Hamming)


run()
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • different Hash算法
  • 实现过程
  • python代码实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档