软件链来查找重复的图像
我正在努力实现的
我正在寻找一个软件链来查找重复的图像。 首先,我是如何定义一个重复图像的:这里有一个原始图像,直接来自相机,以及该图像的修改版本。 修改图像可以是以下操作中的任何一个或其组合:
一个真实世界的例子:
原始图像
亮度+亮度变化+调整大小
裁剪
框架+文字
匹配一对以上的任何图像应该会导致重复。 正如你所看到的,修改并不是为了破坏性的,而是为了改善。 例如,图像的主要主题(这里是闹钟)永远不会在其中间被裁剪。
修改可以被链接(新的修改可以基于先前的修改而不是基于原始图像),导致图像被压缩很多次。
然后,摄影师可以拍摄另一张照片:
观点和主题已经改变(现在是0:02!)=>与上面的任何图片相比,这个新图片不应该被视为重复。
我到目前为止做的是什么
#1:摆脱框架
首先,我使用OpenCV的Canny Detector + Hough算法在图像上查找垂直和水平线条。 然后,我根据算法找到的线裁剪图片。
问题我一直面对这种解决方案:当原始图片的背景中存在水平或垂直线条时,很难区分哪些线条来自框架,哪些线条来自图片=>手动评论。
为了避免太多的误报,我还设置了更高的thresold:不幸的是,一些精细的框架(例如带有渐变)会通过。
有没有更好的算法来检测这些帧?
#2:找到重复
到目前为止,我一直在使用pHash和它的DCT图像哈希。 它计算视觉散列,并提供一种在大型数据库中搜索相似图像的非常有效的方法。
优点 :
缺点:
所有重复的pHash查找最终都在人工审查中。 除非输入数据是同一主题的数千幅图像,否则这不是问题。 重复检查的次数然后以二次方式增长,这不是很方便。
关于如何改进重复检测的想法
我一直在挖掘如何减少pHash的误报数量。 我的第一个想法是将OpenCV的模板匹配添加到我现有的软件链中。 问题:它不适用于旋转的图像。
然后,我了解了特征检测,并且我认为这可能是要走的路。 但是,这是一个非常广阔的领域,这是我需要帮助的地方。
我在本PDF的第81页发现了一个有趣的特征探测器比较。 如果我理解正确,我需要“旋转不变”,“尺度不变”,而不是“仿射不变”(这似乎是视点中的变化)。 这将给我以下选择:
这些算法能够满足我的需求吗? 我应该将它们整合到现有的连锁店中,还是应该从新的连锁店开始? 特征检测重复匹配似乎还有很长的路要走,最好的方法是什么?
你应该采取本地特征匹配方法(SURF / ORB / BRISK ...)你可以在这里找到一个很好的教程:http://docs.opencv.org/doc/tutorials/features2d/feature_flann_matcher/feature_flann_matcher.html如果效率是非常重要的是,你可以用自定义的find-rigid-transform代码代替OpenCV的findHomography
,但如果它不是一个大问题, findHomography
可能会很好地为你服务。