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

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

什么是哈希(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 操作,本质上是对频率的比较;
• 差值哈希本质上是基于渐变的感知哈希算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389507.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云AI应用产品总监王磊:AI 在传统产业的最佳实践

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 背景:5月23-24日,以“焕启”为主题的腾讯“云未来”峰会在广州召开,广东省各级政府机构领导、海内外业内学术专家、行业大咖及技术大牛等在现场共议云计算与数字化产业创…

标准化(Normalization)和归一化实现

概念: 原因: 由于进行分类器或模型的建立与训练时,输入的数据范围可能比较大,同时样本中各数据可 能量纲不一致,这样的数据容易对模型训练或分类器的构建结果产生影响,因此需要对其进行标准 化处理&#x…

Toast源码深度分析

目录介绍 1.最简单的创建方法 1.1 Toast构造方法1.2 最简单的创建1.3 简单改造避免重复创建1.4 为何会出现内存泄漏1.5 吐司是系统级别的 2.源码分析 2.1 Toast(Context context)构造方法源码分析2.2 show()方法源码分析2.3 mParams.token windowToken是干什么用的2.4 schedul…

序列化框架MJExtension详解 + iOS ORM框架

当开发中你的模型中属性名称和 字典(JSON/XML) 中的key 不能一一对应时, 或者当字典中嵌套了多层字典数组时..., 以及教你如何用 MJExtension 配置类来统一管理你的模型配置, 下面罗列了开发中常见的一些特殊情况, 请参考!(MJExtension/github) 最基本用法: // 将字典转为模型 …

运行keras出现 FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of type is deprecated解决办法

运行keras出现 FutureWarning: Passing (type, 1) or ‘1type’ as a synonym of type is deprecated; in a future version of numpy, 原则来说,没啥影响,还是能运行,但是看着难受 解决办法: 点击蓝色的链接: 进入 …

RedirectToAction()转移方式及参数传递

今天在做一个功能的时,使用RedirectToAction()需要从这里传几个参数,从网上查了一下,这样解决。真好。 Return RedirectToAction("Index","ManageInfo",new{type0,page1});转载于:https://www.cnblogs.com/ZaraNet/p/978…

软件项目风险管理

近几年来软件开发技术、工具都有了很大的进步,但是软件项目开发超时、超支、甚至不能满足用户需求而根本没有得到实际使用的情况仍然比比皆是。软件项目开发和管理中一直存在着种种不确定性,严重影响着项目的顺利完成和提交。但这些软件风险并未得到充分…

mongdb 群集_群集文档的文本摘要

mongdb 群集This is a part 2 of the series analyzing healthcare chart notes using Natural Language Processing (NLP)这是使用自然语言处理(NLP)分析医疗保健图表笔记的系列文章的第2部分。 In the first part, we talked about cleaning the text and extracting sectio…

keras框架实现手写数字识别

详细细节可学习从零开始神经网络:keras框架实现数字图像识别详解! 代码实现: [1]将训练数据和检测数据加载到内存中(第一次运行需要下载数据,会比较慢): (mnist是手写数据集) train_images是用于训练系统…

gdal进行遥感影像读写_如何使用遥感影像进行矿物勘探

gdal进行遥感影像读写Meet Jose Manuel Lattus, a geologist from Chile. In the latest Soar Cast, he discusses his work in mineral exploration and environmental studies, and explains how he makes a living by creating valuable information products based on diff…

从零开始神经网络:keras框架实现数字图像识别详解!

接口实现可参考:keras框架实现手写数字识别 思路: 我们的代码要导出三个接口,分别完成以下功能: 初始化initialisation,设置输入层,中间层,和输出层的节点数。训练train:根据训练数据不断的更…

大数据学习第一贴

搞了这么久的开发,一直没有养成发博客的习惯,今天开始对大数据所需内容进行总结性记录,并对以后遇到的问题形成一个自己的知识库。就这些!转载于:https://blog.51cto.com/13921538/2299765

推荐算法的先验算法的连接_数据挖掘专注于先验算法

推荐算法的先验算法的连接So here we are diving into the world of data mining this time, let’s begin with a small but informative definition;因此,这一次我们将进入数据挖掘的世界,让我们从一个小的但内容丰富的定义开始; 什么是数…

Android 页面多状态布局管理

一、现状 页面多状态布局是开发中常见的需求,即页面在不同状态需要显示不同的布局,实现的方式也比较多,最简单粗暴的方式就是在 XML 中先将不同状态对应的布局隐藏起来,根据需要改变其可见状态,如果多个界面公用相同的…

Tensorflow入门神经网络代码框架

Tensorflow—基本用法 使用图 (graph) 来表示计算任务.在被称之为 会话 (Session) 的上下文 (context) 中执行图.使用 tensor 表示数据.通过 变量 (Variable) 维护状态.使用 feed 和 fetch 可以为任意的操作(arbitrary operation)赋值或者从其中获取数据。 • TensorFlow 是一…

手把手教你把代码丢入github 中

手把手教你把代码丢入github 中 作为一个小运维一步步教你们怎么把代码放入到github 中 首先呢我们下载一个git的客户端 https://git-scm.com/downloads/ 下载一个最新版的2.16.2 下载后那就安装吧。如果看不懂英文就选择默认安装的方式吧。但是你得记住你的软件安装的位置 小…

时间序列模式识别_空气质量传感器数据的时间序列模式识别

时间序列模式识别 1. Introduction 2. Exploratory Data Analysis ∘ 2.1 Pattern Changes ∘ 2.2 Correlation Between Features 3. Anomaly Detection and Pattern Recognition ∘ 3.1 Point Anomaly Detection (System Fault) ∘ 3.2 Collective Anomaly Detection (Externa…

oracle 性能优化 07_诊断事件

2019独角兽企业重金招聘Python工程师标准>>> 一、诊断事件 诊断事件无官方技术文档支持,使用存在风险,慎用。使用诊断事件可以获取问题更多的信息,调整系统运行 特性,启用某些内部功能。用于系统故障的诊断。跟踪应…

Tensorflow框架:卷积神经网络实战--Cifar训练集

Cifar-10数据集包含10类共60000张32*32的彩色图片,每类6000张图。包括50000张训练图片和 10000张测试图片 代码分为数据处理部分和卷积网络训练部分: 数据处理部分: #该文件负责读取Cifar-10数据并对其进行数据增强预处理 import os impo…

计算机科学速成课36:自然语言处理

词性 短语结构规则 分析树 语音识别 谱图 快速傅里叶变换 音素 语音合成 转载于:https://www.cnblogs.com/davidliu2018/p/9149252.html