Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中检测相似的图像?_Php_Image_Image Processing_Similarity - Fatal编程技术网

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

如何在PHP中检测相似的图像?,php,image,image-processing,similarity,Php,Image,Image Processing,Similarity,我有许多相同图片的不同分辨率的文件,适用于手机、pc、psp等各种设备。现在我试图在页面中只显示唯一的图片,但我不知道如何显示。如果我一开始就维护一个数据库,我本可以避免这种情况,但我没有。我需要你的帮助来检测最大的独特图片。你应该检查这两张图片中哪一张最小,取其大小,然后只比较矩形大小内的像素。首先,你的问题与PHP几乎没有任何关系,因此我删除了该标记并添加了更多相关标记 巧妙地做到这一点不需要NxN比较。你可以使用很多启发法,但首先我想问你: 一个图像的所有副本是否都精确地调整了彼此的大小

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

你应该检查这两张图片中哪一张最小,取其大小,然后只比较矩形大小内的像素。

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


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

  • 一个图像的所有副本是否都精确地调整了彼此的大小(是否进行了一些裁剪-将裁剪后的图像与原始图像匹配可能更困难、更耗时)

  • 是否使用相同的工具生成所有图像(调整大小)

  • 您用来调整大小的参数是什么?例如,在PSP上显示的所有图片的分辨率是否相同

  • 你估计你有多少独特的图像(即,平均每幅图片可能有多少副本)

  • 您是否已经完成了任何类型的分类。例如,是否所有移动图像都位于单独的文件夹中(或与PC图像的分辨率不同)?单凭这一点就可以大大减少比较的次数,即使你不这么做

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

    在服务器上安装gd2和

    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照片库或任何其他可以匹配类似图片的软件。
    这将花费您几个小时,但实现图像匹配算法可能需要更多的时间。之后,您可以花额外的时间修改当前系统,将所有内容存储在数据库中。
    
    解决问题的原因,而不是症状。

    名称是否有相似之处?否则(如果你找到了一种算法来实现这一点)就会出现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中比较图像的所有原因。说手动操作,并不是对实际问题的好答案。