我已经检查过像Phasher这样的方法来获得类似的图像。基本上将图像大小调整为8x8,灰度,获得平均像素,并创建每个像素的二进制哈希,比较它是高于还是低于平均像素。
这个方法在这里有很好的解释: http://hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html
工作示例: - 桌子上的计算机的图像1 - 图像2,相同,但带有硬币
这样可行,因为使用非常简化的灰度图像的散列,它们两者几乎相同,甚至相同。所以你可以得出结论,当90%以上的像素相同时(在同一个地方!)
我的问题在于从相同的角度拍摄但角度不同的图像,例如:
在这种情况下,生成的哈希“指纹”会相互移位,我们无法一点一点地比较哈希值,它会有很大差异。
像素是“相似的”,但它们不在同一个地方,因为在这种情况下,天空更多,房屋“开始”比第一个更低。
因此,哈希比较会导致“它们是不同的图像”。
可能的解决方案:
我正在考虑为第一个图像创建一个更大的哈希,然后为第二个图像获得10个随机的“子哈希”,并尝试查看10个子哈希是否在第一个的“某个地方”大哈希(如果子串包含在另一个更大的内)。
问题在这里我认为是使用数千张图像时的CPU /时间,因为你必须将1张图像与1000张进行比较,并且在每张图像中,将10个子哈希值与较大的子哈希值进行比较。
其他解决方案? ; - )
答案 0 :(得分:6)
一种选择是为每个图像检测一组“有趣”点,并将其与哈希一起存储。它与您建议的解决方案有些相似。
我们希望这些点不太可能在像您这样的视角发生变化的图像之间变化。这些lecture slides很好地概述了如何使用相当简单的线性代数找到像这样的点。我正在使用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)。但我不知道如何让它缓存中间结果,以便为你想要做的事情进行扩展。但是,您可能希望研究将匹配点约束为透视变换的能力。
这是一个示例图像匹配点的图表,可以让您了解哪些部分最终匹配:
因此,您可以预先计算图像数据库的有趣点,以及每个点的灰度哈希值。您必须比较数据库中每个图像的几个哈希图像,而不仅仅是两个,但它将扩展到当前算法的常量因子内。
答案 1 :(得分:0)
如果散列不匹配,则可以尝试上限,比较8x8网格中匹配的像素数。也许你可以尝试匹配照片马赛克中的颜色:Photo Mosaic Algorithm. How to create a mosaic photo given the basic image and a list of tiles?。