写作本文的目是发现建立网站的时候,很多用户用相同的头像,这导致识别度降低,为了防止用户上传相同的图片作为自己的头像以及上传不当的图像文件,作者研究了这个图像指纹的问题。
每个人都有属于他自己的指纹,指纹能够识别人,那么图片的指纹也可以用来识别图片。这促使了一个三阶段算法的实现:
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的实现