前言

最近在做一个海量图片检索的项目,可以简单的理解为“以图搜图”,这个功能一开始是搜索引擎带火的,但是后来在电商领域变得非常实用。在制作这个图片检索的项目前,笔者搜索了一些资料,如今项目临近结尾,便在这里做一些简单的分享。本文先介绍图像检索最基础的一部分知识——利用 Python 检测图像相似度。

提到检测“某某”的相似度相信很多人第一想法就是将需要比较的东西构建成两个向量,然后利用余弦相似度来比较两个向量之间的距离,这种方法应用很广泛,例如比较两个用户兴趣的相似度、比较两个文本之间的相似度。但是这个方法在比较图片相似度的时候用到的并不多,原因我之后再说,这里先来介绍下另外两个概念—— 图像指纹 和 汉明距离 。

图像指纹

图像指纹和人的指纹一样,是身份的象征,而图像指纹简单点来讲, 就是将图像按照一定的哈希算法,经过运算后得出的一组二进制数字。 如下图所示:

Python资源共享群:626017123

在给定的输入的图像中,我们可以使用一个散列函数, 并基于图像视觉上的外观计算它的“图像散列”值,相似的头像,它的散列值应该也是相似的。构建图像指纹的算法被称为 感知哈希算法(Perceptual Hash Algorithm) 。

汉明距离

通过上述对图像指纹的描述我们知道了可以利用 感知哈希算法 将图片转换成某种字符串,而比较字符串有一种名为 汉明距离 的表示方法。以下定义摘自维基百科:

