我需要一种简单快速的方法来比较两个图像的相似性.即如果它们包含完全相同的东西但是可能有一些稍微不同的背景并且可能被移动/调整大小几个像素,我想获得高值.
(更具体的是,如果重要的话:一张图片是一个图标,另一张图片是截图的子区域,我想知道该子区域是否恰好是图标.)
我手边有OpenCV,但我仍然不习惯它.
到目前为止我想到的一种可能性:将两张图片分成10x10个单元格,对于这100个单元格中的每一个,比较颜色直方图.然后我可以设置一些补偿阈值,如果我得到的值高于该阈值,我认为它们是相似的.
我还没有尝试过它的效果如何,但我想它会足够好.图像已经非常相似(在我的用例中),所以我可以使用相当高的阈值.
我想有很多其他可能的解决方案可以或多或少地工作(因为任务本身非常简单,因为我只想检测相似性,如果它们非常相似).你会建议什么?
关于从图像中获取签名/指纹/哈希,有一些非常相关/类似的问题:
另外,我偶然发现了这些具有获取指纹功能的实现:
关于感知图像哈希的一些讨论:这里
有点offtopic:有很多方法来创建音频指纹.MusicBrainz是一种为歌曲提供基于指纹的查找的网络服务,在他们的维基中有很好的概述.他们现在正在使用AcoustID.这是为了找到精确(或大部分精确)的匹配.要查找类似的匹配(或者如果您只有一些片段或高噪音),请查看Echoprint.一个相关的SO问题在这里.所以这似乎解决了音频问题.所有这些解决方案都非常有效.
通过它们彼此的相似性来对一组给定图像进行排序的快速方法是什么.
目前我有一个系统在两个图像之间进行直方图分析,但这是一个非常昂贵的操作,似乎太过分了.
最理想的是,我正在寻找一种能够为每个图像提供分数的算法(例如整数分数,例如RGB平均值),我可以按该分数进行排序.相同的分数或分数彼此相邻可能是重复的.
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
Run Code Online (Sandbox Code Playgroud)
每张图像的RGB平均值很糟糕,有类似的东西吗?
有没有开源数字视频指纹计划?
即:可以比较两个质量不同的视频文件,但表明它们属于同一事件,程序等的东西.
我有一个图像数据库.当我拍摄新照片时,我想将其与此数据库中的图像进行比较,并获得相似性得分(使用OpenCV).这样我想要检测,如果我有一个图像,这与新图片非常相似.
是否可以创建我的数据库图像的指纹/哈希并匹配新的数据库图像?
我正在搜索alogrithm代码段或技术演示,而不是商业解决方案.
最好,
斯特凡
我想从查询与数据库中的图片(约2000)进行比较.
在本网站发帖之前,我阅读了很多关于在大型数据库中匹配图片的方法的文章,并阅读了stackOverflow上的很多帖子.
关于论文,有一些有趣的东西,但技术性很强,很难理解算法.(我刚开始专注于这个领域)
帖子(最有趣的):
C++/SIFT/SQL - 如果有一种方法可以有效地比较图像的SIFT描述符和SQL数据库中的SIFT描述符?
论文:
具有大型词汇表和快速空间匹配的对象检索,
图像相似性搜索紧凑数据结构,
LSH,
近重复图像检测min-Hash和tf-idf加权
词汇树
聚合本地描述符
但我仍然困惑.
我做的第一件事就是实施BoW.我训练了Bag of Words(使用ORB作为探测器和描述符,并使用了VLAD功能)和5级,以测试其效率.经过长时间的培训,我推出了它.它运行良好,准确率为94%.那很不错.
但是我有一个问题:
首先,你同意我的意见吗?这显然是做我想做的最好的方法吗?也许还有另一种方法可以使用BoW来查找数据库中的相似之处?
我做的第二件事是"更简单".我计算查询的描述符.然后我在我的所有数据库上做了一个循环,我计算了每个图片的描述符,然后在向量中添加了每个描述符.
std::vector<cv::Mat> all_descriptors_database;
for (i ? 2000) :
cv::Mat request=cv::imread(img);
computeKeypoints(request) ;
computeDescriptors(request) ;
all_descriptors_database.pushback(descriptors_of_request)
Run Code Online (Sandbox Code Playgroud)
最后,我有一个大向量,其中包含所有数据库的所有描述符.(所有关键点都一样)
然后,这就是我感到困惑的地方.开始时,我想计算循环内部的匹配,也就是说,对于数据库中的每个图像,计算其描述符并与查询匹配.但是花了很多时间.
因此,在阅读了大量关于如何在大数据库中找到相似之处的论文后,我发现LSH算法似乎适合于那种搜索.
因此我想使用这种方法.所以在我的循环中我做了类似的事情:
//Create Flann LSH index
cv::flann::Index flannIndex(all_descriptors_database.at(i), cv::flann::LshIndexParams(12, 20, 2), cvflann::FLANN_DIST_HAMMING);
cv::Mat results, dists;
int k=2; // find the 2 nearest neighbors
// search (nearest neighbor)
flannIndex.knnSearch(query_descriptors, results, …
Run Code Online (Sandbox Code Playgroud) 我的目标是提供2个图像文件,并获得关于这2个文件是否可以相同(在可接受的确定程度内)的真/假响应.
我意识到这个问题属于人工智能,并且比它看起来要复杂得多,所以我非常怀疑自己能够(或者甚至想要)做到这一点.我正在寻找的可能是图书馆或班级.我正在使用PHP.
提前致谢..
所有有用的答案/评论都会被投票.
更新:
我想知道我是否过于复杂,也许像imageMagick(imagick)这样的更通用的库可以完成它吗?谁对imageMagick更有经验?
php artificial-intelligence image image-processing image-recognition
我想知道是否有一些用PHP编写的SURF库可用吗?从我到目前为止所做的少量发现来看,如果提供了一些链接到PHP内置的类似技术(如果提供的话)的话,冲浪库可能是C ++ / C#。我用谷歌搜索了一些内置功能,唯一足够接近的是Image Magick。但是从注释看来,模式匹配无法完成。
让我重新定义我的自我,我只是不想比较2张图像,可以说图像中有一个Google徽标,并且有一个Google Logo图像作为单独的图像,如果有一些图像我想搜索什么?复制了Google的徽标/图像。
image ×3
opencv ×3
php ×2
c++ ×1
cbir ×1
comparison ×1
fingerprint ×1
hash ×1
mysql ×1
open-source ×1
project ×1
sift ×1
sorting ×1
surf ×1