我如何检测/计算如果一个小的图片存在于一个大的图片


How can I detect / calculate if a small pictures is present inside a bigger picture?

我试图在PHP中完成GD或ImageMagick如下:

我有一个大的图像(比如说2000 x 2000像素)..我想检查是否有第二个较小的图像(例如50 x 50像素)出现在较大的图像中,以及该区域匹配的百分比。例如,在大图的那个地方,有95%的小图像匹配。

这可能吗?这是如何实现的呢?

谢谢! !

我快速查看了PHP的ImageMagickGD,两者都没有内置这样做的方式。一种方法是使用ImageMagick将较大的图像划分为较小的图像(与较小的图像大小相同),并开始将它们与较小的图像进行比较。

然而,我想这将是非常缓慢的。

如果在PHP代码中使用系统调用,可以使用imagemagick实现这一点。我不知道你是否想尝试一下,但这是如何做到的:

<?php
//set a bigger time out limit because comparison takes a while
set_time_limit ( 275 ) ;
//the bigger image
$bigimage = "big.bmp";
//the smaller image
$smallimage = "small.bmp";
//result image
$resimg = "/tmp/similarity";
//system call
$output = shell_exec("(compare -metric AE -subimage-search ".$bigimage." ".$smallimage." ".$resimg."  > /dev/null) 3>&1 1>&2 2>&3");
//result is something like "0 @ 251,263"
$res = explode("@",$output);
if($res[0]==0)
{
    echo "Perfect match<br/>";
    $res = explode(",",$res[1]);
    echo "width: ".$res[0];
    echo "<br/>";
    echo "height: ".$res[1];
} else {
    echo "Not match";
}
?>

我已经在XAMPP for linux 1.7.3a和ImageMagick 6.7.1-0 2011-07-10 Q16的linux盒子中测试了上面的代码。

关于比较,我使用度量AE(绝对误差)来计算有多少像素不同。结果被打印到错误流(STERR)。关于imagemagick的子图像搜索的更多信息可以在这里找到。

祝你好运

这是c#的一个很好的答案:如何在另一个图像中找到一个图像?

虽然我很确定它也可以用于PHP,因为它只是一个通用算法,但使用PHP进行图像比较是一个非常糟糕的主意。

也可参考维基百科模板匹配文章

OK。如果你有$BigImage和$SmallImage.

并且您根据$大图像和$小图像制作$Final图像。然后您可以使用以下函数检查:http://www.php.net/manual/en/function.getimagesize.php

如果你只有$FinalImage,并且你想在$Final image中跟踪$smallimage基数,那么在PHP中"NO WAY"

Java。

^ _ ^