php 中的图像比较

Image comparison in php

我的场景如下: 我必须在数据库中保存 1000 张图像,然后我必须将新图像与数据库图像进行匹配(匹配应为 70% 或更多)以从 php.[=11 中的数据库中获得最佳匹配图像=]

有没有什么算法或方法可以快速比较并获得更好的结果...

提前致谢:)

这完全取决于您希望算法的智能程度。

例如,这里有一些问题:

裁剪图像与未裁剪图像 添加文本的图像与未添加文本的图像 镜像 我见过的最简单的算法就是对每张图片执行以下步骤:

缩放到较小的尺寸,例如 64x64 或 32x32,忽略纵横比,使用组合缩放算法而不是最近像素 缩放颜色范围,使最暗的是黑色,最亮的是白色 旋转并翻转图像,使最浅的颜色在左上角,然后 top-right 下一个更暗, bottom-left 下一个更暗(当然尽可能) 编辑组合缩放算法是一种当将 10 个像素缩小到一个时,将使用一个函数来完成它,该函数采用所有这 10 个像素的颜色并将它们组合成一个。可以使用平均算法 mean-value 或双三次样条等更复杂的算法来完成。

然后计算两张图片之间的平均距离pixel-by-pixel。

要在数据库中查找可能的匹配项,请将像素颜色作为单独的列存储在数据库中,为其中的一堆(但不是全部,除非您使用非常小的图像)编制索引,然后进行查询对每个像素值使用一个范围,即。小图像中的像素在您要查找的图像的 -5 和 +5 之间的每个图像。

这很容易实现,而且 运行 也相当快,但当然不会处理大多数高级差异。为此,您需要更高级的算法。

我建议您使用 Perceptual Hash 或类似的 - 主要是出于性能原因。本质上,您在插入图像时为数据库中的每个图像一次性创建一个数字或哈希,并将该哈希保留在数据库中。然后,当您获得要插入的新图像时,计算其哈希并将其与所有其他图像的 PRE-CALCULATED 哈希进行比较,这样您就不必从磁盘中拖出现有图像的所有兆字节像素比较它们。

最好的 PHASHes 是 scale-invariant 并且图像格式不变。这是 Neal Krawetz 博士的一篇文章... Perceptual Hashing.

ImageMagick 还可以执行感知散列并且可以从 PHP 调用 - 参见 here

试试这个 class。它支持从图像中获取哈希字符串以存储在数据库中,并稍后与新图像进行比较:
https://github.com/nvthaovn/CompareImage

它非常快速和准确,虽然不是最佳代码。我的数据库中有 20000 张图片。