感知哈希算法是一类算法的总称,包括aHash、pHash、dHash。顾名思义,感知哈希不是以严格的方式计算Hash值,而是以更加相对的方式计算哈希值,因为“相似”与否,就是一种相对的判定。

  • aHash:平均值哈希。速度比较快,但是常常不太精确。
  • pHash:感知哈希。精确度比较高,但是速度方面较差一些。
  • dHash:差异值哈希。精确度较高,且速度也非常快

注意: 但是在下面我用了ahash和dhash得到的哈希值都是一样的,我就有点懵逼了!!!

计算图片的hanming距离步骤(代码里面有介绍):

  • 先将图片压缩成8*8的小图
  • 将图片转化为灰度图
  • 计算图片的Hash值,这里的hash值是64位,或者是32位01字符串
  • 将上面的hash值转换为16位的
  • 通过hash值来计算汉明距离

给出图片:

img1:                                                    img2:

 

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/16 15:40
# @Author  : xhh
# @Desc    : 图片的hash算法
# @File    : image_3hash.py
# @Software: PyCharm
import cv2# 均值哈希算法
def ahash(image):# 将图片缩放为8*8的image =  cv2.resize(image, (8,8), interpolation=cv2.INTER_CUBIC)# 将图片转化为灰度图gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)# s为像素和初始灰度值,hash_str为哈希值初始值s = 0ahash_str = ''# 遍历像素累加和for i in range(8):for j in range(8):s = s+gray[i, j]# 计算像素平均值avg = s/64# 灰度大于平均值为1相反为0,得到图片的平均哈希值,此时得到的hash值为64位的01字符串ahash_str  = ''for i in range(8):for j in range(8):if gray[i,j]>avg:ahash_str = ahash_str + '1'else:ahash_str = ahash_str + '0'result = ''for i in range(0, 64, 4):result += ''.join('%x' % int(ahash_str[i: i + 4], 2))# print("ahash值:",result)return result# 差异值哈希算法
def dhash(image):# 将图片转化为8*8image = cv2.resize(image,(9,8),interpolation=cv2.INTER_CUBIC )# 将图片转化为灰度图gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)dhash_str = ''for i in range(8):for j in range(8):if gray[i,j]>gray[i, j+1]:dhash_str = dhash_str + '1'else:dhash_str = dhash_str + '0'result = ''for i in range(0, 64, 4):result += ''.join('%x'%int(dhash_str[i: i+4],2))# print("dhash值",result)return result# 计算两个哈希值之间的差异
def campHash(hash1, hash2):n = 0# hash长度不同返回-1,此时不能比较if len(hash1) != len(hash2):return -1# 如果hash长度相同遍历长度for i in range(len(hash1)):if hash1[i] != hash2[i]:n = n+1return n
img1 = "../doraemon/image-003.png"
img2 = "../doraemon/image-019.jpg"
img1 = cv2.imread(img1)
img2 = cv2.imread(img2)hash1 = ahash(img1)
print('img1的ahash值',hash1)
hash2= dhash(img1)
print('img1的dhash值',hash2)
hash3= ahash(img2)
print('img2的ahash值',hash3)
hash4= dhash(img2)
print('img2的dhash值',hash4)
camphash1 = campHash(hash1, hash3)
camphash2= campHash(hash2, hash4)
print("ahash均值哈希相似度:",camphash1)
print("dhash差异哈希相似度:",camphash2)

运行结果:

还有一种计算汉明距离的方法,对两者方法都试了一次,一样的:

# -*- coding: utf-8 -*-
# !/usr/bin/env python
# @Time    : 2018/11/17 9:57
# @Author  : xhh
# @Desc    : 图片hash值,与汉明距离的计算
# @File    : image_phash1.py
# @Software: PyCharm
import numpy as py
import cv2# 计算hash值
def p_pash(path):# 读取图片src = cv2.imread(path, 0)# 将图片压缩为8*8的,并转化为灰度图img = cv2.resize(src, (8,8), cv2.COLOR_RGB2GRAY)# 计算图片的平均灰度值avg = sum([sum(img[i]) for i in range(8)])/64# 计算哈希值,与平均值比较生成01字符串str = ''for i in range(8):str += ''.join(map(lambda i: '0' if i< avg else '1', img[i]))# 计算hash值, 将64位的hash值,每4位合成以为,转化为16 位的hash值result = ''for i in range(0, 64, 4):result += ''.join('%x'%int(str[i: i+4], 2))print(result)return result# 计算汉明距离
def hamming_distance(str1, str2):if len(str1) != len(str2):returncount = 0for i in range(len(str1)):if str1[i] != str2[i]:count += 1return counth1 = p_pash('../cat1/cat.1.jpg')
h2 = p_pash('../doraemon/image-003.png')
h3 = p_pash('../doraemon/image-019.jpg')
print(hamming_distance(h1, h2))
print(hamming_distance(h1, h3))
print(hamming_distance(h2, h3))

运行结果:

