图像相似度比较哈希算法:

什么是哈希(Hash)?

• 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定 下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums, 或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。

• 通过哈希算法得到的任意长度的二进制值映射为较短的固定长度的二进制值,即哈希值。此外, 哈希值是一段数据唯一且极其紧凑的数值表示形式,如果通过哈希一段明文得到哈希值,哪怕只 更改该段明文中的任意一个字母,随后得到的哈希值都将不同。

• 哈希算法是一个函数,能够把几乎所有的数字文件都转换成一串由数字和字母构成的看似乱码的 字符串。

哈希函数的特点

哈希函数作为一种加密函数,其拥有两个最重要特点:

  1. 不可逆性。输入信息得出输出的那个看似乱码的字符串(哈希值)非常容易,但是从输出的字符 串反推出输入的结果却是却非常非常难。
  2. 输出值唯一性和不可预测性。只要输入的信息有一点点区别,那么根据哈希算法得出来的输出值 也相差甚远。

哈希算法的种类

哈希算法是一类算法的总称,共有三种:

  1. 均值哈希算法aHash
  2. 差值哈希算法dHash
  3. 感知哈希算法pHash

汉明距离

两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。

均值哈希算法

步骤:

  1. 缩放:图片缩放为8*8,保留结构,除去细节。
  2. 灰度化:转换为灰度图。
  3. 求平均值:计算灰度图所有像素的平均值。
  4. 比较:像素值大于平均值记作1,相反记作0,总共64位。
  5. 生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。
  6. 对比指纹:将两幅图的指纹对比,计算汉明距离,即两个64位的hash值有多少位是不一样的,不 相同位数越少,图片越相似。

差值哈希算法

差值哈希算法相较于均值哈希算法,前期和后期基本相同,只有中间比较hash有变化。

步骤:

  1. 缩放:图片缩放为8*9,保留结构,除去细节。
  2. 灰度化:转换为灰度图。
  3. 求平均值:计算灰度图所有像素的平均值。
  4. 比较:像素值大于后一个像素值记作1,相反记作0。本行不与下一行对比,每行9个像素, 八个差值,有8行,总共64位
  5. 生成hash:将上述步骤生成的1和0按顺序组合起来既是图片的指纹(hash)。
  6. 对比指纹:将两幅图的指纹对比,计算汉明距离,即两个64位的hash值有多少位是不一样 的,不相同位数越少,图片越相似。

感知哈希算法

均值哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希 算法,它采用的是DCT(离散余弦变换)来降低频率的方法。

步骤:

  1. 缩小图片:32 * 32是一个较好的大小,这样方便DCT计算
  2. 转化为灰度图:把缩放后的图片转化为灰度图。
  3. 计算DCT:DCT把图片分离成分率的集合
  4. 缩小DCT:DCT计算后的矩阵是32 * 32,保留左上角的8 * 8,这些代表图片的最低频率。
  5. 计算平均值:计算缩小DCT后的所有像素点的平均值。
  6. 进一步减小DCT:大于平均值记录为1,反之记录为0.
  7. 得到信息指纹:组合64个信息位,顺序随意保持一致性。
  8. 最后比对两张图片的指纹,获得汉明距离即可。

代码实现:均值哈希算法和差值哈希算法

import cv2
import numpy as np#均值哈希算法
def aHash(img):#缩放为8*8img=cv2.resize(img,(8,8),interpolation=cv2.INTER_CUBIC)#转换为灰度图gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#s为像素和初值为0,hash_str为hash值初值为''s=0hash_str=''#遍历累加求像素和for i in range(8):for j in range(8):s=s+gray[i,j]#求平均灰度avg=s/64#灰度大于平均值为1相反为0生成图片的hash值for i in range(8):for j in range(8):if  gray[i,j]>avg:hash_str=hash_str+'1'else:hash_str=hash_str+'0'            return hash_str#差值感知算法
def dHash(img):#缩放8*9img=cv2.resize(img,(9,8),interpolation=cv2.INTER_CUBIC)#转换灰度图gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)hash_str=''#每行前一个像素大于后一个像素为1,相反为0,生成哈希for i in range(8):for j in range(8):if   gray[i,j]>gray[i,j+1]:hash_str=hash_str+'1'else:hash_str=hash_str+'0'return hash_str#Hash值对比
def cmpHash(hash1,hash2):n=0#hash长度不同则返回-1代表传参出错if len(hash1)!=len(hash2):return -1#遍历判断for i in range(len(hash1)):#不相等则n计数+1,n最终为相似度if hash1[i]!=hash2[i]:n=n+1return nimg1=cv2.imread('lenna.png')
img2=cv2.imread('lenna_noise.png')
hash1= aHash(img1)
hash2= aHash(img2)
print(hash1)
print(hash2)
n=cmpHash(hash1,hash2)
print('均值哈希算法相似度:',n)hash1= dHash(img1)
hash2= dHash(img2)
print(hash1)
print(hash2)
n=cmpHash(hash1,hash2)
print('差值哈希算法相似度:',n)

运行结果:

输入:


输出:

图像相似度比较哈希算法

