Ce script permet de rechercher un motif dans une image.
On lui donne deux images : le motif, et l'image dans laquelle chercher.
Il renvoie en retour un tableau contenant les coordonnées (de l'image dans laquelle on recherche) qui sont les points d'origine où le motif est présent; ainsi qu'un delta « d » représentant un indice de différence (plus il est faible, plus le risque d'erreur est faible).
De nombreuses améliorations sont possibles, notamment en terme de vitesse d'exécution, je suis ouvert à toute évolution.
Plus d'infos à venir sur
http://www.parse-error.com
Source / Exemple :
<?php
/**
- Recherche de motif dans une image
*
// Retourne la différence entre deux points RGB (plus la différence est proche de 0, plus les points sont similaires)
function returnDiff($p1Red,$p1Green,$p1Blue,$p2Red,$p2Green,$p2Blue)
{
return sqrt(pow(($p1Red - $p2Red),2) + pow(($p1Green - $p2Green),2) + pow(($p1Blue - $p2Blue),2) );
}
// Recherche de motif
function rechercheMotif($img_motif, $img_origine, $indice)
{
$image_motif = imagecreatefromjpeg($img_motif);
$image_org = imagecreatefromjpeg($img_origine);
// Récuparation des dimensions des images
$x_motif=imagesx($image_motif);
$y_motif=imagesy($image_motif);
$x_org=imagesx($image_org);
$y_org=imagesy($image_org);
// On mappe le motif et on stocke ses composantes
for($cpt_x=0;$cpt_x<$x_motif;$cpt_x++)
{
for($cpt_y=0;$cpt_y<$y_motif;$cpt_y++)
{
$color_index = imagecolorat($image_motif, $cpt_x, $cpt_y);
$color_translate = imagecolorsforindex($image_motif, $color_index);
$tab_motif[$cpt_x][$cpt_y]['R'] = $color_translate['red'];
$tab_motif[$cpt_x][$cpt_y]['G'] = $color_translate['green'];
$tab_motif[$cpt_x][$cpt_y]['B'] = $color_translate['blue'];
}
}
// On mappe l'image et on stocke ses composantes
for($cpt_x=0;$cpt_x<$x_org;$cpt_x++)
{
for($cpt_y=0;$cpt_y<$y_org;$cpt_y++)
{
$color_index = imagecolorat($image_org, $cpt_x, $cpt_y);
$color_translate = imagecolorsforindex($image_org, $color_index);
$tab_org[$cpt_x][$cpt_y]['R'] = $color_translate['red'];
$tab_org[$cpt_x][$cpt_y]['G'] = $color_translate['green'];
$tab_org[$cpt_x][$cpt_y]['B'] = $color_translate['blue'];
}
}
$compteur=0;
// On parcourt l'image d'origine
for($cpt_y_org=0;$cpt_y_org<$y_org;$cpt_y_org++)
{
for($cpt_x_org=0;$cpt_x_org<$x_org;$cpt_x_org++)
{
// Pour chaque point de l'image d'origine, on vérifie la probabilité qu'il soit le point d'origine (0,0) du motif
$total_diff=0;
for($cpt_y_motif=0;$cpt_y_motif<$y_motif;$cpt_y_motif++)
{
for($cpt_x_motif=0;$cpt_x_motif<$x_motif;$cpt_x_motif++)
{
// Calcul de l'indice de différence
$total_diff+=returnDiff($tab_motif[$cpt_x_motif][$cpt_y_motif]['R'],$tab_motif[$cpt_x_motif][$cpt_y_motif]['G'],$tab_motif[$cpt_x_motif][$cpt_y_motif]['B'],$tab_org[$cpt_x_org+$cpt_x_motif][$cpt_y_org+$cpt_y_motif]['R'],$tab_org[$cpt_x_org+$cpt_x_motif][$cpt_y_org+$cpt_y_motif]['G'],$tab_org[$cpt_x_org+$cpt_x_motif][$cpt_y_org+$cpt_y_motif]['B']);
}
}
// Si l'indice de différence est inférieur à la valeur de l'indice de tolérance, on considère que le motif a été trouvé
if($total_diff<$indice)
{
$compteur++;
$result[$compteur]['x']=$cpt_x_org;
$result[$compteur]['y']=$cpt_y_org;
$result[$compteur]['d']=$total_diff;
}
}
}
if(isset($result))
{
return $result;
}
}
// Appel de la fonction de recherche (50= tolérance de recherche, plus le nombre est faible, moins la recherche est tolérante).
$resultTab=rechercheMotif('motif.jpg','image.jpg', 50);
if(is_array($resultTab))
{
echo '<pre>'.print_r($resultTab,true).'</pre>';
}
?>
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.