相似的图像-如何比较它们


Similar images - how to compare them

我有超过130万张图像,必须相互比较,每天添加数百张。

我的公司拍摄了一张图片,并创建了一个可供我们的供应商使用的版本。

这些文件通常彼此非常相似,例如,两家不同的公司可以向我们发送两张不同的图像,一张JPG和一张GIF,都带有麦当劳标志,提交间隔数月。

现在的情况是,最终我们发现自己在两个不同的时间创建了同一个标志,而我们可以简单地复制/粘贴已经创建的标志,或者至少建议将其作为艺术家的可能起点。

我四处寻找创建指纹的算法,或者在上传新图像时允许我进行简单查询的算法,时间相对来说不是问题,如果创建指纹需要1秒,那么创建指纹需要150天,但这将大大节省开支,我们甚至可以用3到4台服务器来完成

我精通PHP,但如果算法是伪代码,甚至是C,我可以阅读它并尝试翻译(除非它使用一些特定于C的库)

目前,我正在对所有图像进行MD5处理,以捕捉完全相同的图像,当我想对图像进行调整大小并在调整大小的图像上运行MD5以捕捉以不同格式保存并调整大小的图片时,出现了这个问题,但我仍然没有足够好的识别能力。

如果我没有提到,我会很高兴看到一些可能"相似"的图像。

编辑

请记住,检查需要每分钟进行多次,因此最好的解决方案是为每个图像提供一些值,我可以存储这些值,并在将来使用这些值来与我正在查看的图像进行比较,而无需重新扫描整个服务器。

我读到一些页面提到了直方图,或者将图像调整到很小的大小,去掉可能的标签,然后将其转换为灰度,对这些文件进行哈希,并将其用于比较。如果我成功了,我会在这里发布代码/答案

尝试使用file_get_contents并:http://www.php.net/manual/en/function.hash-file.php

如果散列匹配,那么你就知道它们完全相同。

编辑:如果可能的话,我认为将图像哈希和图像路径存储在数据库表中可能有助于限制服务器负载。在初始图像上运行一次哈希算法并将哈希存储在表中要容易得多。。。然后,当提交新的图像时,您可以对图像进行哈希处理,然后在数据库表上进行查找。如果散列已经存在,就丢弃它。你可以使用散列作为表索引,所以一旦你找到匹配项,就不需要检查其余部分。

另一种选择是不使用数据库。。。但是,你必须始终进行n查找。也就是说,对传入的图像进行检查散列,然后在内存中对所有保存的图像进行n次搜索。

编辑#2:请在此处查看解决方案:图像比较-快速算法

要加快进程,请按大小对所有文件进行排序,并仅在两个大小相等的情况下比较内部。要比较内部数据,使用哈希比较也是最快的方法。希望这能有所帮助。