用户将fotos上传到我们的php构建系统。其中一些我们因为不相关的内容而被标记为禁止。我正在寻找“自动比较”算法的最优化,该算法正在跳过这些被标记为禁止的照片。每次上传都需要与许多vorbinden进行比较。
可能的解决方案:
1 /存储禁止的文件并比较整个内容 - 运行良好但速度很慢。
2 /存储图像文件校验和并比较校验和 - 这是提高速度的想法。
3 /任何智能算法,足够快,可以比较照片之间的相似性。但我在PHP中没有任何想法。
什么是最佳解决方案?
答案 0 :(得分:4)
不计算校验和,计算哈希值!
我曾经创建过一个简单的应用程序,必须在我的硬盘上查找重复的图像。它只会搜索.JPG文件,但是对于每个文件,我会计算前1024个字节的哈希值,然后将图像的宽度,高度和大小附加到它以获得如下字符串:“875234:640:480: 13286“,我将其用作图像的关键。 事实证明,我没有看到任何与此算法有关的错误重复,尽管仍有可能出现错误的重复。 但是,当有人只为其添加一个字节或对图像进行非常小的调整时,此方案将允许重复。
另一个技巧可能是减少每个图像的颜色大小和数量。如果将每个图像的大小调整为128x128像素并将颜色数量减少到16(4位),那么最终会得到合理的8192字节的独特模式。计算此模式的哈希值,并使用哈希作为主键。一旦命中,您可能仍然存在误报,因此您需要将新图像的模式与系统中存储的模式进行比较。 如果第一个散列解决方案指示新映像是唯一的,则可以使用此模式比较。不过,这仍然是我需要为自己的工具解决的问题。但它基本上是一种拍摄图像的指纹然后进行比较。
我的第一个解决方案会找到完全匹配。我的第二个解决方案会找到类似的图(顺便说一句,我在Delphi中编写了我的哈希方法,但从技术上讲,任何哈希方法都足够好。)
答案 1 :(得分:2)
图像相似性比较并不是一个微不足道的问题,所以除非你真的想要花费大量的精力来进行图像比较算法,否则你想要创建某种图像数据的哈希并进行比较至少会让你快速检测确切的重复。我会考虑你当前的计划,但要确保它是一个不错的(但很快)哈希,以便碰撞的可能性很低。
答案 2 :(得分:1)
如所建议的那样,哈希的问题在于,如果某人更改了1个像素,则哈希变得完全不同。
有很好的框架能够比较文件的内容,并返回(以百分比表示)它们看起来相似的程度。有一个特定的命令行应用程序,我曾经遇到过它是在科学环境中构建的,它是开源的,但我不记得它的名字。
这种框架绝对可以帮助你,因为它们可以非常快,即使有大量文件。