利用Python实现简单的相似图片搜索


【搞了好几天,终于把程序复原调试通过,特此在这里把技术文档贴出来,尤其是环境配置的说明,供大家分享。】
 

写作本文的目是发现建立网站的时候,很多用户用相同的头像,这导致识别度降低,为了防止用户上传相同的图片作为自己的头像以及上传不当的图像文件,作者研究了这个图像指纹的问题。

                             

每个人都有属于他自己的指纹,指纹能够识别人,那么图片的指纹也可以用来识别图片。这促使了一个三阶段算法的实现:

1. 为图片建立指纹,然后将图片指纹存储在一个数据库中。

2. 当一个用户上传一份新的头像时,我们会将它与数据库中的图片指纹对比。如果上传的图片的指纹与数据任意一个图片指纹相符,我们就阻止用户将该图片设置为个人头像。

3. 当图片监管人标记新的图片时,这些图片也被赋予指纹并存入我们的数据库,建立一个能用于阻止使用与库内相同图片且不断进化的数据库。

现在,我把这个算法的基本内容分享出来,期望可以将它应用到你们自己的项目中。

但最大的问题是,我们怎么才能建立图片指纹呢?继续读下去一探究竟吧。
 

即将要做的事情

我们打算用图片指纹进行相似图片的检测。这种技术通常被称为“感知图像hash”或是简单的“图片hash”。 【参阅《感知图像hash》,问题:为什么hash是图片的唯一?】

什么是图片指纹/图片哈希 

图片hash是检测一张图片的内容然后根据检测的内容为图片建立一个唯一值的过程。

比如,看看本文最上面的那张图片。给定一张图片作为输入,应用一个hash函数,然后基于图片的视觉计算出一个图片hash。相似的图片也应当有相似的hash值。图片hash算法的应用使得相似图片的检测变得相当简单了。

特别地,我们将会使用“差别Hash”或简单的DHash算法计算图片指纹。简单来说,DHash算法着眼于两个相邻像素之间的差值。然后,基于这样的差值,就建立起一个hash值了。 【阅读:DHash算法计算图片指纹

为什么不使用md5,sha-1等算法?

不幸的是,我们不能在实现中使用加密hash算法。由于加密hash算法的本质使然,输入文件中非常微小的差别也能造成差异极大的hash值。而在图片指纹的案例中,我们实际上希望相似的输入可以有相似的hash输出值。


图片指纹可以用在哪里?

1、正如我上面举的例子,你可以使用图片指纹来维护一个保存不雅图片的数据库——当用户尝试上传类似图片时可以发出警告。

2、你可以建立一个图片的逆向搜索引擎,比如TinEye,它可以记录图片以及它们出现的相关网页。

3、你还可以使用图片指纹帮助管理你个人的照片收集。假设你有一个硬盘,上面有你照片库的一些局部备份,但需要一个方法删除局部备份,一张图片仅保留一份唯一的备份——图片指纹可以帮你做到。

简单来说,你几乎可以将图片指纹/哈希用于任何需要你检测图片的相似副本的场景中。


需要的库有哪些?

为了建立图片指纹方案,我们打算使用三个主要的Python包:

1.  PIL/Pillow用于读取和载入图片

2.  ImageHash,包括DHash的实现

3.  以及NumPy/SciPy,ImageHash的依赖包

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值