【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一样的道理。
【WHash】更有空间感的感知哈希的更多相关文章
- 感知哈希算法的java实现
一.原理讲解 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格式), 两张图片的指纹 ...
- 谷歌百度以图搜图 "感知哈希算法" C#简单实现
/// <summary> /// 感知哈希算法 /// </summary> public class ImageComparer { /// <summary> ...
- 感知哈希算法——Python实现【转】
转自:https://blog.csdn.net/m_buddy/article/details/78887248 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- 感知哈希算法 python 3.4
#!/usr/bin/python # -*- coding: UTF-8 -*- #Less than 10 add to list and sort import glob import os i ...
- 图片哈希概论及python中如何实现对比两张相似的图片
Google 以图搜图的原理,其中的获取图片 hash 值的方法就是 AHash. 每张图片都可以通过某种算法得到一个 hash 值,称为图片指纹,两张指纹相近的图片可以认为是相似图片. 以图搜图的原 ...
- 更有效率的使用Visual Studio(二)
没想到上一篇文章有这么多人喜欢,多谢大家支持.继续- 很多比较通用的快捷键的默认设置其实是有一些缩写在里面的,这个估计也是MS帮助我们记忆.比如说注释代码的快捷键是Ctrl + E + C,我们如果知 ...
- 从HashMap透析哈希表
##扯数据结构 先看一下哈希表的概念: 哈希表是一种数据结构,它可以提供快速的插入操作和查找操作.第一次接触哈希表,他会让人难以置信,因为它的插入和删除.查找都接近O(1)的时间级别.用哈希表,很多操 ...
- 更有效率的使用Visual Studio(一)
很多比较通用的快捷键的默认设置其实是有一些缩写在里面的,这个估计也是MS帮助我们记忆.比如说注释代码的快捷键是Ctrl + E + C,我们如果知道它是 Ctrl + Edit + Comment C ...
- 更有效率的使用 Visual Studio - 快捷键
工欲善其事,必先利其器.虽然说Vim和Emacs是神器,但是对于使用Visual Studio的程序员来说,我们也可以通过一些快捷键和潜在的一些功能实现脱离鼠标写代码,提高工作效率,像使用Vim一样使 ...
随机推荐
- Ceph S3 基于NGINX的集群复制方案
前言 ceph的s3数据的同步可以通过radosgw-agent进行同步,同region可以同步data和metadata,不同region只能同步metadata,这个地方可以参考下秦牧羊梳理的 c ...
- Freebsd10.2安装包升级pkg引起环境破坏的解决
前言 freebsd10.2环境在安装一个新软件包的时候提示升级pkg到1.10.1,然后点击了升级,然后整个pkg环境就无法使用了 记录 升级完了软件包以后第一个错误提示 FreeBSD: /usr ...
- 配置Ceph的IPV6集群
前言 对于IPV6实在是非常的陌生,所以本篇开始会讲一下最基本的网络配置,首先让网络能通起来,最开始就是因为不熟悉IPV6,而直接使用了link local地址,造成了mon部署的时候进程无法绑定到I ...
- linux下内存释放
细心的朋友会注意到,当你在linux下频繁存取文件后,物理内存会很快被用光,当程序结束后,内存不会被正常释放,而是一直作为caching.这个问题,貌似有不少人在问,不过都没有看到有什么很好解决的办法 ...
- FreeMark导出word文件
1.编辑好word 2.将word模板另存为xml格式, 把需要动态生成的文字用${xxx}代替 eg: 张强 替换为:${name} 注意:图片是很长的一个base64的字符,同样替换就好 比如替换 ...
- time和random模块
# 时间模块 # 三种时间表现形式 # 时间戳 # 格式化的时间字符串 # 元组(struct_time)结构化时间 struct_time元组共有9个元素(年,月,日,时,分,秒,一年中的第几周,一 ...
- 2020-11-02(三年之约D92)-优秀不是一种行为,而是一种习惯
1.阅读:<软技能-代码之外的生存指南>- 第45章 培养习惯:刷新你的代码 成就我们的恰恰就是那些不断重复做的事情.因此,优秀不是一种行为,而是一种习惯--亚里士多德 习惯主要由三个要素 ...
- xctf攻防世界——crackme writeup
感谢xctf提供学习平台 https://adworld.xctf.org.cn crackme有壳,脱壳部分见文章: https://www.cnblogs.com/hongren/p/126332 ...
- 匹配p后面不是h的单词
$string = 'python perl pear php'; // 获取p后面不是h的单词 $preg = '/\bp(?!h)[a-z]+\b/'; $status = preg_match_ ...
- ABBYY FineReader 15 PDF文档编辑功能详解
ABBYY FineReader 15(Windows系统)OCR文字识别软件作为一款通用 PDF 工具,能轻松有效地对各种 PDF文档和纸质文档,进行数字化.检索.编辑.转换.包含.分享和合作,而其 ...