我的场景如下:我必须在数据库中保存1000个图像,然后我必须比较新的图像与数据库图像的匹配(匹配应该是70%或更多),以获得最佳匹配图像从数据库在PHP。有没有什么算法或方法可以快速比较更好的结果…提前感谢:)
tf7tbtn21#
我建议你使用感知散列或类似的-主要是出于性能的原因。本质上,您在数据库中插入每个图像时,为每个图像创建一个单独的数字或散列,并将该散列保留在数据库中。然后,当你得到一个新的图像插入,你计算它的哈希值,并将其与所有其他图像的预先计算的哈希值进行比较,这样你就不必从磁盘上拖动现有图像的所有兆字节的像素来比较它们。最好的pHASH是尺度不变和图像格式不变的。这是Neal Krawetz博士的一篇文章。Perceptual Hashing。ImageMagick还可以进行感知散列,并且可以从PHP调用-参见here。
ttisahbt2#
试试这门课。它支持从图像中获取哈希字符串存储在数据库中,并与新图像进行比较:https://github.com/nvthaovn/CompareImage它非常快速和准确,尽管不是最佳代码。我的数据库里有20000张照片。
fdx2calv3#
这完全取决于你希望算法有多聪明。例如,以下是一些问题:裁剪图像与添加了文本的未裁剪图像与另一个没有镜像的图像我见过的最简单的算法就是对每个图像执行以下步骤:缩放到较小的尺寸,如64 × 64或32 × 32,忽略纵横比,使用组合缩放算法而不是最近的像素缩放颜色范围,使得最暗的是黑色,最亮的是白色旋转并翻转图像,使得最亮的颜色是左上方,然后右上方是下一个较暗的颜色,左下角是下一个较暗的区域(当然尽可能)组合缩放算法是一种将10个像素缩小到1的算法,它使用一个函数将所有这10个像素的颜色组合起来可以使用平均、均值或更复杂的算法(如双三次样条)来完成。然后逐像素计算两个图像之间的平均距离。要在数据库中查找可能的匹配项,请将像素颜色作为单独的列存储在数据库中,索引一堆(但不是全部,除非您使用非常小的图像),并使用每个像素值的范围进行查询。小图像中的像素在您要查找的图像的-5和+5之间的每个图像。这很容易实现,运行起来也相当快,但当然不能处理大多数高级差异。为此,您需要更先进的算法。
zpf6vheq4#
你可以使用这个库https://github.com/sapientpro/image-comparator--它在引擎盖下使用感知哈希。您还可以使用它来比较多个图像。示例:
$comparator = new SapientPro\ImageComparator\ImageComparator() $similarity = $comparator->compare('your-images/your-image1.jpg', 'your-images/your-image12.jpg'); echo $similarity; //72.7
4条答案
按热度按时间tf7tbtn21#
我建议你使用感知散列或类似的-主要是出于性能的原因。本质上,您在数据库中插入每个图像时,为每个图像创建一个单独的数字或散列,并将该散列保留在数据库中。然后,当你得到一个新的图像插入,你计算它的哈希值,并将其与所有其他图像的预先计算的哈希值进行比较,这样你就不必从磁盘上拖动现有图像的所有兆字节的像素来比较它们。
最好的pHASH是尺度不变和图像格式不变的。这是Neal Krawetz博士的一篇文章。Perceptual Hashing。
ImageMagick还可以进行感知散列,并且可以从PHP调用-参见here。
ttisahbt2#
试试这门课。它支持从图像中获取哈希字符串存储在数据库中,并与新图像进行比较:
https://github.com/nvthaovn/CompareImage
它非常快速和准确,尽管不是最佳代码。我的数据库里有20000张照片。
fdx2calv3#
这完全取决于你希望算法有多聪明。
例如,以下是一些问题:
裁剪图像与添加了文本的未裁剪图像与另一个没有镜像的图像我见过的最简单的算法就是对每个图像执行以下步骤:
缩放到较小的尺寸,如64 × 64或32 × 32,忽略纵横比,使用组合缩放算法而不是最近的像素缩放颜色范围,使得最暗的是黑色,最亮的是白色旋转并翻转图像,使得最亮的颜色是左上方,然后右上方是下一个较暗的颜色,左下角是下一个较暗的区域(当然尽可能)组合缩放算法是一种将10个像素缩小到1的算法,它使用一个函数将所有这10个像素的颜色组合起来可以使用平均、均值或更复杂的算法(如双三次样条)来完成。
然后逐像素计算两个图像之间的平均距离。
要在数据库中查找可能的匹配项,请将像素颜色作为单独的列存储在数据库中,索引一堆(但不是全部,除非您使用非常小的图像),并使用每个像素值的范围进行查询。小图像中的像素在您要查找的图像的-5和+5之间的每个图像。
这很容易实现,运行起来也相当快,但当然不能处理大多数高级差异。为此,您需要更先进的算法。
zpf6vheq4#
你可以使用这个库https://github.com/sapientpro/image-comparator--它在引擎盖下使用感知哈希。您还可以使用它来比较多个图像。
示例: