文章目录

  • 感知哈希算法
  • 实现过程
  • python代码
  • 缺点

感知哈希算法

以图搜图的关键技术叫做”感知哈希算法”(Perceptual hash algorithm),它的作用是对每张图片生成一个”指纹”(fingerprint)字符串,然后比较不同图片的指纹。结果越接近,就说明图片越相似。
感知哈希算法包括均值哈希(aHash)、感知哈希(pHash)和dHash(差异值哈希)。aHash速度较快,但精确度较低;pHash则反其道而行之,精确度较高但速度较慢;dHash兼顾二者,精确度较高且速度较快。
之后我们会一一实现。

实现过程

  1. 缩小尺寸。将图片缩小到8×8的尺寸,总共64个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。
  2. 简化色彩。将缩小后的图片,转为64级灰度。也就是说,所有像素点总共只有64种颜色。
  3. 计算平均值。计算所有64个像素的灰度平均值。
  4. 比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为1;小于平均值,记为0。
  5. 计算哈希值。将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。
  6. 将64位哈希值序列4个4个分割,转为十六进制。
  7. 计算汉明距离,进行比较。

得到指纹以后,就可以对比不同的图片,看看64位中有多少位是不一样的。在理论上,这等同于计算”汉明距离”(Hamming distance),汉明距离指的是,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。
我们一般选择将64位哈希值序列4个4个分割,转为十六进制再进行比较。
通常情况下,如果不相同的数据位不超过5,就说明两张图片很相似;如果大于10,就说明这是两张不同的图片。

python代码

from PIL import Image# 得到十六进制的哈希字符串
def Get_hash(image_path):im = Image.open(image_path)im = im.resize((8, 8), Image.ANTIALIAS).convert('L')  # 将图片缩小到8x8,并改成灰度模式avg = sum(list(im.getdata())) / 64.0  # 得到像素平均值str = ''.join(map(lambda i: '0' if i < avg else '1', im.getdata()))  # 得到哈希字符串str = ''.join(map(lambda x: '%x' % int(str[x: x + 4], 2), range(0, 64, 4)))  # %x:转换无符号十六进制return str# 得到汉明距离
def Get_Hamming(str1, str2):Hamming = 0for i in range(16):if str1[i] != str2[i]:Hamming += 1return Hammingdef run():str1 = Get_hash(r'D:\苍井空1.png')str2 = Get_hash(r'D:\苍井空2.png')Hamming = Get_Hamming(str1, str2)print(str1)print(str2)print(Hamming)run()

缺点

这种算法的优点是简单快速,不受图片大小缩放的影响,缺点是图片的内容不能变更。如果在图片上加几个文字,旋转变形一下,它的哈希值差异都会很大。所以,它的最佳用途是根据缩略图,找出原图。

以图搜图(一):python aHash算法相关推荐

  1. 以图搜图:Python实现dHash算法

    向AI转型的程序员都关注了这个号

  2. 谷歌百度以图搜图 感知哈希算法 C#简单实现

    /// <summary>/// 感知哈希算法/// </summary>public class ImageComparer{ /// <summary>/// ...

  3. 以图搜图Python实现Hash算法

    以图搜图(一):Python实现dHash算法 http://yshblog.com/blog/43 以图搜图(二):Python实现pHash算法 http://yshblog.com/blog/4 ...

  4. python以图搜图_以图搜图(一):Python实现dHash算法(转)

    近期研究了一下以图搜图这个炫酷的东西.百度和谷歌都有提供以图搜图的功能,有兴趣可以找一下.当然,不是很深入.深入的话,得运用到深度学习这货.Python深度学习当然不在话下. 这个功能最核心的东西就是 ...

  5. 【python 以图搜图】三种图片相似度计算融合算法

    目标:在一个文件夹找出相似度较高的图片,达到以图搜图的目的. 我找了十组,都是高度相似的图片. 核心算法: 1.分别自定义三种计算图片相似度算法,计算图片相似度算法ORB算法,以及局部敏感哈希phas ...

  6. python+milvus实现一个以图搜图系统

    目录 引言 说明 准备数据 训练数据 安装minlvus(docker-compose方式) python集成milvus+towhee python后端启动方式 启动前端 查询数据 引言 当您听到& ...

  7. python tensorflow 以图搜图_GitHub - lomoss/SearchImage: 基于VGG16的图像检索系统,简单的以图搜图。...

    项目介绍: 一个简单以图搜图的demo项目,采用vgg16提取特征值,使用Miluvs向量搜索引擎,只有简单几个文件,没有什么技术含量. 项目目录: -SearchImage#项目 -app#Flas ...

  8. 感知哈希算法(Perceptual hash algorithm) 以图搜图

    1.序 目前"以图搜图"的引擎越来越多,可参考博文: http://blog.csdn.net/forthcriminson/article/details/8698175 此篇博 ...

  9. 实战 | 多种方法实现以图搜图

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:AI 算法与图像处理 概述 以图搜图技术是日常生活中常用 ...

最新文章

  1. R 语言中的高级图像处理包
  2. Leetcode--904. 水果成篮
  3. DQL 学习3 -- Administration Methods
  4. is_numeric 检测变量是否为数字或数字字符串
  5. 谷歌浏览器有哪些好用的屏蔽广告插件?怎么屏蔽烦人的百度广告?
  6. 网页版bpc电波对时_BPC电波对时助手下载-BPC电波对时appv1.04 最新版-腾牛安卓网...
  7. “M1芯片”电脑杀手:Windows笔记本电脑目前岌岌可危
  8. java使用HttpURLConnection检索网站时403错误处理方式
  9. python爬虫验证码的识别
  10. mysql 正序_请问mysql 中 怎么实现这种排序,按照状态排序正序,再按照开始时间排序正序,...
  11. 微信域名防封技术,微信域名总是被封如何解决
  12. 作为前端你不得不知-浏览器的工作原理:网络浏览器幕后揭秘
  13. wx 微信小程序 session_key的作用
  14. 利用ELK分析Nginx日志生产实战(高清多图)
  15. bzip2: Data integrity error when decompressing--apt-get update
  16. 1月第1周榜单丨B站UP主排行榜(飞瓜数据B站)发布!
  17. sql server 按拼音分类排序的功能
  18. 博学谷java百度网盘_博学谷javaee在线就业班2020网盘
  19. 书写php代码能使用的正确形式,最新PHP技术笔试练习题
  20. 将年月日时分秒转成年月日

热门文章

  1. 旷视研究院张祥雨:3年看1800篇论文,28岁掌舵旷视基础模型研究
  2. 生信分析之R语言常用R包一步下载
  3. 使用eNSP配置防火墙USG6000v双机热备(VGMP+HRP+OSPF+NAT)
  4. 台式电脑接路由器步骤_台式电脑怎么连接无线路由器 台式电脑无线路由器
  5. 【转载】完全版线段树 by notonlysuccess大牛
  6. 01- SA8155P QNX LA/LV 启动(01) - startup
  7. SHT31/85温湿度传感器驱动代码(基于GD32F103)
  8. python时间间隔标准化输出_利用Python将时间或时间间隔转为ISO 8601格式方法示例...
  9. 【前瞻】Nature:2022年7大“颠覆性”技术
  10. 哦麦艾斯!AI设计的丑衣服将引领时尚?数据结构与算法代码面试题;将文件藏在图片里的隐写工具;蒙古语语音合成语料库