• 首页
  • 狐文
  • 狐图
  • About
狐窝
OvO
  1. 首页
  2. 未分类
  3. 正文

相似图片搜索的三种哈希算法

2017年08月09日 259点热度 0人点赞 0条评论

2013-03-01 04:32 from---http://blog.csdn.net/zmazon/article/details/8618775

想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,达到图片比较目的且利用信息指纹比较有三种算法,这些算法都很易懂,下面分别介绍一下:

一、平均哈希算法(aHash)

此算法是基于比较灰度图每个像素与平均值来实现的,最适用于缩略图,放大图搜索。

步骤:

1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片。

2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。

附上灰度图相关算法(R = red, G = green, B = blue)

1.浮点算法:Gray=R*0.3+G*0.59+B*0.11
2.整数方法:Gray=(R*30+G*59+B*11)/100
3.移位方法:Gray =(R*76+G*151+B*28)>>8;
4.平均值法:Gray=(R+G+B)/3;
5.仅取绿色:Gray=G;

3.计算平均值: 计算进行灰度处理后图片的所有像素点的平均值。

4.比较像素灰度值:遍历灰度图片每一个像素,如果大于平均值记录为1,否则为0.

5.得到信息指纹:组合64个bit位,顺序随意保持一致性即可。

6.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)

下面是我用Java写的此算法的程序,eclipse可直接运行。

下载地址:http://download.csdn.net/detail/nash_/5093143

待比较的原图:

图片库中的四张图:

输出结果:

similar_pic.jpg与原图很少相似
google.gif与原图完全不同
origin.jpg与原图是同一张图
ohter_word.jpg与原图极其相似

二、感知哈希算法(pHash)

平均哈希算法过于严格,不够精确,更适合搜索缩略图,为了获得更精确的结果可以选择感知哈希算法,它采用的是DCT(离散余弦变换)来降低频率的方法

步骤:

1.缩小图片:32 * 32是一个较好的大小,这样方便DCT计算

2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)

3.计算DCT:DCT把图片分离成分率的集合

4.缩小DCT:DCT是32*32,保留左上角的8*8,这些代表的图片的最低频率

5.计算平均值:计算缩小DCT后的所有像素点的平均值。

6.进一步减小DCT:大于平均值记录为1,反之记录为0.

7.得到信息指纹:组合64个信息位,顺序随意保持一致性即可。

8.对比指纹:计算两幅图片的指纹,计算汉明距离(从一个指纹到另一个指纹需要变几次),汉明距离越大则说明图片越不一致,反之,汉明距离越小则说明图片越相似,当距离为0时,说明完全相同。(通常认为距离>10 就是两张完全不同的图片)

此算法可参考开源项目pHash,下载地址:http://www.phash.org/download/

三、差异哈希算法(dHash)

相比pHash,dHash的速度要快的多,相比aHash,dHash在效率几乎相同的情况下的效果要更好,它是基于渐变实现的。

步骤:

1.缩小图片:收缩到9*8的大小,一遍它有72的像素点

2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。(具体算法见平均哈希算法步骤)

3.计算差异值:dHash算法工作在相邻像素之间,这样每行9个像素之间产生了8个不同的差异,一共8行,则产生了64个差异值

4.获得指纹:如果左边的像素比右边的更亮,则记录为1,否则为0.

需要说明的是这种指纹算法不仅可以应用于图片搜索,同样适用于其他多媒体形式。除此之外,图片搜索特征提取方法有很多,很多算法还有许多可以改进的地方,比如对于人物可以先进行人脸识别,再在面部区域进行局部的哈希,或者背景是纯色的可以先过滤剪裁等等,最后在搜索的结果中还可以根据颜色、风景、产品等进行过滤。

标签: 暂无
最后更新:2017年08月09日

OvO

狐狸

点赞
< 上一篇
下一篇 >
最新 热点 随机
最新 热点 随机
证书的SCT相关 ssl证书生成时插入OID TrueNAS SCALE docker安装使用联合文件系统mergerfs Iptables 端口(流量)转发 如何在GIT中删除第一个提交 TrueNas 虚拟机无法连接主机 dnsmasq ipset iptables 实现对流量进行分流 新版 Ubuntu 修改IP DCHP K3S 创建portainer 通过声音进行数据传输 Windows精简部署相关简易内容 ConstraintLayout 和 Coordinator 对比 Android 为View分配id wireshark解析TCP tcpdump rpcapd 相关编译方法 双网卡调整优先级 Android 禁用IPv6 ​APC UPS相关资料 PowerChute Business Edition - Supported UPS Models
dnsmasq ipset iptables 实现对流量进行分流TrueNas 虚拟机无法连接主机如何在GIT中删除第一个提交Iptables 端口(流量)转发TrueNAS SCALE docker安装使用联合文件系统mergerfsssl证书生成时插入OID证书的SCT相关
Ubuntu20如何禁用IPV6 Linux安装bbr CentOS 启用EPEL仓库 程序员必读书单 1.0 一键批量禁用、清空系统日志事件 验证码破解技术四部曲之使用K近邻算法(三) maven代理配置 selenium处理极验滑动验证码 linux(ubuntu为例)解决wifi不能用的方法 Anaconda之conda常用命令介绍 Oracle 12c 添加scott用户 openvpn路由配置 oracle 12c创建可插拔数据库(PDB)与用户详解 SourceTree 免登录跳过初始设置 Linux 中如何启用和禁用网卡 linux下trash代替rm Python书籍推荐 Centos7安装Oracle12c
标签聚合
windows 下载 docker 未分类 http 网卡 android https linux ssl 密码 ipv com chrome 编译 git

COPYRIGHT © 2020 狐窝. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS