当前位置: 首页 > 编程日记 > 正文

图像相似度计算之哈希值方法OpenCV实现

感知哈希算法(perceptual hash algorithm),它的作用是对每张图像生成一个“指纹”(fingerprint)字符串,然后比较不同图像的指纹。结果越接近,就说明图像越相似。

实现步骤:

1.      缩小尺寸:将图像缩小到8*8的尺寸,总共64个像素。这一步的作用是去除图像的细节,只保留结构/明暗等基本信息,摒弃不同尺寸/比例带来的图像差异;

2.      简化色彩:将缩小后的图像,转为64级灰度,即所有像素点总共只有64种颜色;

3.      计算平均值:计算所有64个像素的灰度平均值;

4.      比较像素的灰度:将每个像素的灰度,与平均值进行比较,大于或等于平均值记为1,小于平均值记为0;

5.      计算哈希值:将上一步的比较结果,组合在一起,就构成了一个64位的整数,这就是这张图像的指纹。组合的次序并不重要,只要保证所有图像都采用同样次序就行了;

6.      得到指纹以后,就可以对比不同的图像,看看64位中有多少位是不一样的。在理论上,这等同于”汉明距离”(Hamming distance,在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数)。如果不相同的数据位数不超过5,就说明两张图像很相似;如果大于10,就说明这是两张不同的图像。

以上内容摘自:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html


下面是用OpenCV实现的测试代码:

	string strSrcImageName = "src.jpg";cv::Mat matSrc, matSrc1, matSrc2;matSrc = cv::imread(strSrcImageName, CV_LOAD_IMAGE_COLOR);CV_Assert(matSrc.channels() == 3);cv::resize(matSrc, matSrc1, cv::Size(357, 419), 0, 0, cv::INTER_NEAREST);//cv::flip(matSrc1, matSrc1, 1);cv::resize(matSrc, matSrc2, cv::Size(2177, 3233), 0, 0, cv::INTER_LANCZOS4);cv::Mat matDst1, matDst2;cv::resize(matSrc1, matDst1, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);cv::resize(matSrc2, matDst2, cv::Size(8, 8), 0, 0, cv::INTER_CUBIC);cv::cvtColor(matDst1, matDst1, CV_BGR2GRAY);cv::cvtColor(matDst2, matDst2, CV_BGR2GRAY);int iAvg1 = 0, iAvg2 = 0;int arr1[64], arr2[64];for (int i = 0; i < 8; i++) {uchar* data1 = matDst1.ptr<uchar>(i);uchar* data2 = matDst2.ptr<uchar>(i);int tmp = i * 8;for (int j = 0; j < 8; j++) {int tmp1 = tmp + j;arr1[tmp1] = data1[j] / 4 * 4;arr2[tmp1] = data2[j] / 4 * 4;iAvg1 += arr1[tmp1];iAvg2 += arr2[tmp1];}}iAvg1 /= 64;iAvg2 /= 64;for (int i = 0; i < 64; i++) {arr1[i] = (arr1[i] >= iAvg1) ? 1 : 0;arr2[i] = (arr2[i] >= iAvg2) ? 1 : 0;}int iDiffNum = 0;for (int i = 0; i < 64; i++)if (arr1[i] != arr2[i])++iDiffNum;cout<<"iDiffNum = "<<iDiffNum<<endl;if (iDiffNum <= 5)cout<<"two images are very similar!"<<endl;else if (iDiffNum > 10)cout<<"they are two different images!"<<endl;elsecout<<"two image are somewhat similar!"<<endl;


相关文章:

七夕大礼包:26个AI学习资源送给你!

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;免费的在线学习课程一直是大多数人学习 AI 知识和技能的方式之一。今天&#xff0c;基于 Github 上一位小姐姐 Chip Huyen 分享的 10 门机器学习课程&#xff0c;AI科技大本营将这份收藏大礼包进…

HTML Inspector – 帮助你编写高质量的 HTML 代码

HTML Inspector 是一款代码质量检测工具&#xff0c;帮助你编写更优秀的 HTML 代码。HTML Inspector 使用 JavaScript 编写&#xff0c;运行在浏览器中&#xff0c;是最好的 HTML 代码检测工具。 您可能感兴趣的相关文章Metronic – 赞&#xff01;Bootstrap 响应式后台管理模板…

Git简介以及与SVN的区别

Git是由著名Linux内核(Kernel)开发者Linus Torvalds为了便利维护Linux而开发的。 Git是一个分布式的版本控制系统。作为一个分布式的版本控制系统&#xff0c;在Git中并不存在主库这样的概念&#xff0c;每一份复制出的库都可以独立使用&#xff0c;任何两个库之间的不一致之处…

java集合中某一个元素出现的次数

int count Collections.frequency(list, key); java的内置方法转载于:https://www.cnblogs.com/wysAC666/p/10252676.html

加密解密-DES算法和RSA算法

