【WHash】更有空间感的感知哈希

转载请注明出处python

背景

在重复图识别领域,对于识别肉眼相同图片,感知哈希效果是很鲁棒的。上一篇文章 【PHash】更懂人眼的感知哈希 介绍的PHash识别效果很好,可是它有一个缺点,只关注低频信息,并无关注图片的空间信息,极端状况就可能出现彻底不一样的两张图片,phash值很近。而WHash利用小波变换不只重点关注低频信息,同时也关注图片的空间信息。算法

WHash算法

  • WHash算法以下:
    在这里插入图片描述
    下面附上源代码,代码很短,也能够先忽略:
  • python源码以下:
def whash(image, hash_size = 8):
    #check
    assert hash_size & (hash_size-1) == 0, "hash_size is not power of 2"
    image_scale = max(2**int(numpy.log2(min(image.size))), hash_size)
    ll_max_level = int(numpy.log2(image_scale))
    level = int(numpy.log2(hash_size))
    assert level <= ll_max_level, "hash_size in a wrong range"
    
    #预处理
    image = image.convert("L").resize((image_scale, image_scale), Image.ANTIALIAS)
    pixels = numpy.asarray(image) / 255.
    
    # 小波变换,haar
    coeffs = pywt.wavedec2(pixels, 'haar', level = ll_max_level)
    # 去掉最低频
    coeffs[0] *= 0
    # 小波逆变换
    dwt_low = pywt.waverec2(coeffs[:level+1], 'haar')
    #二值化,中值
    med = numpy.median(dwt_low)
    diff = dwt_low > med   
    return diff

WHash算法其实也比较简单,主要利用了小波变换获取低频信息,主要就是下面3步:.net

  • 图片预处理(resize,转灰度图)
  • 小波变换
  • 二值化

其中预处理就是缩放+转灰度图,而二值化跟PHash同样,都是利用中值看成基准值。
这里的重点在于小波变换,下面简单直观的给你们看下小波变换到底是什么?3d

直观理解小波变换

在图片上进行小波变换,能够把图片的低频跟高频信息拆分,以下所示:
在这里插入图片描述code

其中,A是低频信息,H是水平高频信息,V是垂直高频信息、D是对角高频信息。blog

在实际运用,并非只进行一次低频高频拆分,会进行屡次,以下图所示:
在这里插入图片描述
在WHash这里,咱们只是拿最右边那张图片,左上角1/4信息进行二值化,其余信息都是抛弃的。
在WHash里面,小波变换并非单纯的拿到了图片的低频信息,并且还保存了自己图片的空间信息,因此它实际使用过程当中,比PHash鲁棒一些。固然若是PHash对只对低频部分进行DCT逆变换,而后再进行二值化,也是能够考虑上空间信息的,跟WHash同样的道理。图片

相关文章
相关标签/搜索