相似图片 - 如何比较它们

时间:2012-07-31 22:53:25

标签: php image image-processing similarity fingerprint

我有超过130万的图像,我必须相互比较,每天增加几百个。

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

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

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

我一直在寻找创建指纹的算法,或者在上传新图像时允许我进行简单查询的事情,时间相对不是问题,如果创建指纹需要1秒钟创建指纹需要150天,但在保存方面会有很多,我们甚至可以使用3或4台服务器。

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

目前我正在对所有图像进行MD5以捕捉完全相同的图像,当我想要调整图像大小并在调整大小的图像上运行md5来捕获那些图像时出现了这个问题已经以不同的格式保存并调整大小,但是我仍然没有足够的认可。

如果我没有提及它,我会很高兴看到可能出现“类似”图像的东西。

修改

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

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

4 个答案:

答案 0 :(得分:2)

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

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

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

另一个选择是不使用数据库......但是你必须总是进行n查找。这是对传入图像进行检查哈希,然后在内存中运行n次搜索所有已保存图像。

编辑#2: 请在此处查看解决方案:Image comparison - fast algorithm

答案 1 :(得分:1)

您的类似问题已存在,请检查它是否适合您:Compare 2 images in PHP

答案 2 :(得分:1)

您可以使用PHP ImageMagick extension

答案 3 :(得分:0)

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