如何在PHP中检测相似的图像?

问题描述 投票:0回答:5

我有许多不同分辨率的相同图片的文件,适用于移动设备、电脑、psp 等各种设备。现在我尝试在页面中仅显示唯一的图片,但我不知道如何操作。如果我一开始就维护数据库,我本可以避免这种情况,但我没有。我需要你的帮助来检测最大的独特图片。

php image image-processing similarity
5个回答
15
投票

在您的服务器中安装 gd2 和 lib puzzle

Lib 拼图令人惊叹且易于玩。检查这个片段

<?php
# Compute signatures for two images
$cvec1 = puzzle_fill_cvec_from_file('img1.jpg');
$cvec2 = puzzle_fill_cvec_from_file('img2.jpg');

# Compute the distance between both signatures
$d = puzzle_vector_normalized_distance($cvec1, $cvec2);

# Are pictures similar?
if ($d < PUZZLE_CVEC_SIMILARITY_LOWER_THRESHOLD) {
  echo "Pictures are looking similar\n";
} else {
  echo "Pictures are different, distance=$d\n";
}

# Compress the signatures for database storage
$compress_cvec1 = puzzle_compress_cvec($cvec1);
$compress_cvec2 = puzzle_compress_cvec($cvec2);

2
投票

好吧,即使有很多算法可以做到这一点,我相信手动执行仍然会更快。下载所有图像并将它们输入到 Windows Live 照片库或任何其他可以匹配类似图像的软件中。 这将花费您几个小时,但实施图像匹配算法可能需要更多时间。之后,您可以花费额外的时间修改当前系统以将所有内容存储在数据库中。 解决问题的原因,而不是症状。


0
投票

您应该检查 2 个图像中哪一个最小,获取其大小,然后仅比较矩形大小内的像素。


0
投票

首先,你的问题与 PHP 几乎没有任何关系,所以我删除了该标签并添加了更多相关标签。


巧妙地做到这一点不需要 NxN 比较。您可以使用很多启发式方法,但首先我想问您:

  1. 一张图像的所有副本是否彼此精确调整大小(是否进行了一些裁剪 - 将裁剪后的图像与原始图像匹配可能会更加困难且耗时)?

  2. 所有图像都是使用相同的工具生成(调整大小)的吗?

  3. 您用来调整大小的参数怎么样?例如,在PSP上显示的所有图片都是相同的分辨率吗?

  4. 您估计您拥有多少张独特的图像(即,平均每张图片可能有多少个副本)?

  5. 您已经完成了任何类型的分类吗?例如,所有移动图像是否都位于单独的文件夹中(或者与 PC 图像的分辨率不同)?仅此一项就可以减少很多的比较次数,即使您采用暴力方式。

关于为什么不需要 NxN 比较的非常顶级的提示:您可以设计许多不同的近似哈希值(例如,高/低频 jpeg 系数的分布)并将“潜在”相似的图像分组在一起。这可以将所需的比较次数减少 10-100 倍甚至更多,具体取决于所使用的启发式方法和数据集的质量。甚至可以对部分图像进行哈希处理。如果你使用正确的技术,30000 并不是一个很大的数字。


0
投票

如果您使用 PHP 8.1 或更高版本,请考虑使用 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; // Outputs: 89.3
© www.soinside.com 2019 - 2024. All rights reserved.