昨天忽然对加密解密有了兴趣&#xff0c;今天上班查找了一些资料&#xff0c;现在就整理一下吧&#xff1a;&#xff09; 一.DES算法 这种算法如图所示&#xff0c;这里将描述它的每一个步骤。这个算法进行了16次迭代&#xff08;圈&#xff09;&#xff0c;把各块明文交织起来…

开始Dojo之路

开始Dojo之路waiting……转载于:https://blog.51cto.com/frabbit2013/1242108

图像相似度计算之直方图方法OpenCV实现

操作步骤&#xff1a; 1. 载入图像(灰度图或者彩色图)&#xff0c;并使其大小一致&#xff1b; 2. 若为彩色图&#xff0c;增进行颜色空间变换&#xff0c;从RGB转换到HSV&#xff0c;若为灰度图则无需变换&#xff1b; 3. 若为灰度图&#xff0c;直接计算其直方…

黄皓之后,计算机科学上帝Don Knuth仅用一页纸证明布尔函数敏感度猜想

作者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;近日&#xff0c;美国艾默里大学计算机与数学科学系教授黄皓&#xff08;Hao Huang&#xff09;用一篇短短 6 页的论文证明了布尔函数&#xff0c;引发了计算机和数学领域社…

数位DP 不断学习中。。。。

1&#xff0c; HDU 2089 不要62 :http://acm.hdu.edu.cn/showproblem.php?pid2089 题意&#xff1a;不能出现4&#xff0c;或者相邻的62&#xff0c; dp[i][0],表示不存在不吉利数字 dp[i][1],表示不存在不吉利数字&#xff0c;且最高位为2 dp[i][2],表示存在不吉利数字 #i…

linux 性能 管理 与 优化

一、影响Linux服务器性能的因素操作系统级&#xff1a;CPU、内存、磁盘I/O带宽、网络I/O带宽程序应用级二、系统性能评估影响性能因素 评判标准 好 坏 糟糕 CPU user% sys%< 70% user% sys% 85% user% sys% >90% 内存 Swap In&#xff08;si&…

对称加密算法之DES介绍

DES(Data Encryption Standard)是分组对称密码算法。DES采用了64位的分组长度和56位的密钥长度&#xff0c;它将64位的输入经过一系列变换得到64位的输出。解密则使用了相同的步骤和相同的密钥。DES的密钥长度为64位&#xff0c;由于第n*8(n1,2,…8)是校验位&#xff0c;因此实…

200行代码解读TDEngine背后的定时器

作者 | beyondma来源 | CSDN博客导读&#xff1a;最近几周&#xff0c;本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响&#xff0c;原以为C语言已经是昨日黄花&#xff0c;不过从读者的留言来看&#xff0c;C语言还是老当益壮&…

fastJson结合Nutz.Mapl的进阶应用

为什么80%的码农都做不了架构师&#xff1f;>>> 今天要做一堆数据的序列化, 反序列化, 序列化没问题, 反序列化却遇到了点小意外, 这一堆数据不是一个类!!!!!!当然可以通过类内部的一个类型对象来判断, 但是fastJson并没有这个功能, 只能自己一个一个的遍历一个一个…

OpenCV实现遍历文件夹下所有文件

OpenCV中有实现遍历文件夹下所有文件的类Directory&#xff0c;它里面包括3个成员函数&#xff1a;(1)、GetListFiles&#xff1a;遍历指定文件夹下的所有文件&#xff0c;不包括指定文件夹内的文件夹&#xff1b;(2)、GetListFolders&#xff1a;遍历指定文件夹下的所有文件夹…

阿里、京东、快手、华为......他们是如何构建一个个推荐系统“帝国”的?

推荐系统在人们的日常生活中随处可见&#xff0c;成为我们生命中不可或缺的一部分。作为当今应用最为广泛和成熟的 AI 技术之一&#xff0c;它是信息生产者、传播者与用户之间的桥梁&#xff0c;可以让信息最精准、最高效地到达需求不一的用户面前。每天打开手机或电脑端的大部…

前端基础_ES6

声明 三大关键字声明变量&#xff1a;var &#xff08;ES5语法&#xff09; let &#xff08;ES6语法&#xff09;声明常量&#xff1a;const (ES6语法) var 声明变量特性1、支持 函数作用域2、支持 JS预解析 &#xff08;所谓变量提升&#xff09;3、支持 重复声明 &#xff…

5大典型模型测试单机训练速度超对标框架,飞桨如何做到?

导读&#xff1a;飞桨&#xff08;PaddlePaddle&#xff09;致力于让深度学习技术的创新与应用更简单。在单机训练速度方面&#xff0c;通过高并行、低开销的异步执行策略和高效率的核心算子&#xff0c;优化静态图训练性能&#xff0c;在Paddle Fluid v1.5.0的基准测试中&…

windowsXP用户被禁用导致不能网站登录

1、查看系统事件&#xff0c;发现弹出如下的错误 2、根据上面的错误&#xff0c;我们很容易就可以判断是禁用了账户引起的 2.1后面进入计算机管理&#xff0c;再进入用户管理 2.2双击点开Internet来宾用于&#xff0c;发现此用户已经停用了。 2.3双击点开与IIS访问有关用户&…

