这些算法通常是基于指纹的。指纹是一种相当小的数据结构,类似于长哈希码。然而,指纹函数的目标与哈希函数的目标相反。一个好的散列函数应该为非常相似(但不相等)的对象生成非常不同的代码。相反,指纹函数应该为相似的图像生成相同的指纹。
举个例子,这是一个(不是特别好的)指纹功能:将图片大小调整为 32x32 正方形,标准化和量化颜色,将颜色数量减少到 256 种。然后,你有 1024 字节的指纹为图像。只需保留一张指纹表 => [图像 URL 列表]。当您需要查看与给定图像相似的图像时,只需计算其指纹值并找到相应的图像列表即可。简单的。
不容易——要在实践中有用,指纹函数需要对裁剪、仿射变换、对比度变化等具有鲁棒性。构建良好的指纹函数是一个单独的研究课题。很多时候,它们是手动调整的并使用大量启发式方法(即使用有关典型照片内容、图像格式/EXIF 中的附加数据等的知识)
另一种变化是使用多个指纹功能,尝试应用它们中的每一个并组合结果。实际上,它类似于查找相似的文本。图像相似性搜索不是使用“词袋”,而是使用“指纹袋”并查找一个袋子中的多少元素与另一个袋子中的元素相同。如何使这种搜索高效是另一个话题。
现在,关于文章/论文。我找不到可以概述不同方法的好文章。我知道的大多数公开文章都讨论了对特定方法的特定改进。我可以建议检查这些:
“使用小波的内容指纹识别”。本文是关于使用小波的音频指纹识别,但同样的方法也适用于图像指纹识别。
排列分组:音频和图像检索的智能哈希函数设计。有关位置敏感哈希的信息。
大规模部分重复 Web 图像搜索的捆绑功能。一篇非常好的文章,讨论了 SIFT 和捆绑功能以提高效率。最后还有一个不错的参考书目