php - 使用 ImageMagick 使用图像数据库比较图像?
问题描述
我知道我可以使用 PHP中的库函数(也可以在其他几种编程语言中使用)来比较两个图像(检查它们在视觉上是否相同,而不是检查它们的文件格式、EXIF 等)。compareImages( Imagick $compare , int $metric )
ImageMagick
在 PHP 中比较 2 个图像的示例代码:
<?php
$image1 = new imagick("image1.png");
$image2 = new imagick("image2.png");
// TODO: have to resize 2 images to same dimension first
$result = $image1->compareImages($image2, Imagick::METRIC_MEANSQUAREERROR);
$result[0]->setImageFormat("png");
header("Content-Type: image/png");
echo $result[0]; // display the result
// TODO: Add exception handling
?>
但是要比较成千上万的图像,这个功能似乎效率低下,因为它只能一张一张地比较。有没有什么功能可以用来制作图像的指纹(类似的东西),以便我可以轻松地在数据库中搜索?
我能想到的方法:
- 将图像转换为 Base64 字符串
- 从每张图像中提取几个样本像素,将颜色存储在数据库中(但这种方法不准确)
- 使用图像识别库(类似于机器学习)为每张图像添加一些标签,然后按标签搜索(这种方法也不准确)
- (还要别的吗?)
欢迎所有建议。
ps编程语言不一定是PHP。
解决方案
您可以使用该getImageSignature
函数,该函数将返回一个包含文件 SHA-256 哈希值的字符串。
因此,要么遍历所有图像并将图像签名添加到您的图像数据库中,要么只是在您执行的每个比较中添加签名。
希望有帮助。
推荐阅读
- twig - 我们如何添加会话变量以便我们可以在所有模板中使用它们?
- ios - SwiftUI:如何让项目的拖放重新排序工作?
- sql - 如何使用带有 IN 子句的逗号分隔值检索记录?
- java - 等待(阻塞)直到 LinkedBlockingQueue 非空而不改变它的正确方法是什么?
- laravel - hasOneThrough Laravel 雄辩的关系
- php - 在 laravel 调度中 random(1, 6) 是什么意思?
- spring - 如何实现spring oauth2自定义流程?
- rust - Rust 是否允许 lib/mod.rs 代替 lib.rs?
- visualization - 如何根据度量对枢轴进行排序并创建堆积条形图
- android - API 26 的 RecyclerView - 安卓