【问题标题】:What algorithm could be used to identify if images are the "same" or similar, regardless of size?无论大小如何,都可以使用什么算法来识别图像是否“相同”或相似?
【发布时间】:2010-11-03 13:21:34
【问题描述】:

TinEye,“反向图片搜索引擎”,允许您上传/链接到图片,它能够搜索它已经抓取的十亿张图片,它会返回指向它找到的图片的链接相同的图像。

但是,它不是一个简单的校验和或任何与之相关的东西。它通常能够找到比您提供的原始图像更高分辨率和更低分辨率以及更大和更小的尺寸的图像。这是该服务的一个很好的用途,因为我经常找到一张图像并想要它的最高分辨率版本。

不仅如此,我还让它找到了相同图像集的图像,其中图像中的人处于不同的位置,但背景基本保持不变。

TinEye 可以使用哪种类型的算法,使其能够将图像与不同大小和压缩比的其他图像进行比较,但仍能准确地确定它们是“相同”图像或集合?

【问题讨论】:

  • 有趣的链接...拼写警察:我相信这个网站实际上叫做“TinEye”,而不是“TinyEye”。 :)

标签: algorithm image-processing computer-vision


【解决方案1】:

FotoForensics 网站的创建者发布了这篇关于这个主题的博文,它对我非常有用,并展示了可能对你来说足够好的算法,并且比小波和特征提取需要更少的工作。

http://www.hackerfactor.com/blog/index.php?/archives/529-Kind-of-Like-That.html

aHash(也称为平均哈希或平均哈希)。这种方法将图像粉碎成灰度 8x8 图像,并将 64 位设置为 基于像素值是否大于 图像的平均颜色。

pHash(也称为“感知哈希”)。该算法类似于 aHash,但使用离散余弦变换 (DCT) 并基于比较 频率而不是颜色值。

dHash 与 aHash 和 pHash 一样,dHash 的实现非常简单,而且比它应有的准确度要高得多。作为一个 实现,dHash 几乎与 aHash 相同,但它执行 好多了。而 aHash 侧重于平均值,而 pHash 评估 频率模式,dHash 跟踪梯度。

【讨论】:

【解决方案2】:

如何将图片调整为标准的小尺寸并检查 SSIM 或仅亮度 PSNR 值?这就是我会做的。

【讨论】:

  • SSIM 可以更准确但不能在数据库中建立索引,除非你建立一个非常大的表来存储每对图像之间的每个 SSIM 值。
  • @JianWeihang 你仍然可以两全其美,方法是使用一种算法对图像进行非常粗略的指纹识别(比如仅以非常低的分辨率存储边缘检测位图),然后计算具有相同指纹(或“几乎相同”,这本身就是一个问题)的对的 SSIM。您甚至不需要针对每一对计算 SSIM,只需其中一个“相同”。但话又说回来,这真是个大问题,我很佩服 Google 和其他公司以如此大规模的方式使用它。
【解决方案3】:

这些算法通常是基于指纹的。指纹是一种相当小的数据结构,类似于长哈希码。然而,指纹函数的目标与哈希函数的目标相反。一个好的散列函数应该为非常相似(但不相等)的对象生成非常不同的代码。相反,指纹函数应该为相似的图像生成相同的指纹。

举个例子,这是一个(不是特别好的)指纹功能:将图片大小调整为 32x32 正方形,对颜色进行归一化和量化,将颜色数量减少到 256 种。然后,你有 1024 - 图像的字节指纹。只需保留一张指纹表 => [图像 URL 列表]。当您需要查看与给定图像相似的图像时,只需计算其指纹值并找到相应的图像列表即可。很简单。

什么不容易——要在实践中有用,指纹函数需要对裁剪、仿射变换、对比度变化等具有鲁棒性。构建良好的指纹函数是一个单独的研究课题。它们通常是手动调整的并使用大量启发式方法(即使用有关典型照片内容、图像格式/EXIF 中的附加数据等方面的知识)

另一种变化是使用多个指纹功能,尝试应用它们中的每一个并组合结果。实际上,它类似于查找相似的文本。图像相似性搜索不是使用“词袋”,而是使用“指纹袋”并查找一个袋子中的多少元素与另一个袋子中的元素相同。如何让这个搜索高效是另一个话题。

现在,关于文章/论文。我找不到可以概述不同方法的好文章。我知道的大多数公开文章都讨论了对特定方法的特定改进。我可以建议检查这些:

"Content Fingerprinting Using Wavelets"。本文是关于使用小波进行音频指纹识别的,但同样的方法也适用于图像指纹识别。

PERMUTATION GROUPING: INTELLIGENT HASH FUNCTION DESIGN FOR AUDIO & IMAGE RETRIEVAL。有关位置敏感哈希的信息。

Bundling Features for Large Scale Partial-Duplicate Web Image Search。一篇非常好的文章,讨论了 SIFT 和捆绑功能以提高效率。最后还有一个不错的参考书目

【讨论】:

  • @Igor,很好的答案!除了您在帖子中提到的指纹算法之外,您是否可以提供任何有关指纹算法的链接或资源?
  • +1。你有没有参考相关论文?我找到了一些,但我不知道它们有多好。
  • @Simucal:我将通过一些文章链接更新我的答案。
  • @Vinko:其实你说的这本书看起来不错(但我没看过)。
【解决方案4】:

http://tineye.com/faq#how

基于此,Igor Krivokon's answer 似乎是对的。

【讨论】:

  • 为什么投反对票?问题是“TinEye 使用什么算法?”我刚刚提到 TinEye 常见问题解答支持 Igor 的回答。
【解决方案5】:

The Hough Transform 是一个非常古老的特征提取算法,你会觉得它很有趣。我怀疑 tinyeye 使用的是什么,但它是学习特征提取的一个很好、简单的起点。

还有来自多伦多大学的slides to a neat talkastrometry.net 谈论他们的工作。他们开发了一种算法,用于将夜空的伸缩图像与星表中的位置进行匹配,以识别图像中的特征。这是一个比 tinyeye 试图解决的更具体的问题,但我希望他们谈论的许多基本思想都适用于更普遍的问题。

【讨论】:

    【解决方案6】:

    查看this blog post(不是我的),对一个非常易于理解的算法进行非常易于理解的描述,该算法的简单性似乎得到了很好的结果。它基本上将各个图片划分为一个非常粗略的网格,按照红蓝绿蓝比例对网格进行排序,并检查排序是否相同。这自然只适用于彩色图像。

    专业人士最有可能使用更先进的算法获得更好的结果。正如该博客上的 cmets 所述,一种主要的方法似乎是小波。

    【讨论】:

    • 这是一篇有趣的博文,但我不会将所使用的算法作为关于该主题的建议。
    【解决方案7】:

    这可能是基于对特征提取算法的改进,利用了尺度不变的特征。

    看看

    或者,如果你真的很感兴趣,你可以花大约 70 美元(或者至少看看谷歌预览)

    【讨论】:

    • 是的,SIFT 虽然受到严格的专利保护,但请注意商业开发。
    【解决方案8】:

    他们很可能正在做一个傅里叶变换来表征图像的复杂性,以及一个直方图来表征色度分布,并与区域分类算法配对以确保相似的复杂和彩色图像不会被错误配对.不知道这是不是他们正在使用的东西,但似乎这样可以解决问题。

    【讨论】:

    • 傅里叶变换很可能没有用,因为自然图像(即照片)基本上具有相同的频率内容(即相同的幅度,相位不同)。其余的听起来很合理。
    猜你喜欢
    • 1970-01-01
    • 2015-11-21
    • 2019-05-12
    • 2015-11-15
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多