我有超过130万张图片,我必须互相比较,并且每天增加几百张图片。
我的公司拍摄了一个图像,并创建了一个版本,可供我们的供应商使用。
这些文件通常是非常相似的,例如两家不同的公司可以向我们发送两个不同的图像,一个JPG和一个GIF,都带有McDonald标志,在提交的几个月之间。
正在发生的是,在最后,我们发现自己创造了两个不同的时代,相同的标志,当我们可以简单地复制/粘贴已经创建的一个,或至少建议它作为一个可能的起点艺术家。
我四处寻找创建指纹的算法,或者做一些能让我在上传新图像时进行简单查询的算法,时间相对来说不是问题,如果创建指纹需要1秒,那么创建指纹需要150天,但这将大大节省我们甚至可以得到3或4台服务器来完成指纹的工作。
我精通PHP,但是如果算法是用伪代码,甚至是C语言,我可以读取它并尝试翻译(除非它使用一些特定于C的库)
目前,我正在做一个所有图像的MD5来捕捉那些完全相同的图像,这个问题是在我考虑对图像进行调整并在调整大小的图像上运行md5来捕获那些以不同格式保存并调整大小的图像时出现的,但是我仍然没有足够好的识别能力。
如果我没有提到它,我会很高兴的东西,只是提出一些可能的“类似”的图像。
编辑
请记住,检查需要进行多次每分钟,所以最好的解决方案是给我一些价值的每一个图像,我可以存储和使用,以比较我正在看的图像,而不必重新扫描整个服务器。
我正在阅读一些提到直方图的页面,或者将图像调整为非常小的大小,去掉可能的标记,然后将其转换为灰度,对该文件进行散列,并使用它进行比较。如果我成功的话,我会在这里张贴代码/答案。
发布于 2012-07-31 22:56:41
尝试使用file_get_contents和:http://www.php.net/manual/en/function.hash-file.php
如果散列匹配,那么您就知道它们是完全相同的。
编辑:如果可能的话,我认为存储图像散列,而数据库表中的图像路径可能会帮助您限制服务器负载。在初始图像上运行哈希算法并将哈希存储在表中要容易得多.然后,当提交新图像时,您可以对图像进行散列,然后对数据库表进行查找。如果散列已经存在,则丢弃它。您可以使用哈希作为表索引,因此一旦找到匹配项,就不需要检查其余的内容。
另一种选择是不使用database...But,这样就必须始终进行n查找。也就是说,检查传入图像的散列,然后在内存中对所有保存的图像进行n次搜索。
编辑#2: --请在这里查看解决方案:Image comparison - fast algorithm
发布于 2012-08-01 06:18:50
若要加快处理速度,请对所有具有大小的文件进行排序,并在两个大小相等的情况下比较内部文件。要比较内部数据,使用哈希比较也是最快的方法。希望这能有所帮助。
https://stackoverflow.com/questions/11750192
复制相似问题