如何在PHP中检测相似的图像?
我有许多相同图片的不同分辨率的文件,适用于手机、pc、psp等各种设备。现在我试图在页面中只显示唯一的图片,但我不知道如何显示。如果我一开始就维护一个数据库,我本可以避免这种情况,但我没有。我需要你的帮助来检测最大的独特图片。你应该检查这两张图片中哪一张最小,取其大小,然后只比较矩形大小内的像素。首先,你的问题与PHP几乎没有任何关系,因此我删除了该标记并添加了更多相关标记如何在PHP中检测相似的图像?,php,image,image-processing,similarity,Php,Image,Image Processing,Similarity,我有许多相同图片的不同分辨率的文件,适用于手机、pc、psp等各种设备。现在我试图在页面中只显示唯一的图片,但我不知道如何显示。如果我一开始就维护一个数据库,我本可以避免这种情况,但我没有。我需要你的帮助来检测最大的独特图片。你应该检查这两张图片中哪一张最小,取其大小,然后只比较矩形大小内的像素。首先,你的问题与PHP几乎没有任何关系,因此我删除了该标记并添加了更多相关标记 巧妙地做到这一点不需要NxN比较。你可以使用很多启发法,但首先我想问你: 一个图像的所有副本是否都精确地调整了彼此的大小
巧妙地做到这一点不需要NxN比较。你可以使用很多启发法,但首先我想问你:
<?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照片库或任何其他可以匹配类似图片的软件。
这将花费您几个小时,但实现图像匹配算法可能需要更多的时间。之后,您可以花额外的时间修改当前系统,将所有内容存储在数据库中。
解决问题的原因,而不是症状。名称是否有相似之处?否则(如果你找到了一种算法来实现这一点)就会出现N:M比较的情况,这可能会对你有所帮助,但是,记住,如果你有1000个图像,那么这将是999999个比较操作。如果你一开始没有,就开始维护数据库。如果你在过去犯了一个错误,并不意味着你必须继续,并围绕这个错误扭曲所有的代码/逻辑。哇,这将是非常昂贵的CPU周期。您需要使用第一次使用的相同算法缩小每个图像A(A是两个图像中较大的图像)。如果缩小的A和B是等效的,则以某种方式存储该信息并继续下一对。这可能是O(N²),因此如果处理大量数据,您应该三思。我认为你应该修复你的数据库。不管怎样。@elvasive,我以前没有维护过任何数据库,但我也在尝试,因为我需要唯一和最大的图像。@mrNepal:每次比较10毫秒:30000*30000*10/1000/60/60/24=104.17
。你需要一百多天才能完成这件事。哇!是的,它们已裁剪并调整大小,图像为480x272、800x600、1024x 768、1280 x 1024、1600x1200、1600x1080、1920 x 1080、1920 x 1200、2560 x 1600。应该有大约3500个独特的图像,每个图像大约有9个精确的副本。关于分类。。。我把这些图片放在大约30个文件夹中,每个文件夹包含1000张图片,一旦超过大小限制,将创建并放置一个文件夹,然后随机选择文件名以产生不同的图片。然后我从每个文件夹中随机选择大约20张图片并创建一个文件列表。然后,我通过一个函数运行它们,在这个函数中,图像根据大小进行排序,并自动复制到我各自的设备(如果它们存在的话)。裁剪算法在上传时是自动的。。。。。我调整到高度,然后图像居中到特定分辨率,我通常提供2560 x 1600的图像大小。如果我先上传了更大的图像,将拍摄一张2560 x 1600的图像,源图像将被丢弃。我不能创建一个脚本来比较像iMatch或其他CBIR软件这样的图像吗?我之所以标记php
,是因为这些图像是在线的,我使用本地网站来管理它们,并且所有的网站都是用php开发的我想让php代码隔离其他文件,只显示最大的图像。问题不是“为什么你应该或不应该在php中检测类似的图像”-你不可能知道为什么人们需要在php中比较图像的所有原因。说手动操作,并不是对实际问题的好答案。