与php + gd的图像比较

mutmk8jj  于 2023-05-27  发布在  PHP
关注(0)|答案(5)|浏览(127)

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

我有一个图像,我想找出给定集合中哪一个图像与它最相似。最相似的图像实际上是相同的图像,不是像素完美匹配而是相同的图像。我已经戏剧化了两个图像之间的差异与数字1的例子只是为了便于理解我的意思。
即使它没有带来一致的结果,我的方法是使用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以外的其他语言。
先谢谢你了。

ehxuflar

ehxuflar1#

我认为你的方法似乎是合理的,但将整个图像的大小减少到1x 1像素可能是一个太远的步骤。
但是,如果您将每个图像转换为相同的大小,然后计算每个16 x16(或32 x32,64 x64等)中的平均颜色,则会出现以下情况:取决于你希望使用多少处理时间/功率)单元,你应该能够形成某种合理的(-ish)比较。

hec6srdp

hec6srdp2#

我建议,像middaparka一样,你不要下采样到只有1像素的图像,因为你失去了所有的空间信息。下采样到16x16(或32x32等)肯定会提供更好的结果。
然后,它还取决于颜色信息对您是否重要。据我所知,你实际上可以不使用它,从你的彩色图像开始计算灰度图像(例如:亮度)并计算互相关。如果像你说的,有几个图像完全匹配(除了颜色信息),这应该给予你一个很好的可靠性。

tyu7yeag

tyu7yeag3#

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

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

我还做了一些 benckmarking,我认为在这些小图像中不需要 * 下采样 *,因为该方法很快(是PHP),只需几分之一秒。

vm0i2vca

vm0i2vca4#

对于php 8.1或更高版本,您可以使用https://github.com/sapientpro/image-comparator库。它在引擎盖下使用Gd扩展。您还可以使用它比较多个图像。

$comparator = new SapientPro\ImageComparator\ImageComparator();

$similarity = $comparator->compare('your-images/your-image1.jpg', 'your-images/your-image12.jpg');

echo $similarity; //89.3
laik7k3q

laik7k3q5#

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

相关问题