4

我有超过 130 万张图像需要相互比较,而且每天会添加数百张。

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

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

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

我一直在寻找创建指纹的算法或其他允许我在上传新图像时进行简单查询的算法,时间相对不是问题,如果创建指纹需要 1 秒,则需要 150 天创建指纹,但我们甚至可能会获得 3 或 4 台服务器来做这件事,这将是一个很大的节省。

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

目前我正在对所有图像进行 MD5 以捕捉完全相同的图像,当我考虑调整图像大小并在调整大小的图像上运行 md5 以捕捉那些已经被以不同的格式保存并调整大小,但我仍然没有足够好的识别。

如果我没有提到它,我会很高兴有一些只是建议可能的“相似”图像的东西。

编辑

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

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

4

2 回答 2

2

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

如果哈希匹配,那么您知道它们完全相同。

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

另一种选择是不使用数据库...但是您必须始终进行查找。那就是检查传入图像的哈希值,然后在内存中对所有保存的图像进行时间搜索。

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

于 2012-07-31T22:56:41.593 回答
0

为了加快处理速度,请按大小对所有文件进行排序,并仅在两个大小相等时才比较内部结构。要比较内部数据,使用哈希比较也是最快的方法。希望这可以帮助。

于 2012-08-01T06:18:50.197 回答