比较两幅图像的相似度

现在以图搜图的功能比较火热,很好奇其原理。

简单的搜索学习得知,实现相似图片搜索的关键技术是“感知哈希算法”,作用是对每一张图片按照某种规律生成一个对应的指纹字符串。比较不同图片之间的指纹字符串,结果越接近,图片越相似。

现将问题简化为研究两幅图像的相似度,算法可能其他博客都有介绍了,现给出实现代码(简易版)。简易版指纹字符串的算法思想如下:

1.输入图像

2.灰度化

3.将图像大小归一化到8*8尺寸

4.简化灰度以减少计算量,例如所有的灰度除以5

5.计算平均灰度值avg

6.比较8*8=64个像素与平均灰度值avg的大小,若大则记为1,小则记为0,按一定顺序排列成64位2进制的指纹编码。

7.比较两幅图像的指纹编码,计算相似度。

测试样例:(依次为example1,example2,example3,example4)


测试结果

example1-example2 : 64.0625%,not similar.

example1-example3 : 71.875%,a little similar.

example1-example4 : 95.3125%,extremely similar.


代码如下,只有一个文件哦(main.cpp):

#include <opencv2/opencv.hpp>

using namespace std;
string ImageHashValue(IplImage* src);  //计算图片的指纹信息
double ImageSimilarity(string &str1,string &str2);  //根据指纹信息计算两幅图像的相似度

int main()
{
IplImage* image1 = cvLoadImage("example1.jpg",1);
IplImage* image2 = cvLoadImage("example3.jpg",1);
cvShowImage("image1",image1);
cvShowImage("image2",image2);
string imgPrint1 = ImageHashValue(image1);
string imgPrint2 = ImageHashValue(image2);
double similarity = ImageSimilarity(imgPrint1,imgPrint2);
cout<<"The similarity of two images is "<<similarity*100<<"%"<<endl;
if(similarity>=0.9)
cout<<"The two images are extremely similar."<<endl;
else if(similarity>=0.8&&similarity<0.9)
cout<<"The two images are pretty similar."<<endl;
else if(similarity>=0.7&&similarity<0.8)
cout<<"The two images are a little similar."<<endl;
else if(similarity<0.7)
cout<<"The two image are not similar."<<endl;
cout<<endl;
cvWaitKey(0);
}

//计算图片的指纹信息
string ImageHashValue(IplImage* src)
{
string resStr(64,'\0');
IplImage* image =  cvCreateImage(cvGetSize(src),src->depth,1);
//step one : 灰度化
if(src->nChannels == 3)  cvCvtColor(src,image,CV_BGR2GRAY);
else  cvCopy(src,image);
//step two : 缩小尺寸 8*8
IplImage* temp = cvCreateImage(cvSize(8,8),image->depth,1);
cvResize(image,temp);
//step three : 简化色彩
uchar* pData;
for(int i=0; i<temp->height; i++)
{
pData =(uchar* )(temp->imageData+i*temp->widthStep);
for(int j=0; j<temp->width;j++)
pData[j]= pData[j]/4;
}
//step four : 计算平均灰度值
int average = cvAvg(temp).val[0];
//step five : 计算哈希值
int index = 0;
for(int i=0; i<temp->height; i++)
{
pData =(uchar* )(temp->imageData+i*temp->widthStep);
for(int j=0; j<temp->width;j++)
{
if(pData[j]>=average)
resStr[index++]='1';
else 
resStr[index++]='0';
}
}
return resStr;
}

