图像检索系列——利用 Python 检测图像类似度

本文的代码可在微信公众号「01二进制」后台回复「检测图像类似度」得到。html

前言

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

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

图像指纹

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

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

汉明距离

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

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

一般用汉明距离来衡量两张图片的差别,汉明距离越小,则表明类似度越高。汉明距离为0,即表明两张图片彻底同样。htm

感知哈希算法

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

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

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

ahash

dhash

phash

固然,你也能够选择安装 ImageHash 库,而后调用相应的hash函数来实现计算。

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

因此看到这对于比较两张图片的类似度咱们就有了一个简单的想法了,只要经过感知哈希算法得到图像的图像指纹,而后比较两个哈希值之间的汉明距离就能够了。

详细的步骤,阮一峰介绍了一个简单的图片搜索原理,可分为下面几步:

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

这种方法对于寻找 如出一辙 的图片是有效的,可是搜索「类似图片」的效果不好,也不能局部搜索,所以一般应用在 「检测图片是否侵权」 上。如今诸如谷歌识图、百度识图几乎都是采用深度学习的方式进行类似性检索,这个下篇文章介绍。

为何余弦类似度不适合用来检测图片类似度

最后咱们来讨论下为何不使用余弦类似度来检测图片的类似度。开篇咱们就说过若是须要用余弦类似度来衡量类似性,咱们须要先构造两个向量。一般状况下咱们会将图片转化为像素向量(基于像素点灰度值的频次),从而计算两个图片的类似度,这种作法其实就是计算两个图片的直方图的类似度,然而这样就只保留了像素的频次信息,丢掉了像素的位置信息,信息损失太大,只在某些场景下适用。用余弦类似度表示图片类似度的代码一样能够微信公众号「01二进制」后台回复「检测图像类似度」得到。

总结

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

因为能力有限,在整理描述的过程当中不免会有些错误,若有建议,能够留言区批评指正🙏


相关文章
相关标签/搜索