我有许多不同分辨率的相同图片的文件,适用于移动设备、电脑、psp 等各种设备。现在我尝试在页面中仅显示唯一的图片,但我不知道如何操作。如果我一开始就维护数据库,我本可以避免这种情况,但我没有。我需要你的帮助来检测最大的独特图片。
在您的服务器中安装 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);
好吧,即使有很多算法可以做到这一点,我相信手动执行仍然会更快。下载所有图像并将它们输入到 Windows Live 照片库或任何其他可以匹配类似图像的软件中。 这将花费您几个小时,但实施图像匹配算法可能需要更多时间。之后,您可以花费额外的时间修改当前系统以将所有内容存储在数据库中。 解决问题的原因,而不是症状。
您应该检查 2 个图像中哪一个最小,获取其大小,然后仅比较矩形大小内的像素。
首先,你的问题与 PHP 几乎没有任何关系,所以我删除了该标签并添加了更多相关标签。
巧妙地做到这一点不需要 NxN 比较。您可以使用很多启发式方法,但首先我想问您:
一张图像的所有副本是否彼此精确调整大小(是否进行了一些裁剪 - 将裁剪后的图像与原始图像匹配可能会更加困难且耗时)?
所有图像都是使用相同的工具生成(调整大小)的吗?
您用来调整大小的参数怎么样?例如,在PSP上显示的所有图片都是相同的分辨率吗?
您估计您拥有多少张独特的图像(即,平均每张图片可能有多少个副本)?
您已经完成了任何类型的分类吗?例如,所有移动图像是否都位于单独的文件夹中(或者与 PC 图像的分辨率不同)?仅此一项就可以减少很多的比较次数,即使您采用暴力方式。
关于为什么不需要 NxN 比较的非常顶级的提示:您可以设计许多不同的近似哈希值(例如,高/低频 jpeg 系数的分布)并将“潜在”相似的图像分组在一起。这可以将所需的比较次数减少 10-100 倍甚至更多,具体取决于所使用的启发式方法和数据集的质量。甚至可以对部分图像进行哈希处理。如果你使用正确的技术,30000 并不是一个很大的数字。
如果您使用 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