使用索引查找相似图像的算法

时间:2014-08-03 14:22:54

标签: algorithm image-processing similarity

有一些令人惊讶的好图像比较工具,即使它们不完全相同(例如,尺寸,壁纸,亮度/对比度的变化),它们也能找到相似的图像。我在这里有一些示例应用程序:

我只尝试了第一个,但它们都是为Windows开发的,不是开源的。 Unique Filer于2000年发布,主页似乎已经消失。它出乎意料地快(即使在当年的计算机上),因为它使用索引并使用索引比较大约10000个图像只需要几秒钟(并且更新索引是一个可伸缩的过程)。

由于该算法以非常有效的形式存在至少15年,我认为它已有详细记录,可能已经作为开源库实现。有谁知道更多关于使用哪种算法或图像检测理论来实现这些应用程序?也许甚至有可用的开源实现?

我已经检查了问题Algorithm for finding similar images,但所有答案都是通过比较一张图像来解决问题。对于1000多张图像,这将导致1000 ^ 2比较操作,这不是我正在寻找的。

2 个答案:

答案 0 :(得分:2)

您所描述的问题通常称为Nearest Neighbor Search。由于您要求在大型数据集上实现高效率,因此近似最近邻搜索就是您所追求的。

有效的技术是Locality-Sensitive Hashing (LSH)these slides为其提供了很好的概述。其基本思想是使用散列函数将所有数据投影到低维空间,其约束条件是类似数据的散列与高概率碰撞,不同数据碰撞的概率较低。这些概率是算法的参数,利用它可以改变准确性和效率之间的权衡。

LSHKIT是LSH的开源实现。

答案 1 :(得分:1)

与此同时,我分析了UniqueFiler的算法:

缩小尺寸

首先,它将所有图像缩小为10x10像素灰度图像(可能不使用插值)

旋转

可能基于4个象限的亮度,进行了一些旋转(此步骤很危险,因为如果图像过于对称,有时会“忽略”相似性)

范围缩小

图像亮度范围被完全扩展(最亮->白色,最暗->黑色),然后减小到每个像素2位(4个值)

数据库

这些值存储为每个图像100个字节的数组(加上文件元数据)

比较

...一步一步完成(整个数据库的两个嵌套循环以及100字节的第三个嵌套循环)。今天,我们可能会为所有四个象限的排序总和建立索引,以便快速预选相似的候选对象。

匹配器

通过两个字节之间的差值逐字节进行比较,加权后的结果小于平方。这100个结果的总和是两张图片之间的最终差值。

我有一个更详细的信息。如果有时间,我会将其添加到此答案中。我发现数据库格式实际上是没有标题的gzip压缩文件后发现的,每张图像包含固定大小的记录