Recherche de motif dans une image

Description

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

Codes Sources

A voir également

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.

Du même auteur (ParseError)