2011-07-13 23 views
6

Lo que estoy tratando de lograr en PHP con GD o ImageMagick es el siguiente:¿Cómo puedo detectar/calcular si hay una imagen pequeña dentro de una imagen más grande?

Tengo una imagen grande (digamos 2000 x 2000 píxeles) .. Me gustaría comprobar si una segunda imagen más pequeña (digamos 50 x 50 píxeles) aparece en algún lugar dentro de la imagen más grande, y en qué porcentaje del área es un partido .. Así, por ejemplo, hay una coincidencia del 95% de la imagen más pequeña en ese lugar en la imagen más grande ..

es esto posible? ¿Cómo se puede lograr esto?

Gracias !!!!

+0

¿Está buscando cualquier enfoque (es decir: la fuerza bruta) o está buscando un enfoque algorítmico más inteligente? – MoarCodePlz

+0

¿Desea buscar una imagen más pequeña específica (para la que tiene datos de mapa de bits), o simplemente cualquier imagen genérica? ¿Se conoce o no el tamaño pequeño de la imagen? – lxa

+0

Básicamente estoy buscando un enfoque algorítmico más inteligente, si esto es posible en PHP con la comparación de imágenes ... sé todo, incluyendo el tamaño de la imagen, de la imagen más pequeña. –

Respuesta

1

Aquí es una buena respuesta para C#: How to find one image inside of another?

Aunque estoy bastante seguro de que se puede utilizar para PHP también, porque es sólo un algoritmo genérico que es muy mala idea usar PHP para la comparación de imágenes.

Consulte también el artículo de Wikipedia Template match.

0

OK. Si tiene $ BigImage y $ SmallImage.

Y usted hace una base de imagen de $ Final en imágenes $ big y $ small. Luego puede verificarlo con esta función: http://www.php.net/manual/en/function.getimagesize.php

Si solo tiene $ FinalImage, y desea rastrear $ smallimage base en $ Imagen final, entonces "NO WAY" en PHP.

Pruebe Java.

^_^

+0

Bueno, la imagen pequeña ya está presente en la imagen grande ... o no, eso es lo que tengo que comprobar dinámicamente. Comprueba si esta imagen aparece en esta imagen más grande. Comprueba si esa imagen aparece en esta imagen más grande, etc. –

+0

lata No lo hagas en PHP, hermano. –

4

Tenía una mirada rápida en PHP ImageMagick y GD y tampoco se ha construido en forma de hacerlo. Un enfoque podría ser utilizar ImageMagick para dividir la imagen más grande en otras más pequeñas (del mismo tamaño que la más pequeña) y comenzar a compararlas con la más pequeña.

Sin embargo, supongo que será muy lento.

Puede hacer eso con imagemagick si utiliza una llamada al sistema en su código PHP. No sé si quieres probar esto, pero aquí es cómo se puede hacer:

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

?> 

He probado el código anterior en una máquina Linux con XAMPP 1.7.3a para Linux y ImageMagick 6.7. 1-0 2011-07-10 P16.

Sobre la comparación utilizo el AE métrica (error absoluto) que cuenta cómo difieren muchos píxeles. El resultado se imprime en la secuencia de error (STERR). Más sobre la búsqueda de subimagen de imagemagick puede encontrar here.

Buena suerte :)

+0

Esto es realmente útil ... !!!! Muchas gracias.! –

+0

Si la diferencia de tamaño de las imágenes es alta, esto terminará con el error "comparar: imágenes demasiado dispares" – PeterM

Cuestiones relacionadas