前言

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

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

图像指纹

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

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

汉明距离

通过上述对图像指纹的描述我们知道了可以利用感知哈希算法将图片转换成某种字符串,而比较字符串有一种名为汉明距离的表示方法。以下定义摘自维基百科:在信息论中,两个等长字符串之间的汉明距离(英语:Hamming distance)是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。

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

感知哈希算法

常用的感知哈希算法有三个,分别是平均哈希算法(aHash)、感知哈希算法(pHash)、差异值哈希算法(dHash)。至于这三种哈希算法的介绍和比较很多博客都有写,而且很多库都支持直接计算哈希值,调用一下相关函数就可以了。这里就不多说了,推荐一篇文章? 《图像相似度中的Hash算法》代码可在微信公众号「01二进制」后台回复「检测图像相似度」获得

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

ahash

dhash

phash

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

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

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

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

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

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

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

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

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

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

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

总结

本文介绍的方法都是通过非深度学习的手段来检测图像的相似度,虽然理解起来都很容易,但是每种方法都有局限性。想要制作一个图像检索系统虽然第一步都是比较图像的相似度,但现如今大多数都是通过深度学习的方法提取出图像特征,然后再进行比较,准确率大大提升。之后我将会讲述如何通过深度学习抽取图像特征的方式来比较图片的相似度。由于能力有限,在整理描述的过程中难免会有些错误,如有建议,可以留言区批评指正?

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

  1. python自动化测试视频教程_精品系列-悠悠Python自动化测试学习视频,资源教程下载...

    课程名称 精品系列-悠悠Python自动化测试学习视频,资源教程下载 课程目录 第1课-http协议上 .mp4 第1课-http协议下.mp4 第2课-fiddler抓包与测试上.mp4 第2课-f ...

  2. python灰度共生矩阵_四:利用python的skimage计算灰度共生矩阵

    我们经常提取影像的纹理信息,而提取纹理信息,我们常用灰度共生矩阵,下面就是利用skimage计算图像的GLCM 那么,计算GLCM的是什么包呢: from skimage.feature import ...

  3. python网络安全毕业设计_王国辉-利用Python做网络安全开发

    无论你想做什么任务,你都可以使用Python轻松完成任务.例如,你可以使用该语言将TCP数据包发送到计算机,执行恶意软件分析,并创建入侵检测系统,而对第三方工具的依赖性最小.然而,与C/C++不同,P ...

  4. python 中指针_【系列】Python源码剖析(base 2.7.18)Note之初见“对象”

    P姓"对象"到底长什么样?且听我来扒一下~ 1.1.1对象机制基石--PyObject Python中一切皆对象,即面向对象理论中的"类"和"对象&q ...

  5. python开发数据库_有没有利用python开发数据库的案例

    展开全部 在Windows平台上安装mysql模块用于Python开发 用python连接mysql的时候,需要用的安装版本,源码版本容易有错误62616964757a686964616fe78988 ...

  6. 如何用python爬视频_科学网—利用python爬取一个小视频 - 李鸿斌的博文

    工具 : requests 库 解析: beautifulsoup 任务: 视频抓取 1,分析目标网站 寻找一个虚拟的头文件 User-Agent: Mozilla/5.0 (Windows NT 6 ...

  7. 想学python制作脚本_十分钟利用Python制作属于你自己的个性logo

    前言 词云的使用相信大家已经不陌生了,使用很简单,直接调用wordcloud包就可以了.它的主要功能是根据文本词汇和词汇频率生成图片,从中可以直观的看出各个词汇所占比重. 之前我们也介绍过一篇关于Py ...

  8. python自动化测试视频教程_精品系列-悠悠python自动化测试视频教程

    上海悠悠python接口自动化测试第二期视频教程价值1600 2018年2月 第1课-http协议上 .mp4 第1课-http协议下.mp4 第2课-fiddler抓包与测试上.mp4 第2课-fi ...

  9. python编程基础_月隐学python第2课

    python编程基础_月隐学python第2课 学习目标 掌握变量的输入和输出 掌握数据类型的基本概念 掌握算数运算 1.变量的输入和输出 1.1 变量输入 使用input输入 input用于输入数据 ...

  10. 查看Python的版本_查看当前安装Python的版本

    一.查看Python的版本_查看当前安装Python的版本 具体方法: 首先按[win+r]组合键打开运行: 然后输入cmd,点击[确定]: 最后执行[python --version]命令即可. 特 ...

最新文章

  1. 5G最完整的PPT教材
  2. kubernetes入门(04)kubernetes的核心概念(1)
  3. 35岁的程序员是“都挺好”还是“都挺惨”?\n
  4. 子弹短信新发布,支付宝即将入驻
  5. 论文浅尝 - IJCAI2020 | KGNN:基于知识图谱的图神经网络预测药物与药物相互作用...
  6. NHibernate源码分析开篇
  7. idea 查看实现类快捷键及类里面的方法对应的快捷键、跳到下一行
  8. vagrant 网络三种模式
  9. 程序员需不需要数学知识?
  10. 学习笔记之——YEDDA
  11. ansys选择一个面上所有节点_ansys中如何选择面及其上的节点
  12. 湘潭十八中2021年高考成绩查询,2021年 湖南省湘潭市高中学校排名top10
  13. python_多点拟合曲线并计算曲率半径
  14. J9数字论:关于区块链的那些专业术语
  15. 面试题 05.08. 绘制直线
  16. 聊聊ClickHouse中的低基数LowCardinality类型
  17. Pytorch实现多层lstm
  18. 在web-actix框架上实现上传文件
  19. Nokia手机工程命令
  20. AAAI 2022 | 改进YOLOv3!IA-YOLO:恶劣天气下的目标检测

热门文章

  1. 实变函数自制笔记9:勒贝格积分的极限定理
  2. 【协议森林】IPv6过渡技术之隧道和翻译技术
  3. 使用cd-hit对核酸序列或氨基酸序列聚类
  4. 堆内存和栈内存的区别
  5. 在小写与大写之间加下划线
  6. C语言学习教程:搬箱子游戏开发源码分享
  7. Windows Installer服务总是自动关闭导致无法安装在win10上安装英伟达显卡驱动的解决方案...
  8. python论文用到的外文参考文献_论文外文文献怎么找?
  9. log4j2配置详解及自定义Appender
  10. Oracle跨平台迁移之XTTS