Fla*_*Moe 7 hash comparison image phash
我已经检查了像Phasher这样的方法来获得类似的图像.基本上将图像大小调整为8x8,灰度,获得平均像素并创建每个像素的二进制散列,比较它是高于还是低于平均像素.
这个方法在这里有很好的解释:http: //hackerfactor.com/blog/index.php?/archives/432-Looks-Like -It.html
工作示例: - 桌面上计算机的图像1 - 图像2,相同,但带有硬币

这可行,因为,使用非常简化的灰度图像的散列,它们将几乎相同,甚至相同.所以你可以得出结论,当90%以上的像素相同时(在同一个地方!)
我的问题是从相同的角度拍摄但角度不同的图像,例如:

在这种情况下,生成的哈希"指纹"是相互移位的,我们无法一点一点地比较哈希,它会有很大的不同.
像素是"相似的",但它们不在同一个地方,因为在这种情况下有更多的天空,并且房屋"开始"比第一个更低.
因此,哈希比较导致"它们是不同的图像".
可能的方法:
我正在考虑为第一个图像创建一个更大的哈希,然后为第二个图像获得10个随机"子哈希",并尝试查看10个子哈希是否在第一个大哈希的"某个地方"(如果一个子串被包含在另一个更大的中).
这里的问题我认为是处理数千张图像时的CPU /时间,因为你必须将1张图像与1000张进行比较,并且在每张图像中,将10个子哈希与一个大的哈希进行比较.
其他方案?;-)
一种选择是为每个图像检测一组"有趣"点,并将其与哈希一起存储.它与您建议的解决方案有些相似.
我们希望这些点不会像你的那些在视角发生变化的图像之间变化.这些演讲幻灯片很好地概述了如何通过相当简单的线性代数找到像这样的点.我正在使用Mathematica,因为它内置了许多功能.ImageKeypoints在这里做我们想要的.
在得到我们有趣的观点之后,我们需要找出我们正在比较的图像之间的匹配.如果您的图像与示例中的图像非常相似,则可能只需为每个有趣的点拍摄8x8灰度图像,并将每个图像与另一个图像上的附近有趣点的图像进行比较.我想你可以使用你现有的算法.
如果您想使用像SIFT这样的更高级的算法,您需要查看ImageKeypoint的属性,如缩放和方向.
ImageKeypoints文档有这个例子,您可以使用它来获取每个有趣点的一小部分图像(它使用scale属性而不是固定大小):
MapThread[ImageTrim[img, {#1}, 2.5 #2] &, 
 Transpose@
  ImageKeypoints[img, {"Position", "Scale"}, 
   "KeypointStrength" -> .001]]
找到一定数量的匹配点可能足以说明图像是相似的,但如果没有,你可以使用像RANSAC这样的东西来找出你需要对齐哈希图像所需的变换(你已经能够生成的8x8图像) )足够你现有的算法工作.
我应该指出Mathematica有ImageCorrespondingPoints,它可以更好地完成所有这些工作(使用ImageKeypoints).但我不知道如何让它缓存中间结果,以便为你想要做的事情进行扩展.但是,您可能希望研究将匹配点约束为透视变换的能力.
下面是您的示例图像的匹配点图,以便您了解最终匹配的部分:

因此,您可以预先计算图像数据库的有趣点,以及每个点的灰度哈希值.您必须比较数据库中每个图像的几个哈希图像,而不仅仅是两个,但它会缩放到当前算法的常量因子内.