2012-11-21 79 views
0

我想比较PHP中的两幅图像。如果他们是95%或以上相似,那么结果应该只是显示文字是。如果他们不相似的结果应该是 没有。所以比较PHP中的两幅图像

if () 
{ 
echo "Yes"; 
} 
else 
{ 
echo "No"; 
} 

任何方式这是迄今为止我所发现的。 http://pastebin.com/wgeu2DqE 我想给你我在哪里找到它,但你必须注册。

现在我有这个功能加载图像

function LoadPNG($imgname) 
{ 
    /* Attempt to open */ 
    $im = @imagecreatefrompng($imgname); 

    /* See if it failed */ 
    if(!$im) 
    { 
     /* Create a blank image */ 
     $im = imagecreatetruecolor(150, 30); 
     $bgc = imagecolorallocate($im, 255, 255, 255); 
     $tc = imagecolorallocate($im, 0, 0, 0); 

     imagefilledrectangle($im, 0, 0, 150, 30, $bgc); 

     /* Output an error message */ 
     imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc); 
    } 

    return $im; 
} 

我一直想在我的记事本+ +和phpdesigner拿出的东西,但我得到的错误。我不是一个PHP开发人员,所以我正在寻求你们的帮助。我只需要比较两张图片,然后选择是或否。所以这很简单。我也看到了这一点,但没有意义。

Compare 2 images in php

感谢。

+1

我认为图像识别库是你最好的选择。根据您如何定义比较条件,比较图像可能非常复杂。 – RonaldBarzell

+1

“95%以上相似”?我们需要一个“类似”的可靠定义 –

+0

你知道,像班上的人写的东西(pastebin链接)。如果差值是0.95或以上,它们是相同的。如果不是,他们不是。如果你有更好的方式请告诉我。解释图像识别库? – macroscripts

回答

1

您可以通过几种方式进行比较,具体取决于您想要的比较类型和用例。 “相似”是一个非常含糊的术语。

有图像比较库,或者您可以使用ImageMagick函数。甚至还有一个用于PHP的OpenCV的绑定。

当然,这种方法越复杂,结果就越灵活,越好。

如果您比较两幅应该相等但不相等的图像(例如,两个监控摄像头框架),则可以使用下面给出的DIY方法。

如果色调和光度(如噪音)有变形,那么DIY方法将不起作用,但ImageMagick会给出好的结果。

最后,如果您尝试映射同一对象的两个视图,例如,从一只脚向左移动的摄像头,或者您正在寻找另一个“内部”的图像等,那么OpenCV是三者中唯一可行的替代方案。

一个自己动手的方法,对于最简单的情况,可能是首先检查两个图像的宽高比,然后减少到相同的大小(你可以进一步减少它们(比如说,缩放1:4)过滤掉小差异和/或减少前面的工作)。

在这一点上,您可以使用getColorAt(也可以选择转换为灰度忽略色调差异)逐个像素地比较两个图像。两个像素之间的距离也可以通过多种方式进行计算(例如使用CIE perceptual functions),或者您可以使用欧几里德距离 - SQRT((r1-r2)* 2 +(g1-g2) * 2 +(b1-b2 )** 2)。

距离范围从0到W * H * 255 * SQRT(3);您可以将这些值线性映射到0-100%的范围。

这可以很容易地告诉你一个图像和相同的图像之间的区别,其上绘制了一些线条。如果你扭曲了图像(例如用一个“捏”过滤器),或者旋转一点,结果图像将会出现95%甚至99%的相同,然而这种算法可能报告很低的匹配(对于照片质量的图片,连续调,比赛依然会很好。对于漫画,这将是非常可怜的)。

+0

现在我看到我应该提到我正在处理的图像的质量。事情是我没有这样做高科技的东西,如相机框架。我这样做是因为我需要在我的电脑上比较两个简单的png图像。其他程序语言失败了,所以PHP原来是最简单的解决方案。 我见过有关imagemagic的一些内容,但无法制作出一些东西。有没有简单的代码就像我在这里可以工作。 http://pastebin.com/wrsFBG8u 我设法写这个,但我有一些错误,无法修复它们。那么这个怎么样? – macroscripts

+0

你的'imagehex()'函数将一个数组作为参数,但是你提供了一个从'LoadPNG'中取得的GD对象。 'imagehex()'似乎表现得好像它期望的图像路径一样,除了'getImageSize()'不能使用'type'。代码足以提出另一个问题(评论对于答案来说还不够),但我认为你甚至可能不需要这个问题。尽管如此,可以在(我的用户名)(gmail)上与我联系。我不清楚你的第二个循环。 – LSerni

+0

我发现了一个对我来说足够好的解决方案。我做了两个图像的MD5检查,它的工作。这对我来说足够了。 谢谢你们。并请有人评价我的帖子,以便我可以得分。 15点的限制阻止了我做更多的工作。 – macroscripts