zoukankan      html  css  js  c++  java
  • 图片哈希概论及python中如何实现对比两张相似的图片

    Google 以图搜图的原理,其中的获取图片 hash 值的方法就是 AHash。

    每张图片都可以通过某种算法得到一个 hash 值,称为图片指纹,两张指纹相近的图片可以认为是相似图片。

    以图搜图的原理就是获取你上传的图片的指纹,和图库的图片指纹对比,查找出最相似的若干张图片展示。

    除了以图搜图,图片哈希还可以做什么呢?例如图片检索,重复图片剔除,图片相似度比较等等。

    这种哈希算法大概有 4 种:

    1,差值哈希:DHash(Difference Hash)
    2,均值哈希:AHash(Average Hash)
    3,感知哈希:PHash(Perceptual Hash)
    4,小波哈希:WHash(Wavelet Hash)

    注:常用的是前面三种,DHash、AHash、PHash。其中 PHash 是增强版的 AHash。

     

    图片基本概念

    图片是由像素点矩阵组成的,信息可保存在数组中,如下图 4*4 的图片,可保存在二维数组中:

    左上角为起始点

    row 表示行,对应图片的高 height,y 方向

    col 表示列,对应图片的宽 width,x 方向

    下面我只讲下感知哈希算法的实现:

    感知哈希(核心就是:离散余弦变换(DCT))

    1,缩小尺寸,建议 32*32
    2,灰度化
    3,进行离散余弦变换(DCT)
    4,取左上角的 8*8 的大小
    5,计算平均值
    6,比较像素的灰度
    7,计算哈希值

     

    PhotoHash 它是python中一个感知哈希算法,用来发现两个图像是否相似。

    1,安装包

    pip install PhotoHash

    2, average_hash

    使用平均哈希算法返回图像的哈希值。该算法将图像中的每个像素与所有像素的平均值进行比较:

    import photohash
    hash_one = photohash.average_hash('123/dy.jpg')
    print(hash_one)
    
    hash_two = photohash.average_hash('123/6000.jpg')
    print(hash_two)

    结果:

    1fffffd48000f0e1
    0effff1b10001f02

    3,distance

    返回给定图像的average_hash之间的汉明距离

    import photohash
    distance = photohash.distance('123/dy.jpg', '123/6000.jpg')
    print(distance)

    结果:
    9

    4,is_look_alike

    返回一个布尔值,判断照片是否相似

    import photohash
    similar = photohash.is_look_alike('123/dy.jpg', '123/6000.jpg')
    print(similar)

    结果:
    True

    import photohash
    similar = photohash.is_look_alike('123/dy.jpg', '123/6000.jpg', tolerance=3)//is_look_alike还接受一个可选的宽容参数,该参数定义了比较的严格程度。
    print(similar)

    5,hash_distance

    返回相同长度的两个哈希之间的汉明距离

    import photohash
    hash_one = photohash.average_hash('123/dy.jpg')
    hash_two = photohash.average_hash('123/6000.jpg')
    distance = photohash.hash_distance(hash_one, hash_two)
    print(distance)

    结果:
    5

    6,hashes_are_similar

    返回一个布尔值,表示两个哈希值是否在给定的公差范围内。与is_look_alike相同,但使用散列而不是图像路径

    import photohash
    hash_one = photohash.average_hash('123/dy.jpg')
    hash_two = photohash.average_hash('123/6000.jpg')
    similar = photohash.hashes_are_similar(hash_one, hash_two)
    print(similar)

    注:通常汉明距离 小于等于5时我们认为这两张图非常相似,大于10 则认为这两张图完全不一样

  • 相关阅读:
    input输入框只能输入数字和 小数点后两位
    HAVING 子句
    GROUP BY 语句
    SUM()函数
    COUNT()函数
    MySQL AVG() 函数
    adb(16)-查看实时资源占用情况top
    adb(15)-刷机相关命令
    adb(14)-设备重启/检测root
    adb(13)-设置系统日期和时间
  • 原文地址:https://www.cnblogs.com/lvye001/p/12084437.html
Copyright © 2011-2022 走看看