Recherche de motif dans une image

Soyez le premier à donner votre avis sur cette source.

Vue 5 512 fois - Téléchargée 297 fois

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

Ajouter un commentaire

Commentaires

TheSin
Messages postés
331
Date d'inscription
mardi 12 novembre 2002
Statut
Membre
Dernière intervention
10 février 2009
-
Salut
J'ai pas testé, mais je pense que remplacer simplement "sqrt(pow((a-b),2)" par "abs(a-b)" devrait légèrement accélérer le script et surtout le rendre légèrement plus compréhensible et simple pour ce calcul.
TheSin
Messages postés
331
Date d'inscription
mardi 12 novembre 2002
Statut
Membre
Dernière intervention
10 février 2009
-
oups, j'ai rien dit, j'ai mal lu le calcul .... honte à moi, désolé.
ParseError
Messages postés
6
Date d'inscription
mardi 9 février 2010
Statut
Membre
Dernière intervention
29 mars 2010
-
Pas grave ;-)
Les améliorations peuvent déjà porter sur des vérifications des effets de bord, à savoir que s'il ne reste que 10 pixels a droite, il ne sert a rien de vérifier si un motif de 20 pixels de large débute à cet endroit (à moins qu'on veuille gérer les motifs incomplets, mais c'est une autre histoire).

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)