从头到尾使用Geth的说明-3-geth参数说明和环境配置

1.参数说明 ETHEREUM选项:--config value TOML 配置文件--datadir "/home/user4/.ethereum" 数据库和keystore密钥的数据目录--keystore keystore存放目录(默认在datadir内)--nousb …

OpenSSL中对称加密算法DES常用函数使用举例

主要包括3个文件&#xff1a; 1. cryptotest.h:#ifndef _CRYPTOTEST_H_ #define _CRYPTOTEST_H_#include <string>using namespace std;typedef enum {GENERAL 0,ECB,CBC,CFB,OFB,TRIPLE_ECB,TRIPLE_CBC }CRYPTO_MODE;string DES_Encrypt(const string cleartext, const…

从原理到落地,七大维度读懂协同过滤推荐算法

作者丨gongyouliu来源 | 大数据与人工智能导语&#xff1a;本文会从协同过滤思想简介、协同过滤算法原理介绍、离线协同过滤算法的工程实现、近实时协同过滤算法的工程实现、协同过滤算法应用场景、协同过滤算法的优缺点、协同过滤算法落地需要关注的几个问题等7个方面来讲述。…

sql查询语句优化需要注意的几点

为了获得稳定的执行性能&#xff0c;SQL语句越简单越好。对复杂的SQL语句&#xff0c;要设法对之进行简化。 常见的简化规则如下&#xff1a; 1&#xff09;不要有超过5个以上的表连接&#xff08;JOIN&#xff09; 2&#xff09;考虑使用临时表或表变量存放中间结果。 3&#…

决策树算法原理(ID3,C4.5)

决策树算法原理(CART分类树) CART回归树 决策树的剪枝 决策树可以作为分类算法&#xff0c;也可以作为回归算法&#xff0c;同时特别适合集成学习比如随机森林。 1. 决策树ID3算法的信息论基础 1970年昆兰找到了用信息论中的熵来度量决策树的决策选择过程&#xff0c;昆兰把这…

对称加密算法之RC4介绍及OpenSSL中RC4常用函数使用举例

RC4是一种对称密码算法&#xff0c;它属于对称密码算法中的序列密码(streamcipher,也称为流密码)&#xff0c;它是可变密钥长度&#xff0c;面向字节操作的流密码。 RC4是流密码streamcipher中的一种&#xff0c;为序列密码。RC4加密算法是Ron Rivest在1987年设计出的密钥长度…

SpringMVC中实现的token,防表单重复提交

一&#xff1a;首先创建一个token处理类 &#xff0c;这里的类名叫 TokenHandlerprivate static Logger logger Logger.getLogger(TokenHandler.class);static Map<String, String> springmvc_token new HashMap<String, String>();//生成一个唯一值的tokenSupp…

利用CxImage实现编解码Gif图像代码举例

Gif(Graphics Interchange Format&#xff0c;图形交换格式)是由CompuServe公司在1987年开发的图像文件格式&#xff0c;分为87a和89a两种版本。Gif是基于LZW算法的无损压缩算法。Gif图像是基于颜色表的&#xff0c;最多只支持8位(256色)。Gif减少了图像调色板中的色彩数量&…

SpringBoot b2b2c 多用户商城系统 ssm b2b2c

来源&#xff1a; SpringBoot b2b2c 多用户商城系统 ssm b2b2c用java实施的电子商务平台太少了&#xff0c;使用spring cloud技术构建的b2b2c电子商务平台更少&#xff0c;大型企业分布式互联网电子商务平台&#xff0c;推出PC微信APP云服务的云商平台系统&#xff0c;其中包括…

AI“生死”落地:谁有资格入选AI Top 30+案例?

2019 年&#xff0c;人工智能应用落地的重要性正在逐步得到验证&#xff0c;这是关乎企业生死攸关的一环。科技巨头、AI 独角兽还有起于草莽的创业公司在各领域进行着一场多方角斗。进行平台布局的科技巨头们&#xff0c;正在加快承载企业部署 AI 应用的步伐&#xff0c;曾经无…

liunx 下su 和sudo 的区别

一. 使用 su 命令临时切换用户身份1、su 的适用条件和威力su命令就是切换用户的工具&#xff0c;怎么理解呢&#xff1f;比如我们以普通用户beinan登录的&#xff0c;但要添加用户任务&#xff0c;执行useradd &#xff0c;beinan用户没有这个权限&#xff0c;而这个权限恰恰由…

非对称加密算法之RSA介绍及OpenSSL中RSA常用函数使用举例

RSA算法&#xff0c;在1977年由Ron Rivest、Adi Shamirh和LenAdleman&#xff0c;在美国的麻省理工学院开发完成。这个算法的名字&#xff0c;来源于三位开发者的名字。RSA已经成为公钥数据加密标准。 RSA属于公开密钥密码体制。公开密钥体制就是产生两把密钥&#xff0c;一把…