Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
398 views
in Technique[技术] by (71.8m points)

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

What I am trying to accomplish in PHP with GD or ImageMagick is the following:

I have one large image (say 2000 x 2000 pixels).. I would like to check if a second, smaller image (say 50 x 50 pixels) appears somewhere inside the larger picture, and to what percentage the area is a match.. So, for example, there's a 95% match of the smaller image at that place in the larger image..

Is this possible? How could this be achieved?

Thanks!!!!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I had a quick look in PHP's ImageMagick and GD and neither has a built in way of doing that. An approach could be to use ImageMagick to divide the larger image to smaller ones(same size as the smaller one) and start comparing them to the smaller one.

However this will be very slow I suppose.

You can do that with imagemagick if you use a system call in your PHP code. I don't know if you want to try this out but here is how it can be done:

<?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";
}

?>

I have tested the above code in a linux box with XAMPP for Linux 1.7.3a and ImageMagick 6.7.1-0 2011-07-10 Q16.

About the comparison I use the metric AE(Absolute Error) which counts how many pixels differ. The result is printed to the error stream(STERR). More about imagemagick's subimage search you can find here.

Good luck :)


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...