【问题标题】:which is the best algorithm to to find a image which is similar to the "input" image from a set of images这是从一组图像中找到与“输入”图像相似的图像的最佳算法
【发布时间】:2015-12-11 23:37:55
【问题描述】:

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

【问题讨论】:

  • 您的问题,对于实时场景,仍然是一个研究问题。我认为您应该阅读有关bag of words 的信息,这是正在使用的图像相似性度量。 (当然,谷歌也在其图像搜索中使用它,还有很多即兴创作)。
  • 此外,您必须通过接受用户的评论来使用 AI(机器学习)(如果您对应用的功能很认真)。
  • 如果图像不完全相同,没有单一的、简单的算法甚至可以为您提供约 60% 的正确结果,情况并非如此。亮度、渐变、角度、透视、距离、镜头、日光/夜光等143个特性,其实是无法处理的。

标签: android algorithm image-processing


【解决方案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 - 因为哈希使用平均亮度作为二进制结果(1 或 0)的阈值,所以只要图像以不合理的方式变亮,它应该可以工作。在比较哈希时,您可以将匹配的位数相加,并将其用作两者“相似程度”的分数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2010-09-09
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
相关资源
最近更新 更多