图片哈希概论及python中如何实现对比两张相似的图片
Google 以图搜图的原理,其中的获取图片 hash 值的方法就是 AHash。
每张图片都可以通过某种算法得到一个 hash 值,称为图片指纹,两张指纹相近的图片可以认为是相似图片。
以图搜图的原理就是获取你上传的图片的指纹,和图库的图片指纹对比,查找出最相似的若干张图片展示。
除了以图搜图,图片哈希还可以做什么呢?例如图片检索,重复图片剔除,图片相似度比较等等。
这种哈希算法大概有 4 种:
1,差值哈希:DHash(Difference Hash)
2,均值哈希:AHash(Average Hash)
3,感知哈希:PHash(Perceptual Hash)
4,小波哈希:WHash(Wavelet Hash)
注:常用的是前面三种,DHash、AHash、PHash。其中 PHash 是增强版的 AHash。
图片基本概念
图片是由像素点矩阵组成的,信息可保存在数组中,如下图 4*4 的图片,可保存在二维数组中:
左上角为起始点
row 表示行,对应图片的高 height,y 方向
col 表示列,对应图片的宽 width,x 方向
下面我只讲下感知哈希算法的实现:
感知哈希(核心就是:离散余弦变换(DCT))
- 1,缩小尺寸,建议 32*32
- 2,灰度化
- 3,进行离散余弦变换(DCT)
- 4,取左上角的 8*8 的大小
- 5,计算平均值
- 6,比较像素的灰度
- 7,计算哈希值
- PhotoHash 它是python中一个感知哈希算法,用来发现两个图像是否相似。
1,安装包
- pip install PhotoHash
2, average_hash
使用平均哈希算法返回图像的哈希值。该算法将图像中的每个像素与所有像素的平均值进行比较:
- import photohash
- hash_one = photohash.average_hash('123/dy.jpg')
- print(hash_one)
- hash_two = photohash.average_hash('123/6000.jpg')
- print(hash_two)
结果:
1fffffd48000f0e1
0effff1b10001f02
3,distance
返回给定图像的average_hash之间的汉明距离
- import photohash
- distance = photohash.distance('123/dy.jpg', '123/6000.jpg')
- print(distance)
- 结果:
9
4,is_look_alike
返回一个布尔值,判断照片是否相似
- import photohash
- similar = photohash.is_look_alike('123/dy.jpg', '123/6000.jpg')
- print(similar)
- 结果:
True
- import photohash
similar = photohash.is_look_alike('123/dy.jpg', '123/6000.jpg', tolerance=3)//is_look_alike还接受一个可选的宽容参数,该参数定义了比较的严格程度。
print(similar)
5,hash_distance
返回相同长度的两个哈希之间的汉明距离
- import photohash
- hash_one = photohash.average_hash('123/dy.jpg')
- hash_two = photohash.average_hash('123/6000.jpg')
- distance = photohash.hash_distance(hash_one, hash_two)
- print(distance)
- 结果:
5
6,hashes_are_similar
返回一个布尔值,表示两个哈希值是否在给定的公差范围内。与is_look_alike相同,但使用散列而不是图像路径
- import photohash
- hash_one = photohash.average_hash('123/dy.jpg')
- hash_two = photohash.average_hash('123/6000.jpg')
- similar = photohash.hashes_are_similar(hash_one, hash_two)
- print(similar)
注:通常汉明距离 小于等于5时我们认为这两张图非常相似,大于10 则认为这两张图完全不一样
图片哈希概论及python中如何实现对比两张相似的图片的更多相关文章
- python 1: 解决linux系统下python中的matplotlib模块内的pyplot输出图片不能显示中文的问题
问题: 我在ubuntu14.04下用python中的matplotlib模块内的pyplot输出图片不能显示中文,怎么解决呢? 解决: 1.指定默认编码为UTF-8: 在python代码开头加入如下 ...
- Android向系统相册中插入图片,相册中会出现两张 一样的图片(只是图片大小不一致)
向系统相册中插入图片调用此方法时,相册中会出现两张一样的图片 MediaStore.Images.Media.insertImage 一张图片是原图一张图片是缩略图.表现形式为:android4.4. ...
- python中执行shell的两种方法总结
这篇文章主要介绍了python中执行shell的两种方法,有两种方法可以在Python中执行SHELL程序,方法一是使用Python的commands包,方法二则是使用subprocess包,这两个包 ...
- python中的pandas的两种基本使用
python中的pandas的两种基本使用2018年05月19日 16:03:36 木子柒努力成长 阅读数:480 一.pandas简介 pandas:panel data analysis(面板数据 ...
- SQLSERVER中如何快速比较两张表的不一样
SQLSERVER中如何快速比较两张表的不一样 不知不觉要写2014年的最后一篇博文了~ 一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从 ...
- 【转载】Python中如何高效实现两个字典合并,三种方法比较。
本文转载自:http://www.pythoner.com/13.html Python中将两个字典进行合并操作,是一个比较常见的问题.本文将介绍几种实现两个字典合并的方案,并对其进行比较. 对于这个 ...
- Python中os与sys两模块的区别
<os和sys的官方解释> ➤os os: This module provides a portable way of using operating system dependent ...
- Python中使用正则表达式获取两个字符中间部分
问题背景:当我们爬取网页信息时,对于一些标签的提取是没有意义的,所以需要提取标签中间的信息. 解决办法:用到了re包下的函数 方法1:用到了research()方法和group()方法 方法2:用到了 ...
- python中判断语句用两个or连接的奇葩
学python的时候犯的一个错误,放在这吧.就是在循环某个列表的时候不要去操作它,这是容易忽略的一个地方.所以如果要操作某个列表本身,那么先把该列表copy一份,然后再读取的时候读copy的那份.操作 ...
随机推荐
- [GIT]提交后版本恢复
如果在回退以后又想再次回到之前的版本,可以用relog查看commit id,再使用reset设置. 1.执行 relog 后: 展示的最前面的部分就是commit id,后面会用来作为恢复的 ...
- SSL及TLS
SSL SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议. ...
- Carousel 走马灯
在有限空间内,循环播放同一类型的图片.文字等内容 基础用法 适用广泛的基础用法 结合使用el-carousel和el-carousel-item标签就得到了一个走马灯.幻灯片的内容是任意的,需要放在e ...
- LVS负载均衡(LVS简介、三种工作模式、十种调度算法)
一.LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux内核中实现 ...
- pandas中的reset_index()
数据清洗时,会将带空值的行删除,此时DataFrame或Series类型的数据不再是连续的索引,可以使用reset_index()重置索引. import pandas as pd import nu ...
- flutter textfield设置高度后内容区无法居中?
textfiled 设置高度后,内容永远无法居中,最后找到原因 decoration: 中有一个 contentPadding属性,设置这个属性对应的Padding值即可
- Python深入学习之特殊方法与多范式
Python深入学习之特殊方法与多范式 Python一切皆对象,但同时,Python还是一个多范式语言(multi-paradigm),你不仅可以使用面向对象的方式来编写程序,还可以用面向过程的方式来 ...
- 事件冒泡 --- 仿select下拉框
要求:点击按钮时,下拉框显示:点击页面其他部分时,下拉框消失: 1. 不靠谱代码 <!DOCTYPE html> <html> <head lang="en&q ...
- Intervals and Timeouts
Intervals var num = 0; var max = 10; function incrementNumber(){ num++; // if the max has not been r ...
- java base64相关
文件转Base64: public static String imgToBase64(InputStream inStream) { byte[] data = null; try { //avai ...