【问题标题】:Image comparison with php + gd用php+gd的图片对比
【发布时间】:2011-01-03 11:29:13
【问题描述】:

用 php 和 Graphic Draw (GD) Library 比较两个图像的最佳方法是什么?

这是场景:

我有一张图片,我想找出给定集合中的哪张图片与它最相似。 最相似的图像实际上是同一幅图像,不是像素完美匹配而是同一幅图像。 为了便于理解我的意思,我用示例中的第一名对两张图片之间的差异进行了戏剧化处理。

尽管它没有带来一致的结果,但我的方法是使用 imagecopyresampled 函数将图像缩小到 1px,并查看图像之间的 RGB 值有多接近。

从可能匹配的红色、绿色和蓝色十进制等效值中减去每个红色、绿色和蓝色十进制等效值的值的总和给了我一个相异指数,即使它没有按预期工作,因为并非总是最 RGB 相似的图像是目标图像,我可以使用它从可用目标中选择图像。

这是将 4 个图像与目标图像(在本例中为苹果徽标)进行比较时的输出示例,它与其中一个图像匹配但不完全相同:

原图:

红色:222 绿色:226 蓝色:232

对比:

http://a1.twimg.com/profile_images/571171388/logo-twitter_normal.png 红色:183 绿色:212 蓝色:212,相似指数为 56

红色:117 绿色:028 蓝色:028 和相异指数 530

红色:218 绿色:221 蓝色:221 和相异指数 13 匹配正确。

红色:061 绿色:063 蓝色:063 和相异指数 491

可能甚至没有比我已经得到的更好的结果更好,我在这里浪费了我的时间,但由于似乎有很多经验丰富的 php 程序员,我想你可以为我指出正确的方向如何改善这一点。

我对其他图像库持开放态度,例如 php 的 iMagickGmagickCairo,但我更愿意避免使用 php 以外的其他语言。

提前致谢。

【问题讨论】:

  • 所以你想打败验证码?
  • 不是验证码,图片和我说的一样,没有旋转,中间没有线条,没有模糊。这是我拥有的一个更大项目的一部分,我似乎无法有效地克服这一点。

标签: php image image-processing gd similarity


【解决方案1】:

我认为您的方法似乎是合理的,但是将整个图像缩小到 1x1 像素的大小可能有点过头了。

但是,如果您将每个图像转换为相同大小,然后计算每个 16x16(或 32x32、64x64 等,具体取决于您希望使用多少处理时间/功率)单元格中的平均颜色,您应该能够形成某种明智的(-ish)比较。

【讨论】:

  • 最终使用了我的代码,既然你说这是合理的,那么嘿,你得到了接受的答案
  • 很抱歉搅了一个老话题,但我的情况完全一样。感谢 imagecopyresampled 链接,我可以调整图像的大小,但是如何准确计算每个 16x16 图像中的平均颜色?
  • @Marci-man 在一个非常基本的级别上,您可以使用 imagecolorat 获取该“单元格”内像素的 RGB 值,然后对这些值进行平均以获得整个单元格的值。
【解决方案2】:

我建议像 middaparka 一样,不要将图像缩减为仅 1 像素的图像,因为这样会丢失所有空间信息。下采样到 16x16(或 32x32 等)肯定会提供更好的结果。

那么这也取决于颜色信息对您是否重要。据我了解,您实际上可以不使用它并从您的彩色图像(例如亮度)开始计算灰度图像并计算互相关。如果像您说的那样,有几张完全匹配的图像(颜色信息除外),这应该会给您一个很好的可靠性。

【讨论】:

    【解决方案3】:

    我使用了问答中提到的scalingdownsamplinggray-level的思想,应用了Mean 2 幅图像的像素通道值之间的平方误差,使用GD Library

    code is in this answer,包括对这些想法的测试。

    我还做了一些基准测试,我认为在那些小图像中可能不需要下采样,因为该方法很快(是PHP),只是一小部分一秒钟。

    【讨论】:

      【解决方案4】:

      使用 middparka 的方法,您可以将每个图像转换为一系列数值,然后使用the Levenshtein algorithm 找到最接近的匹配项。

      【讨论】:

      • Levenshtein 的算法在这方面有何帮助?引用“两个字符串之间的 Levenshtein 距离由将一个字符串转换为另一个字符串所需的最小操作数给出”,并且由于所有序列都将由三个 2 位数字组成,因此操作数始终为 3。除非它们具有相同的红色、绿色或蓝色值,这并不一定意味着它是最接近的颜色,甚至是最相似的图像。
      • 另外,PHP 已经有一个 levenshtein 函数:php.net/manual/en/function.levenshtein.php
      猜你喜欢
      • 2015-11-24
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2013-05-18
      相关资源
      最近更新 更多