【问题标题】:How to detect similar Images in PHP?如何在 PHP 中检测相似的图像?
【发布时间】:2011-06-03 21:44:34
【问题描述】:

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

【问题讨论】:

  • 名字没有相似之处吗?否则,您最终会遇到 N:M 比较情况(前提是您找到了可以解决问题的算法),也许这可以帮助您 stackoverflow.com/questions/2037205/… 但是,请记住,如果您有 1000 张图像,则需要进行 999999 次比较操作
  • 如果您一开始没有维护数据库,请开始维护。如果你过去犯了一个错误并不意味着你必须继续前进,并围绕那个错误扭曲你所有的代码/逻辑。
  • 哇,这在 CPU 周期方面会非常昂贵。您需要使用第一次使用的相同算法缩小每个图像 A 的大小(A 是两者中较大的图像)。如果缩小后的 A 和 B 相等,则以某种方式存储该信息并继续下一对。这可能是 O(N²),因此如果您要处理大量数据,您应该三思而后行。我认为你应该修复你的数据库。无论如何。
  • @elusive,我之前没有维护任何数据库,但我也在尝试,因为我需要独特且最大的图像....
  • @mrNepal:每次比较给定 10 毫秒:30000*30000*10/1000/60/60/24 = 104.17。你需要一百多天才能完成这个。哇!

标签: php image image-processing similarity


【解决方案1】:

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

【讨论】:

  • 问题不是“为什么你应该或不应该在 PHP 中检测相似的图像”——你不可能知道人们为什么需要在 PHP 中比较图像的所有原因。说手动做,不是对实际问题的好答案。
【解决方案2】:

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

Lib 拼图令人惊讶且易于玩。检查这个sn-p

<?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);

【讨论】:

    【解决方案3】:

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


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

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

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

    3. 你用来调整大小的参数呢?例如,在 PSP 上显示的所有图片是否都以相同的分辨率显示?

    4. 您对自己拥有的独特图片数量的估计是多少(即,每张图片可能有多少副本 - 平均而言)?

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

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

    【讨论】:

    • 是的,它们已被裁剪和调整大小,图像为 480x272、800x600、1024x 768、1280 x 1024、1600x1200、1600x1080、1920 x 1080、1920 x 1200、2560 x 100。大约有 3500 张独特的图像,每张照片大约有 9 个精确的副本。关于分类...我将这些图片放在了大约 30 个文件夹中,每个文件夹包含 1000 张图片,超过大小限制后将创​​建一个文件夹并放置,文件名是随机的,以带来不同的图片。
    • 然后我从每个文件夹中随机选择大约 20 张图像并创建一个文件列表。然后,我通过一个函数运行它们,其中图像根据大小排序并自动复制到我各自的设备(如果存在)..
    • 上传时自动裁剪算法.....我调整到高度然后图像以特定分辨率为中心,我通常提供2560 x 1600的图像尺寸。如果我先上传更大的图像,则会拍摄 2560 x 1600 的图像,并且源图像将被丢弃。
    • 我不能创建一个脚本来比较图像,比如 iMatch 或其他 CBIR 软件吗?
    • 我标记php的原因是因为图像是在线的,我使用本地网站来管理它们,所有网站都是用php开发的,我希望php代码隔离其他文件并且只显示最大的图像。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-03
      • 2019-06-22
      • 2011-04-16
      • 2011-09-18
      • 1970-01-01
      • 2020-01-18
      • 2017-12-10
      • 2017-04-01
      • 1970-01-01
      相关资源
      最近更新 更多