哪种算法是从一组图像中找到与“输入”图像相似的最佳算法?

3

我正在为游客开发一款安卓应用程序。我需要展示有关文化遗产建筑的信息。我必须将游客拍摄的照片与我的数据库进行比较,以检查是否与该建筑物相关联。由于游客拍摄的照片可能与我的数据库中的照片不完全相同,因此我正在寻找一种实时查找相似图像的算法。我已经阅读了诸如SURF、SIFT和pHash等算法,但仍然对使用哪种算法感到困惑。(图像比较将在服务器端而不是应用程序中进行。)


你的问题,在实时场景中,仍然是一个研究问题。我认为你应该读一下关于“词袋模型”的内容,这是一种常用的图像相似度测量方法(当然,谷歌在其图片搜索中也使用了它,还进行了许多改进)。 - vish4071
此外,如果您对应用功能非常认真的话,您将不得不使用AI(机器学习),通过用户评论来实现。 - vish4071
没有单一、简单的算法可以在图像不完全相同的情况下给出约60%的正确结果,亮度、梯度、角度、透视、距离、镜头、白天/夜晚光以及其他143个特征都存在,这些实际上是不可能处理的。 - vish4071
1个回答

1

使用图像哈希算法。

  • 对所有存储的图像进行哈希
  • 对传入的图像进行哈希
  • 将传入图像的哈希值与存储的哈希值进行比较。

对于简单的图像哈希:

  • 将图像调整为小的标准大小(如16x16),以便哈希不占用太多空间
  • 将图像转换为灰度
  • 如果像素值大于平均灰度值,则设置为1,否则设置为0

这里是一些哈希已经调整大小的图像的代码

function imageHash(pixels) {
  var result = [],
    sum = 0,
    size = pixels.length,
    gray, r, g, b, c, avg, i;
  for (i = 0; i < size; i++) {
    r = (pixels[i] >> 16) & 0xFF;
    g = (pixels[i] >> 8) & 0xFF;
    b = (pixels[i]) & 0xFF;
    gray = 0.2126 * r + 0.7152 * g + 0.0722 * b;
    sum += gray;
    result[i] = gray;
  }
  avg = sum / size;
  for (i = 0; i < size; i++) {
    result[i] = result[i] > avg ? 1 : 0;
  }
  return result;
}

它对于亮度不同的照片会产生相同的结果吗?感谢您提供的解决方案。 - US_Thakur
@US_Thakur - 由于哈希使用平均亮度作为二进制结果(1或0)的阈值,因此只要图像以均匀的方式变亮,它就应该起作用。在比较哈希时,您可以将匹配位数相加,并将其用作“相似程度”的分数。 - Louis Ricci

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接