如何检测/计算一个小图片是否存在于一张大图片中?

7
我在PHP中使用GD或ImageMagick想要实现以下功能:
我有一张大图(比如2000 x 2000像素).. 我想检查第二个小图(比如50 x 50像素)是否出现在大图的某个地方,并且匹配区域的百分比是多少。例如,在大图的某个位置有95%的匹配度。
这个可能吗?如何实现?
谢谢!!!

你是在寻找某种方法(例如:暴力破解),还是在寻找更智能的算法方法? - MoarCodePlz
您想要查找特定的较小图像(对于该图像,您拥有位图数据),还是任何一般图像都可以呢?小图像的尺寸是否已知? - lxa
基本上我正在寻找更智能的算法方法,如果在PHP中使用图像比较是可能的...我知道所有关于较小图像的信息,包括图像大小。 - Roel Krottje
小图像是大图像的简单裁剪吗?需要考虑缩放、旋转、颜色偏移吗? - Magicianeer
3个回答

4
我查看了PHP的ImageMagick和GD,它们都没有内置的方法来完成这个任务。一种方法是使用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的子图像搜索的更多信息,请访问此处
祝你好运 :)

如果图像的大小差异很大,就会出现错误“compare: images too dissimilar”。 - PeterM

1

-1

好的。

如果你有$BigImage和$SmallImage。

然后你可以基于$big和$small image制作$Final image,并使用此函数进行检查:http://www.php.net/manual/en/function.getimagesize.php

如果你只有$FinalImage,想要在$Final image中追踪$smallimage,那么在PHP上就“没有办法”了。

试试Java吧。

^_^


小图像已经存在于大图像中了,或者没有 - 这就是我需要动态检查的内容。检查这个图像是否出现在这个更大的图像中。检查那个图像是否出现在这个更大的图像中,等等。 - Roel Krottje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接