三种算法的比较:
• aHash:均值哈希。速度比较快,但是常常不太精确。
• pHash:感知哈希。精确度较高,但是速度方面较差一些。
• dHash:差值哈希。精确度较高,且速度也非常快。
• 均值哈希本质上是对颜色的比较;
• 感知哈希由于做了 DCT 操作,本质上是对频率的比较;
• 差值哈希本质上是基于渐变的感知哈希算法。

相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)相关推荐

  1. 递归下降分析法的基本思想。_还不懂这八大算法思想,刷再多题也白搭!

    各位朋友好久不见呢.最近由于刚入职,作为职场萌新,所以大部分时间都花在了工作上.因而也没有太多时间来写文章啦,这篇文章也是定题了许久,迟迟没有落笔.等之后工作慢慢稳定,业务熟练起来,文章更新频率就会高 ...

  2. 还不懂这八大算法思想,刷再多题也白搭!

    各位朋友好久不见呢.最近由于刚入职,作为职场萌新,所以大部分时间都花在了工作上.因而也没有太多时间来写文章啦,这篇文章也是定题了许久,迟迟没有落笔.等之后工作慢慢稳定,业务熟练起来,文章更新频率就会高 ...

  3. 不懂这八大算法思想,刷再多题也白搭!

    点击上方"五分钟学算法",选择"星标"公众号 重磅干货,第一时间送达 来源:业余码农 算法和数据结构一直以来都是程序员的基本内功,可以说没有数据结构的基础建设和 ...

  4. 拍立淘的图像搜索与识别

    阿里巴巴iDST 高级算法专家渊捷为大家分享了图像搜索与识别的相关技术,主要介绍拍立淘使用深度学习以及相关算法在以图搜图.图像细粒度识别.大规模向量搜索.3D建模等方面的研究和应用. 直播回顾请点击 ...

  5. 第二讲 算法思想的发展历程

    第二讲   算法思想的发展历程 教学目标与教学指导: 算法思想源远流长,中国古代数学中就蕴涵了丰富的算法思想.随着现代信息技术飞速发展,算法在科学技术.社会发展中发挥着越来越大的作用,并且日益融入社会 ...

  6. SIFT算法总结:用于图像搜索

    原始文章链接:http://bubblexc.com/y2011/163/ 原文链接:http://blog.csdn.net/cserchen/article/details/5606859 关于三 ...

  7. 计算机视觉编程——图像搜索

    文章目录 图像搜索 1 基于内容的图像检索 2 视觉单词 3 图像索引 3.1 建立数据库 3.2 添加图像 4 在数据库中搜索图像 4.1 利用索引获取候选图像 4.2 用一幅图像进行查询 4.3 ...

  8. 深度增强学习前沿算法思想

    作者: Flood Sung,CSDN博主,人工智能方向研究生,专注于深度学习,增强学习与机器人的研究.  责编:何永灿,欢迎人工智能领域技术投稿.约稿.给文章纠错,请发送邮件至heyc@csdn.n ...

  9. java架构师进阶之独孤九剑(一)-算法思想与经典算法

    " 这是整个架构师连载系列,分为9大步骤,我们现在还在第一个步骤:程序设计和开发->数据结构与算法. 我们今天讲解重点讲解算法. 算法思想 1 贪心思想 顾名思义,贪心算法总是作出在当 ...

最新文章

  1. pyrender 安装
  2. FFMPEG结构体分析
  3. 如何查询当前SAP用户所属的组织单元(organization unit)
  4. 33条C#、.Net经典面试题目及答案[zt]
  5. 西安单招学校学计算机软件的,西北大学软件职业技术学院单招
  6. 哈佛大学计算机科学专,哈佛大学计算机科学专业
  7. 测试环境搭建流程_软件测试流程
  8. vs2019的mfc学习
  9. PostgreSQL与mysql语法不同
  10. 程序员笔名、别名_适合程序员的英文名字
  11. 推荐网络带宽控制软件Netlimiter
  12. 年度催泪之作:2015中国程序员生存报告
  13. 前端面试 - JS总结(1) - 基础 (数据类型, 事件与函数, 原型链)
  14. 使用 PyTorch 搭建网络 - predict_py篇
  15. 最好用的免费的UML工具软件
  16. pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮2输出消息、按钮3可退出
  17. LTSPICE使用教程:参数变量和参数扫描
  18. 如何进行远程连接?亲测有效!
  19. 为搬砖做一点准备工作
  20. python单下划线和双下滑线

热门文章

  1. POJ 1511 Invitation Cards——Dijkstra优先队列优化+反向建图
  2. c++ 智能指针用法详解
  3. 剑指Offer10- II. 青蛙跳台阶问题
  4. linux内核netfilter模块分析之:HOOKs点的注册及调用
  5. winshark重要数据结构
  6. Coding Interview Guide -- 向有序的环形单链表中插入新节点
  7. Odoo免费开源企业信息化平台助力企业成功
  8. VS2015升级Update2之后Cordova程序提示:此应用程序无法在此电脑上运行
  9. 深入理解计算机系统----读书笔记
  10. 获取当前目录绝对路径