//根据指纹信息计算两幅图像的相似度
double ImageSimilarity(string &str1,string &str2)
{
double similarity = 1.0;
for(int i=0;i<64;i++)
{
char c1 = str1[i];
char c2 = str2[i];
if(c1!=c2)
similarity = similarity -1.0/64;
}
return similarity;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/55943.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

比较两个模拟信号的相似度

转载自微信公众号 原创 逸珺 嵌入式客栈 #include <stdio.h> #include <math.h>/* 返回值在区间&#xff1a; [-1,1] */ /* 如返回-10&#xff0c;则证明输入参数无效 */ #define delta 0.0001f double calculate_corss_correlation(double *s1, doub…

图像相似度对比分析软件,图像相似度算法有哪些

有没有一款软件能比对两张照片是否一样? 可以用AI软件来对比。AI人脸比对已经变成非常常用的AI场景之一。步骤如下&#xff1a;1、浏览器输入网址百度AI应用&#xff0c;AI人脸比对。2、进入人脸比对的功能演示模块。 3、点击左侧的‘本地上传’按钮&#xff0c;上传本地照片…

图像相似度对比分析软件,图像相似度计算方法

怎么对比两张图片的相似度 1、首先打开微信&#xff0c;选择底部“发现”。如图所示。2、然后在点击进入“小程序”。如图所示。3、然后输入“腾讯AI体验中心”搜索&#xff0c;点击进入。4、选择“人脸对比”。如图所示。 5、上传两张图片上去&#xff0c;点击“人脸比对”。…

使用Faiss进行海量特征的相似度匹配

点击上方“机器学习与生成对抗网络”&#xff0c;关注"星标" 获取有趣、好玩的前沿干货&#xff01; 作者丨Gemfield知乎 编辑 | 极市平台 来源丨https://zhuanlan.zhihu.com/p/210736523 导读 Faiss为稠密向量提供高效相似度搜索和聚类&#xff0c;支持十亿级别向量…

分析图片相似度的软件,图片相似度比对算法

计算图像相似度的算法有哪些 SIMStructuralSIMilarity&#xff08;结构相似性&#xff09;&#xff0c;这是一种用来评测图像质量的一种方法。 由于人类视觉很容易从图像中抽取出结构信息,因此计算两幅图像结构信息的相似性就可以用来作为一种检测图像质量的好坏.首先结构信息…

比较两幅图像的相似度的各种相似度量结果对比

对于人眼来说&#xff0c;很容易看出两个给定图像的质量有多相似。例如下图将各种空间噪声添加到图片中&#xff0c;我们很容易将它们与原始图像进行比较&#xff0c;并指出其中的扰动和不规则性。但是在机器学习中我们需要数学表达式来量化这种差异。 在本文中&#xff0c;我们…

语音相似度评价

语音相似度评价是用于测量语音之间的相似程度&#xff0c;常使用的算法是动态时间规整&#xff08;Dynamic time warping&#xff0c;DTW&#xff09;&#xff0c;其原理是通过对齐时间序列来评估它们之间相似性。DTW是一种基于对齐的度量&#xff08;alignment-based metric&a…

图像相似度对比分析软件,图像相似度对比分析法

有什么可以对比两张图片得出相似度的软件。 谷歌人工智能写作项目&#xff1a;神经网络伪原创 图像怎么进行比对 有什么软件可以把两张照片进行对比 查看相似度 1、Mix滤镜大师。IX滤镜大师免费提供将近200款默认滤镜&#xff0c;包括景深滤镜&#xff0c;散景滤镜&#xff…

如何写好工作日报,周报,月报?

管理大师德鲁克曾经在《21世纪的管理挑战》中说过&#xff0c;“21世纪&#xff0c;‘管理’需要提供的最重要的贡献&#xff0c;就是提高知识工作和知识工作者的生产率。” 而这也是公司推行周报日报制度最核心的诉求&#xff0c;对于知识工作者生产率的管理&#xff0c;用白…

测试部门工作周报模板

转载于:https://blog.51cto.com/zdytesting/2148921

日报周报月报工作总结生成器「智能文案生成器」

在职场上&#xff0c;尤其是互联网公司里&#xff0c;“写周报”是一件麻烦的事情。理想的工作环境下&#xff0c;写周报能让工作内容透明化&#xff0c;并有助于总结工作经验和办事方法。但现实情况往往没那么理想。有些公司学习“先进经验”&#xff0c;突然增加周报制度&…

日报周报月报工作总结生成器【智能文案生成器】

日报周报月报工作总结生成器【智能文案生成器】 天天写日报&#xff0c;我真的快奔溃了&#xff01; 摸了一天鱼&#xff0c;下班还要写日报&#xff1b; 划了一周的水&#xff0c;周末还要写周报&#xff1b; 啊啊啊啊… 在职场上&#xff0c;尤其是互联网公司里&#xff0c…

【工作周报】

内容&#xff1a; 了解CV领域常用评价标准BLEU、CIDEr、METEOR、ROUGE对HMN项目中涉及评分的代码进行分析将测试视频的predictions和groundtruth作为输入计算分数保存结果到excel文件中 时间&#xff1a; 12.14 ~ 12.20 笔记&#xff1a; 了解CV领域常用评价标准BLEU、CIDEr…

日报周报自动生成工具,一句简要描述,自动写出一篇工作日志总结

有了这个工具&#xff0c;再也不用担心每日每周每月的工作日志了&#xff0c;你只需要输入一段简要描述&#xff0c;就可以快速生成完整的工作日志内容&#xff0c;下面我们一起看看效果吧 微信小程序搜索【静静工具箱】免费使用 此工具打开也不需要太多复杂的操作&#xff0…

IT人员的周报应该怎么写

周报对于职场人员一定不陌生&#xff0c;周报既是对自己工作的总结&#xff0c;找到自己工作的问题&#xff0c;也是让老板知道你干了什么&#xff0c;是自己和老板之间进行沟通的桥梁。因为工种的不同&#xff0c;周报的样式也各不相同&#xff0c;作为IT人员&#xff0c;最看…

《花雕学AI》28:革命性的 ChatGPT for SEO——让您的排名飙升 50%!

引言&#xff1a; 如果您想写篇有吸引力的文章&#xff0c;或者您是一个博客和网站的拥有者&#xff0c;那么您一定知道 SEO&#xff08;搜索引擎优化&#xff09;的重要性。SEO 可以帮助您提高相应的流量、转化率和收入&#xff0c;但是 SEO 也是一个复杂和耗时的过程&#x…

chatgpt赋能python:Python文字输入的介绍

Python 文字输入的介绍 Python 是一种高级编程语言&#xff0c;具有易学易用、开发效率高等优点。在 Python 中&#xff0c;文字输入是一种非常重要的功能&#xff0c;可以用于很多场景&#xff0c;比如输入用户信息、采集网络数据等。本文将着重介绍 Python 中的文字输入功能…

chatgpt赋能python:如何在Python中输入汉字

如何在Python中输入汉字 在Python中输入汉字可能是许多开发者面临的问题。本文将介绍如何在Python中输入汉字&#xff0c;并提供一些使用Python进行中文处理的技巧。 输入汉字的方法 在Python中输入汉字的方法有许多种。下面我们将介绍其中三种方法。 方法一&#xff1a;使…

Android版ChatGPT正式上线;苹果遭千名开发者索赔10亿美元;阿里加码AR,八天连投两家公司 |极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

超简单的五种微博引流方式,教你如何引爆微博流量。

相信很多人对于微博都不陌生&#xff0c;从09年发布至今&#xff0c;已经获取了6亿巨大流量。人们在上面了解实时新闻&#xff0c;了解明星动态等等。但对于微博引流不知道用什么方式&#xff0c;这都很正常的。对于这种内容社区类的平台&#xff0c;需要很强大的运营能力才能保…