在信息论中,两个等长字符串之间的 汉明距离 (英语:Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说, 它就是将一个字符串变换成另外一个字符串所需要 替换 的字符个数。

通常用汉明距离来 衡量两张图片的差异 ,汉明距离越小,则代表相似度越高。汉明距离为0,即代表两张图片完全一样。

感知哈希算法

常用的感知哈希算法有三个,分别是平均哈希算法(aHash)、感知哈希算法(pHash)、差异值哈希算法(dHash)。至于这三种哈希算法的介绍和比较很多博客都有写,而且很多库都支持直接计算哈希值,调用一下相关函数就可以了。这里就不多说了,推荐一篇文章:point_right: 《图像相似度中的Hash算法》

代码可在微信公众号「01二进制」后台回复「检测图像相似度」获得

三种哈希算法的实现代码如下:

ahash

dhash

phash

当然,你也可以选择安装 ImageHash 库,然后调用相应的hash函数来实现计算。

比较两个图片相似度的思路

所以看到这对于比较两张图片的相似度我们就有了一个简单的想法了,只要通过 感知哈希算法 获得图像的图像指纹,然后比较两个哈希值之间的 汉明距离 就可以了。

详细的步骤,阮一峰介绍了一个简单的图片搜索原理,可分为下面几步:缩小尺寸。将图片缩小到 8x8 的尺寸,总共 64 个像素。这一步的作用是去除图片的细节,只保留结构、明暗等基本信息,摒弃不同尺寸、比例带来的图片差异。

简化色彩。将缩小后的图片,转为 64 级灰度。也就是说,所有像素点总共只有 64 种颜色。

计算平均值。计算所有 64 个像素的灰度平均值。

比较像素的灰度。将每个像素的灰度,与平均值进行比较。大于或等于平均值,记为 1 ;小于平均值,记为 0。

计算哈希值。将上一步的比较结果,组合在一起,就构成了一个 64 位的整数,这就是这张图片的指纹。组合的次序并不重要,只要保证所有图片都采用同样次序就行了。

这种方法对于寻找 一模一样 的图片是有效的,但是搜索「相似图片」的效果很差,也不能局部搜索,因此通常应用在 「检测图片是否侵权」 上。现在诸如谷歌识图、百度识图几乎都是采用深度学习的方式进行相似性检索,这个下篇文章介绍。

为什么余弦相似度不适合用来检测图片相似度

最后我们来讨论下为什么不使用余弦相似度来检测图片的相似度。开篇我们就说过如果需要用余弦相似度来衡量相似性,我们需要先构造两个向量。通常情况下我们会将图片转化为像素向量(基于像素点灰度值的频次),从而计算两个图片的相似度,这种做法其实就是计算两个图片的直方图的相似度,然而这样就只保留了像素的频次信息,丢掉了像素的位置信息,信息损失太大,只在某些场景下适用。用余弦相似度表示图片相似度的代码同样可以微信公众号「01二进制」后台回复「检测图像相似度」获得。

总结

本文介绍的方法都是通过非深度学习的手段来检测图像的相似度,虽然理解起来都很容易,但是每种方法都有局限性。想要制作一个图像检索系统虽然第一步都是比较图像的相似度,但现如今大多数都是通过深度学习的方法提取出图像特征,然后再进行比较,准确率大大提升。之后我将会讲述如何通过深度学习抽取图像特征的方式来比较图片的相似度。

python判断图片相似度_图像检索系列——利用 Python 检测图像相似度!相关推荐

  1. python 判断图片是否损坏_检查图片是否损坏、图片后缀是否与实际图片类型对应 - Python...

    图片工具 检查图片是否损坏 日常工作中,时常会需要用到图片,有时候图片在下载.解压过程中会损坏,而如果一张一张点击来检查就太不Cool了,因此我想大家都需要一个检查脚本: 测试图片,0.jpg是正常的 ...

  2. python实现图片格式转换_干货必看 | Python实现图片格式转化

    今天教大家一个实用的小技巧,用Python实现图片格式转化,即将PDF格式转化成PNG格式. 整体代码: import fitz ''' #将PDF转化为图片 pdfPath pdf文件的路径 img ...

  3. python提取pdf的数字_详解利用python提取pdf文本数字

    之前也不乏介绍过关于excel的内容,日常工作应用,除了excel,pdf也是经常使用的一种,关于pdf的文本提取,下面也来详细介绍~ 说明:从pdf文件中提取其他类型的数据,如文本或图像.将说明从p ...

  4. python批处理栅格转点_三种利用Python批量处理地理数据的方法——以栅格数据投影转换为例...

    时至今日,笔者已经总结了三种用Python语言结合ArcGIS10.2提供的接口去批量处理地理数据的方法.即: 1. 用IDLE.Python Tools for Visual Studio等去编写独 ...

  5. python zxing 识别条码_详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强...

    前言 这周和大家分享如何用python识别图像里的条码.用到的库可以是zbar.希望西瓜6辛苦码的代码不要被盗了.(zxing的话,我一直没有装好,等装好之后再写一篇) 具体步骤 前期准备 用open ...

  6. python判断图片类型_Python使用filetype精确判断文件类型

    filetype.py Small and dependency free Python package to infer file type and MIME type checking the m ...

  7. python 判断图片的类型

    仅仅根据文件后缀判断文件类型显然不准,在python有一个内置模块imghdr可以用来判断图片的真实类型.代码如下: import imghdr imgType = imghdr.what(image ...

  8. python将图片转动漫_使用代码将照片变成卡通图片——Python篇

    之前的文章介绍了使用Photoshop将照片变成卡通图片,今次介绍用代码来实现这项任务,可以就此探查各种滤镜的内部机制. 制作环境:Windows10,Python2.7,Anaconda 任务描述: ...

  9. python判断图片类型_Python判断图片真实类型

    仅仅根据文件后缀判断文件类型显然不准,在python有一个内置模块imghdr可以用来判断图片的真实类型.代码如下: import imghdr imgType = imghdr.what(image ...

  10. python判断是否回文_对python判断是否回文数的实例详解

    设n是一任意自然数.若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数.例如,若n=1234321,则称n为一回文数:但若n=1234567,则n不是回文数. 上面的解释就是说回文数和逆 ...

最新文章

  1. 页面是可以这样设计的
  2. python pyside简单布局_python – pyside显示/隐藏布局
  3. VMWare NAT模式和桥接模式的区别
  4. SpringMVC实现简单登录
  5. java findclass_带你深入了解Class类-深度分析:反射从入门到精通
  6. 程序员懂点经济学-股票投资
  7. Extjs发票管理系统
  8. Android 之自定义组件
  9. STM32 资料整理贴
  10. 微信php签名验证_微信公众平台安全模式消息体签名及加解密PHP代码示例
  11. 力扣-525 连续数组
  12. 圆锥曲线中的范围最值问题
  13. 三角函数之和差化积/积化和差/倍角公式(汇总)
  14. 吴恩达深度学习课程-Course 4 卷积神经网络 第一周 卷积神经网络编程作业(第一部分)
  15. 关系数据库——关系操作和关系完整性
  16. shell if -n 参数
  17. 动力节点-crm-项目笔记(待完善)
  18. 50 条有趣的 Python 一行代码
  19. obsidian第三方插件无法加载
  20. lesson2--html-css基础主要知识点

热门文章

  1. linux内存不足杀进程,Linux内存不足杀死进程
  2. 对话 NuCypher:如何安全地存储、共享和管理链上私人数据
  3. 最新QQ坦白说消息查看发送者
  4. 成信大809软件工程专业基础历年真题及答案
  5. 德州农工计算机科学教授,德州农工大学计算机博士招生中,机器学习与数据挖掘方向,有奖学金...
  6. [复现论文程序图]High Speed Continuous Variable Source-Independent Quantum Random Number Generation...
  7. html平安夜模板,高校社团平安夜活动策划模板
  8. 如何查看电脑所有连接过的wifi密码?
  9. 计算机操作系统进程管理总结
  10. 零雨其蒙:Practicing Test-Driven Development by Example Using Delphi