11

将两个图像与 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 以外的其他语言。

提前致谢。

4

4 回答 4

4

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

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

于 2010-01-10T14:26:47.537 回答
0

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

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

于 2010-01-10T22:39:06.897 回答
0

我使用问题和答案中提到的缩放下采样灰度的想法,使用GD Library在两个图像的像素通道值之间应用均方误差

代码在这个答案中,包括对这些想法的测试。

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

于 2020-09-04T06:36:28.527 回答
-1

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

于 2010-01-10T15:16:52.640 回答