转载请注明出处python
在重复图识别领域,对于识别肉眼相同图片,感知哈希效果是很鲁棒的。上一篇文章 【PHash】更懂人眼的感知哈希 介绍的PHash识别效果很好,可是它有一个缺点,只关注低频信息,并无关注图片的空间信息,极端状况就可能出现彻底不一样的两张图片,phash值很近。而WHash利用小波变换不只重点关注低频信息,同时也关注图片的空间信息。算法
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
其中预处理就是缩放+转灰度图,而二值化跟PHash同样,都是利用中值看成基准值。
这里的重点在于小波变换,下面简单直观的给你们看下小波变换到底是什么?3d
在图片上进行小波变换,能够把图片的低频跟高频信息拆分,以下所示:
code
其中,A是低频信息,H是水平高频信息,V是垂直高频信息、D是对角高频信息。blog
在实际运用,并非只进行一次低频高频拆分,会进行屡次,以下图所示:
在WHash这里,咱们只是拿最右边那张图片,左上角1/4信息进行二值化,其余信息都是抛弃的。
在WHash里面,小波变换并非单纯的拿到了图片的低频信息,并且还保存了自己图片的空间信息,因此它实际使用过程当中,比PHash鲁棒一些。固然若是PHash对只对低频部分进行DCT逆变换,而后再进行二值化,也是能够考虑上空间信息的,跟WHash同样的道理。图片