3

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

是否有任何算法或方法可以快速比较并获得更好的结果...

提前致谢 :)

4

3 回答 3

5

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

最好的 pHASH 是尺度不变的和图像格式不变的。这是 Neal Krawetz 博士的一篇文章……感知散列

ImageMagick 还可以进行感知散列,并且可以从 PHP 调用 - 请参见此处

于 2016-01-05T09:20:08.057 回答
1

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

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

于 2016-01-05T10:12:49.023 回答
1

这完全取决于您希望算法有多聪明。

例如,这里有一些问题:

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

缩放到小的东西,如 64x64 或 32x32,忽略纵横比,使用组合缩放算法而不是最近的像素缩放颜色范围,使最暗为黑色,最亮为白色 旋转并翻转图像,使最亮的颜色在左上角,然后右上是下一个更暗,左下是下一个更暗(当然尽可能)编辑组合缩放算法是一种当将10个像素缩小到一个时,将使用一个函数来实现它的颜色所有这 10 个像素并将它们合并为一个。可以使用平均、平均值或更复杂的算法(例如双三次样条)来完成。

然后逐像素计算两幅图像之间的平均距离。

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

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

于 2016-01-05T08:04:22.543 回答