【问题标题】:How to know if an images is similar to another (slightly different angle but same point of view)如何知道图像是否与另一个图像相似(角度略有不同但视角相同)
【发布时间】:2021-03-09 23:01:59
【问题描述】:

我检查了诸如 Phasher 之类的方法来获取相似的图像。基本上是将图像大小调整为 8x8 灰度,获取平均像素并创建每个像素的二进制哈希,比较它是否高于或低于平均像素。

这个方法在这里解释得很好: http://hackerfactor.com/blog/index.php?/archives/432-Looks-Like-It.html

示例工作: - 桌子上电脑的图像 1 - 图 2,相同,但有一枚硬币

这会起作用,因为使用非常缩小的灰度图像的散列,它们两者几乎相同,甚至相同。因此,当 90% 以上的像素相同(在同一个地方!)时,您可以得出结论它们是相似的。

我的问题是从相同的角度但不同的角度拍摄的图像,例如这些:

在这种情况下,生成的哈希“指纹”相互偏移,我们无法逐位比较哈希,它会非常不同。

像素是“相似的”,但它们不在同一个地方,因为在这种情况下天空更多,房屋“开始”比第一个更下方。

所以哈希比较的结果是“它们是不同的图像”。

可能的解决方案:

我正在考虑为第一个图像创建一个更大的散列,然后为第二个图像获取 10 个随机“子散列”,并尝试查看这 10 个子散列是否位于第一个图像的“某个地方”大哈希(如果子字符串包含在另一个更大的字符串中)。

我认为这里的问题是处理数千张图像时的 CPU/时间,因为您必须将 1 张图像与 1000 张图像进行比较,并且在每张图像中,将 10 个子哈希与一个大哈希进行比较。

其他解决方案? ;-)

【问题讨论】:

  • 我知道已经 3 年了,但您有没有找到一个好的解决方案?

标签: image hash comparison phash


【解决方案1】:

一个选项是为每个图像检测一组“有趣”点,并将其存储在您的哈希值旁边。这与您建议的解决方案有些相似。

我们希望这些点不太可能在像您这样具有透视变化的图像之间发生变化。这些lecture slides 很好地概述了如何使用相当简单的线性代数找到类似的点。我使用 Mathematica 是因为它为很多此类东西内置了函数。 ImageKeypoints 在这里做我们想做的事。

在我们得到有趣的点之后,我们需要找出我们正在比较的图像之间的匹配点。如果您的图像非常相似,就像您的示例中的图像一样,您可能只需为每个有趣点拍摄一张 8x8 灰度图像,并将一张图像中的每张图像与另一张图像上附近有趣点的图像进行比较。我认为您可以使用现有的算法。

如果您想使用更高级的算法,例如 SIFT,您需要查看 ImageKeypoint 的属性,例如比例和方向。

ImageKeypoints 文档中有这个示例,您可以使用该示例为每个有趣的点获取一小块图像(它使用比例属性而不是固定大小):

MapThread[ImageTrim[img, {#1}, 2.5 #2] &, 
 Transpose@
  ImageKeypoints[img, {"Position", "Scale"}, 
   "KeypointStrength" -> .001]]

找到一定数量的匹配点可能足以说明图像相似,但如果不是,您可以使用 RANSAC 之类的东西来计算对齐哈希图像所需的转换(您的 8x8 图像)已经能够生成)足以让您现有的算法工作。

我应该指出,Mathematica 有 ImageCorrespondingPoints,它可以更好地完成所有这些工作(使用 ImageKeypoints)。但我不知道你如何让它缓存中间结果,以便根据你想要做的事情进行扩展。不过,您可能想研究其将匹配点限制为透视变换的能力。

以下是示例图像的匹配点图,可让您了解最终匹配的部分:

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

【讨论】:

    【解决方案2】:

    如果哈希值不匹配,您可以尝试一个上限,比较 8x8 网格中有多少像素匹配。也许你可以尝试匹配照片马赛克中的颜色:Photo Mosaic Algorithm. How to create a mosaic photo given the basic image and a list of tiles?.

    【讨论】:

    • Phpdna,这正是 Phaser 所做的……但问题不在于获取“指纹”。同样比较像素太随机了,两张天空太多的照片将具有与我在上面示例中描述的相同的“平均”像素
    • 我的意思是比较 8x8 像素。从示例中它看起来非常相似。定义一个上限或阈值并完成。
    猜你喜欢
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 2018-12-29
    • 1970-01-01
    • 2012-05-09
    相关资源
    最近更新 更多