zoukankan      html  css  js  c++  java
  • 【WHash】更有空间感的感知哈希

    转载请注明出处

    背景

    在重复图识别领域,对于识别肉眼相同图片,感知哈希效果是很鲁棒的。上一篇文章 【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步:

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

    其中预处理就是缩放+转灰度图,而二值化跟PHash一样,都是利用中值当作基准值。
    这里的重点在于小波变换,下面简单直观的给大家看下小波变换究竟是什么?

    直观理解小波变换

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

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

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

  • 相关阅读:
    Django REST framework
    SQL的JOIN语法解析(inner join, left join, right join, full outer join的区别)
    zipfile 解压文件名乱码
    Django开发BUG汇总
    [Java 并发] AQS 是个啥?
    [碎碎念]来水一篇
    [Java 并发]深入浅出 synchronized 与锁
    [Java 并发]你确定你了解 volatile ?
    [Java 并发]为什么会有重排序?和 happens-before 有啥关系
    [Java 并发]带你从源码解读线程组( ThreadGroup )好不好
  • 原文地址:https://www.cnblogs.com/ERKE/p/14124309.html
Copyright © 2011-2022 走看看