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