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

Php 相似图像-如何比较它们,php,image,image-processing,similarity,fingerprint,Php,Image,Image Processing,Similarity,Fingerprint,我有超过130万张图片需要相互比较,每天增加几百张 我的公司拍摄了一张图片并创建了一个可供我们的供应商使用的版本 这些文件通常彼此非常相似,例如,两个不同的公司可以向我们发送两张不同的图像,一张JPG和一张GIF,两张图像都带有麦当劳标志,提交间隔为数月 最终,我们发现自己在两个不同的时间创建了同一个徽标,我们可以简单地复制/粘贴已经创建的徽标,或者至少建议将其作为艺术家的可能起点 我四处寻找创建指纹的算法,或者在上传新图像时允许我进行简单查询的算法,时间相对来说不是问题,如果创建指纹需要1秒的

我有超过130万张图片需要相互比较,每天增加几百张

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

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

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

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

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

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

如果我没有提到,我会很高兴看到一些可能的“相似”图片

编辑

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


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

尝试使用文件获取内容,并:

如果散列匹配,那么您知道它们是完全相同的

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

另一个选择是不使用数据库…但是您必须始终执行n查找。也就是说,检查传入图像的哈希值,然后在内存中对所有保存的图像运行n次搜索

编辑#2:
请在此处查看解决方案:

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

这就是我目前正在做的,我存储文件的大小、创建时间、名称和MD5,但这对类似的图像没有帮助,只对精确匹配有帮助。如果我认为没有可能的解决方案,如果不仅仅是因为如果麦当劳的绿拱门和麦当劳的金拱门是一样的,你怎么能分辨出两者的区别呢。作为一个人,这很容易,但当然,唯一能告诉代码的方法是查找与特定颜色相关的字节数据。但是,如果两张图像大多具有相同的RGB代码,例如麦当劳黄色和校车,会发生什么?我已经编辑了我的答案,以包括以前的解决方案。同时,为了避免将来的维护。。。也许您可以让客户存储您的图像,并让销售人员(或客户服务人员)查看每个传入的图像,如果该客户已经有图像,则拒绝该图像?只是想提供一个技术性较低的解决方案……Shawn,我们已经这样做了,问题是同一个客户创建了新帐户,而我们为新帐户提供了一项免费服务,或者每个员工上传相同徽标的公司。在这种情况下,我们不想重新创建徽标,而是使用我们已经做过的一次。防止同一家公司滥用的一种方法是在注册时使用他们的fed_tax_id账户,然后让您的团队在irs.gov上验证。我的一位雇主这样做了。MD5比较是我已经在做的事情,只有在我没有将最终哈希存储在某个地方的情况下,按大小排序才有帮助,但我将哈希存储在数据库中。当我寻找相似的图像时,MD5只会给我精确的匹配。为了比较起见,在数据库中存储一个大小如何?比较int大小会比比较每个md5和其他md5快,不是吗?是的,它会更快,但非常不可靠。您可以有两个大小完全不同的图像,例如白色像素图像和黑色像素图像。我说的是,只有大小匹配时才使用md5。我将md5与其他文件信息一起存储在数据库中。检查md5的查询速度非常快(0.0007),无需检查大小查看有关如何获取图像签名/指纹的一些相关问题,然后您可以比较这些图像签名/指纹的相似性:。。。