我正在寻找一个软件链来查找重复的图像。 首先,这是我如何定义重复图像: 有一张原始图像,直接来自相机,以及该图像的修改版本。修改图像可以是以下操作中的任何一个或组合:
一个真实世界的例子:
原始图片
亮度+亮度变化+调整大小
种植
框架+文字
匹配上面任意一对图像应该会找到重复的图像。 正如您所看到的,修改并非旨在具有破坏性,而是具有改进性。例如,图像的主要主体(这里是闹钟)永远不会在其中间被裁剪。
可以链接修改(新修改可以基于先前的修改而不是原始图像),导致图像被压缩很多次。
然后,摄影师可以拍摄另一张照片:
观点和主要主题已经改变(现在是0:02!)=>与上述任何图像相比,此新图像不应视为重复图像。
首先,我使用OpenCV的Canny Detector + Hough算法在图像上找到垂直和水平线。然后,我根据算法找到的线条裁剪图片。
问题我一直面对这个解决方案:当原始图片的背景中有水平或垂直线时,很难区分哪些线与帧,哪一条来自图片=>人工审查。
我还设置了一个更高的thresold以避免得到太多的误报:不幸的是,一些精心设计的框架(例如,有一个渐变)经过。
是否有更好的算法来检测这些帧?
到目前为止,我一直在使用pHash and its DCT image hash。它计算可视化哈希值,并提供了一种在大型数据库中搜索类似图像的非常有效的方法。
优点:
缺点:
所有重复的pHash发现也会在人工审核中结束。这不是问题,除非输入数据是同一主题的数千张图像。然后要检查的重复数量呈二次方增长,这不太方便。
我一直在研究如何减少pHash中的假阳性数量。我的第一个想法是将OpenCV的模板匹配添加到我现有的软件链中。问题:它不适用于旋转图像。
然后,我学习了特征检测,我认为这可能是要走的路。然而,这是一个非常广阔的领域,这是我需要帮助的地方。
我在page 81 of this PDF找到了一个有趣的特征检测器比较。 如果我做对了,我需要“旋转不变”,“缩放不变”而不是“仿射不变”(这似乎是视点的变化)。 这将给我以下选项:
这些算法会满足我的需求吗?我应该将它们整合到我现有的链中还是应该重新开始一个新链?重复匹配的特征检测似乎还有很长的路要走,最好的方法是什么?
答案 0 :(得分:1)
你应该采用本地特征匹配方法(SURF / ORB / BRISK ......)
你可以在这里找到一个很好的教程:http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html
如果效率非常重要,您可以使用自定义查找 - 刚性 - 转换代码替换OpenCV的findHomography
,但如果它不是一个大问题,findHomography
可能会很好地为您服务。