16

我在 PHP 中开发了一种简单快速的算法来比较图像的相似性。

它的散列速度很快(对于 800x600 图像,每秒约 40 张),未经优化的搜索算法可以在 22 分钟内浏览 3,000 张图像,将每张图像与其他图像进行比较(3/秒)。

基本概述是您获取图像,将其重新缩放为 8x8,然后将这些像素转换为 HSV。然后将色调、饱和度和值截断为 4 位,并变成一个大的十六进制字符串。

比较图像基本上是沿着两个字符串走,然后添加它发现的差异。如果总数低于 64,则它是相同的图像。不同的图像通常在 600 - 800 左右。低于 20 并且极其相似。

我可以使用这个模型有什么改进吗?我还没有查看不同组件(色调、饱和度和值)与比较的相关性。色调可能很重要,但其他的呢?

为了加快搜索速度,我可能会将每个部分的 4 位分成两半,并将最高有效位放在首位,因此如果它们未通过检查,则根本不需要检查 lsb。我不知道一种有效的方法来存储这样的位,但仍然可以轻松地搜索和比较它们。

我一直在使用包含 3,000 张照片(大部分是唯一的)的数据集,并且没有出现任何误报。它完全不受调整大小的影响,并且对亮度和对比度变化具有相当的抵抗力。

4

1 回答 1

10

您要使用的是:

  1. 特征提取
  2. 散列
  3. 本地感知的布隆哈希。

  1. 大多数人使用SIFT特征,尽管我在非尺度不变特征方面有更好的经验。基本上,您使用边缘检测器来找到有趣的点,然后将图像块围绕这些点居中。这样您还可以检测子图像。

  2. 您实现的是哈希方法。有很多东西可以尝试,但你的应该可以正常工作:)

  3. 使其快速的关键步骤是散列你的哈希值。您将值转换为一元表示,然后将位的随机子集作为新哈希。使用 20-50 个随机样本执行此操作,您将获得 20-50 个哈希表。如果任何特征匹配这 50 个哈希表中的 2 个或更多,则该特征将与您已经存储的特征非常相似。这允许您转换 abs(xy)

希望对您有所帮助,如果您想尝试我自己开发的图像相似度搜索,请在 spratpix 的hajo给我发邮件

于 2011-01-30T21:50:52.247 回答