相似图片搜索的三种哈希算法
想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,达到图片比较目的且利用信息指纹比较有三种算法,这些算法都很易懂,下面分别介绍一下:
一、平均哈希算法(aHash)
此算法是基于比较灰度图每个像素与平均值来实现的,最适用于缩略图,放大图搜索。
步骤:
1.缩放图片:为了保留结构去掉细节,去除大小、横纵比的差异,把图片统一缩放到8*8,共64个像素的图片。
2.转化为灰度图:把缩放后的图片转化为256阶的灰度图。
附上灰度图相关算法(R = red, G = green, B = blue)
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.
需要说明的是这种指纹算法不仅可以应用于图片搜索,同样适用于其他多媒体形式。除此之外,图片搜索特征提取方法有很多,很多算法还有许多可以改进的地方,比如对于人物可以先进行人脸识别,再在面部区域进行局部的哈希,或者背景是纯色的可以先过滤剪裁等等,最后在搜索的结果中还可以根据颜色、风景、产品等进行过滤。
==================================================================================================
作者:nash_ 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/nash_/article/details/8618775
===================================================================================================
相似图片搜索的三种哈希算法相关推荐
- 相似图片搜索的三种算法
相似图片搜索的三种算法 想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下: 一.平 ...
- 图片识别——三种哈希算法性能与准确度比较
前面几篇文章对图片的三种哈希算法做了简单的介绍:均值哈希算法,感知哈希算法,差异哈希算法.本篇将对上面算法做一个总结.并对在性能方面做些对比. 性能和准确度 目前有个超过150,000张图片的实验,有 ...
- c# pictureBox1.Image的获得图片路径的三种方法 winform
代码如下:c# pictureBox1.Image的获得图片路径的三种方法 winform 1.绝对路径: this.pictureBox2.Image=Image.FromFile("D: ...
- 实现精灵图片绝对定位的三种方式(伪)
精灵图片绝对定位的三种方式(伪) 有强迫症的我为此困扰了一上午,说白了还是自己实力不够,想法总被局限. 实现结果如上图中间的为最终满意样品 整体用列表写的` 左1: 把整体看成一个背景图加上面文字: ...
- 如何提高图片清晰度?三种方法来帮你!
如何提高图片清晰度?图片在上传到网络后会被压缩,导致图片变得模糊.今天,我将分享三种方法,帮助您提高图片的清晰度. 方法一:使用记灵在线工具 工具地址:记灵在线工具 - 更专注于发现工具的实用性 该工 ...
- 算法:三种简单排序算法
排序算法比較常见的有:冒泡排序.简单选择排序.直接插入排序:希尔排序.堆排序.归并排序和高速排序算法等. 今天先学习一下前面三种比較简单的算法.排序的相关概念: ①排序的稳定性:两个或多个元素相等.排 ...
- Hive的内置HASH()函数使用哪种哈希算法
内置的HASH()函数使用哪种哈希算法? 我理想地是在寻找SHA512/SHA256哈希,类似于SHA()函数在Pig的linkedin datafu UDF中提供的功能. 最佳答案 HASH函数(从 ...
- 三种洗牌算法shuffle
1. 背景 笔试时,遇到一个算法题:差不多是 在n个不同的数中随机取出不重复的m个数.洗牌算法是将原来的数组进行打散,使原数组的某个数在打散后的数组中的每个位置上等概率的出现,刚好可以解决该问题. 2 ...
- JVM的三种垃圾回收算法
一.什么是垃圾? 在了解垃圾回收机制之前我们首先要定义一下什么是垃圾,我们内存里大部分的对象都是随着方法的执行而创建,方法执行完毕后这些对象就不会被再次使用了,但是这些生成的对象不会被清除掉,所以我们 ...
最新文章
- mysql5.1 与mysql5.5 字符集设置区别
- python zookeeper_ZooKeeper的安装以及客户端Kazoo(Python语言)的安装与使用
- 全面剖析支付宝服务窗功能二次开发
- 优秀的人,都敢对自己下狠手
- goland go test_七天用Go写个docker(第一天)
- 前端学习(1893)vue之电商管理系统电商系统之自定义状态列的效果
- WinCE内核裁减(中文字体)及字库和内核的分离
- jQuery: 选择器(DOM,name,属性,元素)
- MySQL性能优化之:索引下推
- 服务器mbr文件丢失吗,硬盘中了MBR病毒不要急,一款工具帮你搞定,保证数据不丢失!...
- Kalibr 标定双目内外参数以及 IMU 外参数
- QueryRunner类 的應用,以及ResultSetHandler 接口的实现类
- mysql 查看修改连接数据库_mysql查看最大连接数和修改mysql数据库最大连接数方法...
- 变量求和_高中生看过来:高考数列求和的方法有哪些?本文主要分享6种方法...
- 华硕笔记本触摸鼠标手势无效怎么办
- viewUrl 终结者
- 让iPhone不能自动下载系统更新的一个办法
- UVA 10451 Ancient Village Sports UVA 11909 Soya Milk UVA 11152 Colourful Flowers
- .NET 高级架构师0003 架构师之路(2)---架构师的职责
- VS2017卡在登录界面问题
热门文章
- 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构
- Android 房租计算器,简单计算器
- c语言 最长单词,c语言求最长公共单词
- mASK调制在AWGN信道下的可达信息速率的Monte Carlo仿真计算法
- 在html网页上在线连接邮箱,怎么在html中创建超级链接和电子邮件链接
- VOC数据集的划分(训练集,验证集,测试集) 生成txt文件和标签
- Python matplotlib 饼图
- keepalive (1)
- vue视频教程百度云资源链接
- 微信小程序 保存图片 wx.saveImageToPhotosAlbum