稍等片刻,正在加载中...

python之图片指纹(唯一性的)

介绍

每张图片都有一个唯一性的指纹。就好像人类的指纹可以识别出这个人类似。

图片指纹是什么?(图片哈希)

  • 用图片指纹进行相似图片的检测。这种技术通常被称为“感知图像hash”或是简单的“图片hash”。
  • 图片hash是检测一张图片的内容然后根据检测的内容为图片建立一个唯一值的过程。
  • 比如,给定一张图片作为输入,应用一个hash函数,然后基于图片的视觉计算出一个图片hash。相似的图片也应当有相似的hash值。
  • 将会使用“差别Hash”或简单的DHash算法计算图片指纹。简单来说,DHash算法着眼于两个相邻像素之间的差值。然后,基于这样的差值,就建立起一个hash值了。

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

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

安装相关库

pip install Pillow
pip install ImageHash
pip install numpy
pip install scipy

开始使用

获取图片指纹

from PIL import Image
import imagehash

# 给一张图片
img1 = Image.open('images/demo4.jpg')
res = imagehash.dhash(img1) # 4f999cc90979704c

计算汉明距离

汉明距离被用于计算一个哈希中的不同位数。因此,哈希中只有一位不同的两张图片自然比有10位不同的图片更相似。

全部代码

from PIL import Image

import imagehash


def img(img_path):
    """
    图片哈希(类似:4f999cc90979704c)
    :param img_path: 图片路径
    :return: <class 'imagehash.ImageHash'>
    """
    img1 = Image.open(img_path)
    res = imagehash.dhash(img1)
    return res


def hamm_img(res1, res2):
    """
    汉明距离,汉明距离越小说明越相似,等 0 说明是同一张图片,大于10越上,说明完全不相似
    :param res1:
    :param res2:
    :return:
    """
    str1 = str(res1)  # <class 'imagehash.ImageHash'> 转成 str
    str2 = str(res2)
    num = 0  # 用来计算汉明距离
    for i in range(len(str1)):
        if str1[i] != str2[i]:
            num += 1
    return num


if __name__ == '__main__':
    img_path1 = 'images/demo1.jpg'
    img_path2 = 'images/demo2.jpg'
    res = hamm_img(img(img_path1), img(img_path2))
    print('汉明距离是:', res)

posted @ 2020-05-14 16:43  一切皆往事  阅读(3357)  评论(2编辑  收藏  举报