相似图片搜索——感知哈希算法
注:原文地址:感知哈希算法
感知哈希算法
感知哈希算法(PHA)是哈希算法的一类,主要用来做相似图片的搜索工作。
算法原理
为图片生成一个指纹(字符串格式), 两张图片的指纹越相似, 说明两张图片就越相似。
算法步骤
1.缩小尺寸:将图片缩小到8*8的尺寸,总共64个像素。
2.简化色彩:将缩小后的图片,转为64级灰度,也就是说,所有的像素点共只有64种颜色。
3.计算DCT(离散余弦变换):DCT是把图片分解频率聚集和梯状形,虽然JPEG使用8*8的
DCT变换,在这里使用32*32的DCT变换。
4.缩小DCT:虽然DCT的结果是32*32大小的矩阵,但我们只要保留左上角的8*8的矩阵,这
部分呈现了图片中的最低频率。
5.计算平均值:计算所有64个值得平均值。
6.进一步减少DCT:根据8*8的DCT矩阵,设置0或1的64位hash值,大于DCT均值的设为“1”
小于DCT均值的设为“0”。
7.计算哈希值:将64bit设置成64位的长整型,组合的次序并不重要,只要保证所有图片都
采用同样次序就行了。将32*32的DCT转换成32*32的图像。
算法的优点
无论你改变图片的高宽、亮度甚至颜色,都不会改变哈希值。
参考代码
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
#include <fstream>
using namespace std;
using namespace cv;
string PHA(Mat &src)
{Mat img, dst;string ans(64, 0);double Hash[64];double mid = 0.0;double eps = 1e-9;int k = 0;//1.缩小尺寸resize(src, src, Size(8, 8));//2.简化色彩if (src.channels() == 3){cvtColor(src, src, CV_BGR2GRAY);img = Mat_<double>(src);}else{img = Mat_<double>(src);}//3.计算DCTdct(img, dst);//4.缩小DCT for (int i = 0; i < 8; i++){for (int j = 0; j < 8; j++){Hash[k++] = dst.at<double>(i, j);mid += Hash[k - 1];}}//5.计算平均值mid = mid / 64;//6.计算哈希值for (int i = 0; i < 64; i++){if (Hash[i] - mid>eps) ans[i] = '1';else ans[i] = '0';}return ans;
}//计算汉明距离
int dis(string s1, string s2)
{int ans = 0;for (int i = 0; i < 64; i++)if (s1[i] != s2[i]) ans++;return ans;
}
int main()
{ofstream out;out.open("test.txt");Mat src;string s1, s2;int k;Mat img;s1 = PHA(src);out << "person.jpg" << " " << s1 << endl;char path[] = { "person0.jpg" };for (int i = 0; i < 9; i++){path[6] += 1;img = imread(path);s2 = PHA(img);k = dis(s1, s2);out << path << " " << s2 << " " << k << endl;}out.close();return 0;
}
参考资料
1.感知哈希算法–百度百科
2.Neal Krawetz的博客Looks like it
相似图片搜索——感知哈希算法相关推荐
- 图片识别——感知哈希算法
所谓感知哈希算法(Perceptual hash algorithm,PHA),它是用于对多种格式的数据生成一个指纹的算法.当然本文只讨论图片格式.感知哈希不同于密码哈希(如md5云云),它对于相似特 ...
- 基于感知哈希算法的中药标本相似图片的搜索
一 前言 笔者最近在开发中药标本相似图片的搜索,就是根据用户上传的图片,然后到中药标本库里找到相似的图片,从而帮助用户识别标本,获取标本信息.查阅了大量资料,看到了阮一峰的一篇文章,经过一个月的开发终 ...
- 【转】感知哈希算法——找出相似的图片
Google 图片搜索功能 在谷歌图片搜索中, 用户可以上传一张图片, 谷歌显示因特网中与此图片相同或者相似的图片. 比如我上传一张照片试试效果: 原理讲解 参考Neal Krawetz博士的这篇文章 ...
- 感知哈希算法——找出相似的图片
参考Neal Krawetz博士的这篇文章, 实现这种功能的关键技术叫做"感知哈希算法"(Perceptual Hash Algorithm), 意思是为图片生成一个指纹(字符串格 ...
- 相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现
相似图片检测:感知哈希算法之aHash,dHash,pHash的Python实现 原文:http://blog.sina.com.cn/s/blog_56fd58ab0102xpqf.html 感知哈 ...
- 相似图片检测:感知哈希算法之dHash的Python实现
原文:https://blog.csdn.net/haluoluo211/article/details/52769325 相似图片检测:感知哈希算法之dHash的Python实现 某些情况下,我们需 ...
- 相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)
图像相似度比较哈希算法: 什么是哈希(Hash)? • 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字"指纹"的方法.散 ...
- 图片识别——均值哈希算法
均值哈希算法(Average hash algorithm,AHA)第一次是从著名的阮一峰阮老师的博文<相似图片搜索的原理>看到的.而此篇文章与阮老师也很类似Looks Like It - ...
- 相似图片搜索的三种算法
相似图片搜索的三种算法 想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下: 一.平 ...
- 感知哈希算法原理与实现
今天忽然想做一个图像识别的APP,但是在两张图片相似度的问题上产生了问题,感知哈希算法并不能解决这个问题,只是我在试着解决问题的过程中学到的一点知识. 这里的关键技术叫做"感知哈希算法&qu ...
最新文章
- Pycharm那些隐藏的实用小技巧,yyds!
- HDU 1052 Tian Ji -- The Horse Racing
- 一文了解5G是什么,将如何影响我们的未来
- ​linux 系统出现Give root password for maintenance 问题
- 使用Nomad构建弹性基础架构: 作业生命周期
- Google 2020游戏开发者峰会回顾、比尔•盖茨的夏日书单、Libaom 2.0.0发布等|Decode the Week...
- sql 子查询(mysql)
- IAR平台移植TI OSAL到STC8A8K64S4A12单片机中
- spring boot 启动后执行初始化方法
- 以太坊ETH不能转账,状态一直是pending状态原因和解决方法
- git 查看某些文档的历史版本_10分钟了解git
- 在Python数据库连接池中如何创建请求连接的方案
- 解决Tensorflow使用CPU报错
- project安装包_Microsoft project 2019软件功能介绍(附安装包)
- Java modifier
- 编译原理三大圣书——龙书、虎书、鲸书
- Qt制作简单标签云(上)
- MagicBook荣耀锐龙版笔记本BLOS开启VT
- PTA - 数据库合集54
- 手动制作linux live,使用Etcher轻松制作Linux Live Disks | MOS86
热门文章
- 如何在Mac电脑上打开终端
- android停止补间动画,android 帧动画,补间动画,属性动画的简单总结
- 创业成功第一步:写好商业计划书 第二章习题答案
- 2022-06-10:薯队长从北向南穿过一片红薯地(南北长M,东西宽N),红薯地被划分为1x1的方格, 他可以从北边的任何一个格子出发,到达南边的任何一个格子, 但每一步只能走到东南、正南、西南方向的
- 上号神器扫码登录网站使用教程
- 如何将多张图片合成一个pdf?
- MES系统在注塑行业中的应用
- 云原生爱好者周刊:KubeSphere 3.3.0 Alpha 版发布
- IPS(入侵防御系统)技术
- 单维度量表验证性因子分析_验证性因素分析介绍