大家可以关注我和我小伙伴的公众号~~~这里有我和我的小伙伴不定时的更新一些python技术资料哦!!大家也可以留言,讨论一下技术问题,希望大家多多支持,关注一下啦,谢谢大家啦~~

python+opencv 计算图片的感知hash值,来计算汉明距离,简单的找相似图片相关推荐

  1. Java中的Hash值的计算方式,java哈希算法简单数据类型的具体实现

    最近被提及Java中HashMap的一些实现及哈希冲突等,借鉴了一位老哥的部分解析,比较明白的展示hash算法的应用吧 结论: 对于String.Integer等类复写了Object中的hashCod ...

  2. HTML加js实现计算文件哈希值,HTML5 File API 配合 Web Worker 计算大文件 SHA3 Hash 值

    这学期的安全学课程有个作业,内容是写一个软件实现 SHA3 Hash 值的快速计算.想一想老师这么安排,大致上也有一种推广新的密码学算法的意图.既然希望应用起来,天然跨平台的 Web 显然是一项非常具 ...

  3. 利用OPENSSL计算证书文件的HASH值

    有时候app抓包抓不到可能是因为安卓系统等级是7以及以上,这个时候抓包软件的证书必须要导入到系统信任证书列表才能生效. 本文记录下怎么获得证书hash值 下载openssl Win+R,输入cmd,打 ...

  4. Python OpenCV学习笔记之:灰度图像的直方图计算

    为什么80%的码农都做不了架构师?>>>    # -*- coding: utf-8 -*- """ 图像的直方图计算 ""&qu ...

  5. 国密算法:利用python进行sm3 hash算法,计算hash值,国密算法库gmssl的使用

    本篇介绍利用gmssl算法库中的sm3模块来进行hash值的计算. 一 sm3 hash算法的特点: sm3用于计算一个消息的hash值: 几乎无法被逆向,即通过hash值无法推断出原始消息: sm3 ...

  6. IPFS-文件HASH值计算

    文章目录 IPFS如何计算文件hash? IPFS-Multihash 易用需求:Base58 IPFS如何计算文件hash? IPFS采用了SHA2-256这个安全级别还算高的算法,对任意长度的内容 ...

  7. ora hash oracle官网,oracle计算hash值

    oracle计算hash值 1.dbms_utility.get_hash_value( name VARCHAR2, base NUMBER, hash_size NUMBER ) 函数说明 nam ...

  8. 关于计算ico文件hash值脚本

    如何利用ico文件查找出网站的真实IP地址,分享一个计算网站ico文件hash值的工具(python2和python3双版本代码) python2的工具脚本代码 python3的工具脚本代码 pyth ...

  9. Java中的Hash值到底是怎么计算的

    最近被提及Java中HashMap的一些实现及哈希冲突等,不知不觉就想到哈希值到底是怎么计算出来的,正文如下. 结论: 对于String.Integer等类复写了Object中的hashCode方法的 ...

最新文章

  1. APPCAN MAS接口之SOAP
  2. 110. Leetcode 714. 买卖股票的最佳时机含手续费 (动态规划-股票交易)
  3. python中的语言特性_python自测——语言特性
  4. 服务器2008系统驱动3008驱动,sas3008驱动
  5. 全国省市区(县)级地名xml(一)
  6. 卸载vs2015社区版本然后装vs2015专业版本出现问题ActivityLog.xml错误
  7. 使用chkconfig管理开机自启动
  8. 符合应急监管要求的危化品企业双重预防数字化系统
  9. 海康威视监控下载下来的mp4格式的视频,小类别MPEG-PS格式
  10. FFMPEG Qt录屏软件开发之视频采集
  11. 用代码移动桌面图标(贪吃蛇)
  12. 2022非常火过postman的一款技术人必备的接口测试神器:Apifox
  13. GIT Enter passphrase for key 'xxx': 已解决
  14. 谷歌浏览器取消idm在微信读书PC页面自动下载pdf
  15. python关于re模块(正则表达式)
  16. 工作邦智慧水务云平台支持的20+硬件
  17. oracle linux i386,在CentOS 5.5 i386 上安装 Oracle 10G XE
  18. python实现字幕挂载,将字幕文件与视频合并。
  19. EXCEL电子表格:将数字转换成英文金额
  20. puzzy(puZZySex)

热门文章

  1. 隐私计算 — 区块链 — Overview
  2. 2022~2023计算机毕业设计之题目选题
  3. redis的key都变成了backup,值也都不见了,这是为什么呢?
  4. 少儿编程里java_Java少儿编程神器Greenfoot(10)方法
  5. XBee模块使用方法
  6. Recurdyn中Subrtine和ProcessNet的dll文件建立
  7. Xilinx ISE中使用Synplify综合报错的原因
  8. 分布式本地缓存刷新方案
  9. 高级程序员和低级程序员
  10. HTML+CSS+JS网页设计期末课程大作业—— 绿色化妆品HTML+CSS+JavaScript