与php + gd的图像比较

时间:2010-01-10 14:03:14

标签: php image image-processing gd similarity

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

这是情景:

alt text

我有一个图像,我想找到给定集合中哪个图像与它最相似。 最相似的图像实际上是相同的图像,而不是像素完美匹配但是相同的图像。 我把这两个图像之间的区别与示例中的第一个进行了戏剧化,以便于理解我的意思。

即使它没有带来一致的结果,我的方法是使用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程序员,我想你可以指出我在正确的方向上如何改善这一点。

我对其他图像库(例如iMagickGmagickCairo开放,但是我宁愿避免使用除php以外的其他语言。

提前致谢。

4 个答案:

答案 0 :(得分:4)

我认为你的方法似乎是合理的,但是将整个图像缩小到1x1像素大小可能是一个步骤太远了。

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我使用问题和答案中提到的缩放下采样灰度级的思想来应用均值使用my google tag code image。2张图像的像素通道值之间的平方误差

GD Library,包括对这些想法的测试。

我也做了一些 benckmarking ,我认为在那些小图像中可能不需要 downsampling ,因为该方法是快速的(是PHP),只是其中的一小部分。一秒钟。

答案 3 :(得分:-1)

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