Comparer deux images et voir leurs différences

Soyez le premier à donner votre avis sur cette source.

Vue 70 666 fois - Téléchargée 1 624 fois

Description

bonjour

Voici un petit script tres simple, qui permet de comparer deux images pixel par pixel, et qui génére deux images de resulat:
- la première indique par un gradiant de couleur la difference entre pixel ( plus 2 pixels sont eloigné, plus le gradient sera élevé)
- la deuzième affiche tous les pixels differents par un pixel noir, et les identiques par un blanc.

ce script est utile pour decripter une steganographie par exemple .... ou jouer au jeu des 7 erreurs lol

je l'ai codé rapidement, donc désolé s'il y a des erreurs de conventions

le zip contient le code présenté si dessous, et 2 images pour le tester

Source / Exemple :


<?php

$action = $_POST['action'];

//fonction pour le calcul du temps d'affichage
function getmicrotime(){ 
    list($usec, $sec) = explode(" ",microtime()); 
    return ((float)$usec + (float)$sec); 
   }
$debut = getmicrotime();

//generateur de chaine de caractere aleatoire, servant a l'attibution des nom des images
function alea_string($caract_max = "10"){
$chaine="";
$caract = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

for ($i=0; $i < $caract_max; $i++) $chaine .= $caract[rand(0, count($caract)-1)];
return $chaine;
}

// fonction de comparaison
function comparaison_img($img1, $img2){

$im1 = ImageCreateFromPng($img1);
list($width_img1,$height_img1) = getimagesize($img1);

$im2 = ImageCreateFromPng($img2);
list($width_img2,$height_img2) = getimagesize($img2);

$width = ($width_img1 > $width_img2)?$width_img1:$width_img2;
$height = ($height_img1 > $height_img2)?$height_img1:$height_img2;

$image_resultat_1 = imagecreatetruecolor($width,$height);
$image_resultat_2 = imagecreatetruecolor($width,$height);

$diff_totales = 0;

for ($x=0;$x<$width;$x++) {
  for ($y=0;$y<$height;$y++) {

$rgb_img1 = ImageColorAt($im1, $x, $y);
$r_img1 = ($rgb_img1 >> "16") & 0xFF;
$g_img1 = ($rgb_img1 >> "8") & 0xFF;
$b_img1 = $rgb_img1 & 0xFF;

$rgb_img2 = ImageColorAt($im2, $x, $y);
$r_img2 = ($rgb_img2 >> "16") & 0xFF;
$g_img2 = ($rgb_img2 >> "8") & 0xFF;
$b_img2 = $rgb_img2 & 0xFF;

$r = 255 - abs($r_img1 - $r_img2) ;
$g = 255 - abs($g_img1 - $g_img2) ;
$b = 255 - abs($b_img1 - $b_img2) ;

//resultat 1 : image par gradiant

 $color_resultat_1 = imagecolorallocate($image_resultat_1,$r,$g,$b);
 imagesetpixel($image_resultat_1, $x, $y, $color_resultat_1);

//resultat 2 : image N/B des différences

if($r_img1 != $r_img2 or $g_img1 != $g_img2 or $b_img1 != $b_img2) {
$color_resultat_2 = imagecolorallocate($image_resultat_2, "0", "0", "0");
$diff_totales++;
}else $color_resultat_2 = imagecolorallocate($image_resultat_2, "255", "255", "255");

 imagesetpixel($image_resultat_2, $x, $y, $color_resultat_2);

  }
 }
  

// génération d'un nom pour les images de resultat
$nom_img_resultat = alea_string();

//repertoir de stockage des images de resultat:
$rep_img_result = "images/";
  
  
imagepng($image_resultat_1, $rep_img_result . $nom_img_resultat.'_1.png'); 
imagepng($image_resultat_2, $rep_img_result . $nom_img_resultat.'_2.png');

$return = array(
"resultat_1" => $rep_img_result . $nom_img_resultat.'_1.png',
"resultat_2" => $rep_img_result . $nom_img_resultat.'_2.png',
"diff" => $diff_totales
);

return $return;
}

//systeme d'upload
switch ($action){

	case "upload":
	
// Repertoire cible
$target = "upload/";  
// Taille max en octets du fichier
$max_size = "1000000";
// Largeur max de l'image en pixels
$width_max = "200";
// Hauteur max de l'image en pixels
$height_max = "200";

$extensions_ok = array("jpg","gif","png","jpeg");

$error_1 = 0;
$error_2 = 0;

$nom_fichier_enregister = alea_string();

for($nb_img = 1; $nb_img <= 2; $nb_img++){

${'nom_file_' . $nb_img}   = $_FILES['image_'.$nb_img]['name'];
${'taille_' . $nb_img}     = $_FILES['image_'.$nb_img]['size'];
${'tmp_' . $nb_img}        = $_FILES['image_'.$nb_img]['tmp_name'];
${'chemin_' . $nb_img}     = $target.$nom_fichier_enregister.'_'.$nb_img;

$extension  = substr(${'nom_file_' . $nb_img},-3); 

if(${'nom_file_' . $nb_img})
  {
    if(in_array(strtolower($extension),$extensions_ok))
    {
        $infos_img = getimagesize(${'tmp_' . $nb_img} );

        if(($infos_img[0] <= $width_max) && ($infos_img[1] <= $height_max) && (${'taille_' . $nb_img} <= $max_size))
        {
            if(move_uploaded_file(${'tmp_' . $nb_img},${'chemin_' . $nb_img}))
            {

                echo '<p>Image  '.$nb_img.' uploadée avec succès !</p>';
                echo '<ul><li>Fichier : '.${'nom_file_' . $nb_img}.'</li>';
                echo '<li>Taille : '.${'taille_' . $nb_img}.' Octets</li>';
                echo '<li>Largeur : '.$infos_img['0'].' px</li>';
                echo '<li>Hauteur : '.$infos_img['1'].' px</li></ul>';
               
            } else { 
			echo '<p>Problème lors de l\'upload de l\'image '.$nb_img.' !</p>';
			${'error'.$nb_img} = 1;
			}
        } else {
		echo '<p>Erreur dans les dimensions ou taille de l\'image  '.$nb_img.'!</p>';
		${'error'.$nb_img} = 1;
		}
	}else {
	echo '<p>Votre image  '.$nb_img.' ne comporte pas une extension valide !</p>';
	${'error'.$nb_img} = 1;
	}
		
   } else {
   echo '<p>Le champ du formulaire de l\image '.$nb_img.' est vide !</p>';
   ${'error'.$nb_img} = 1;
   
}
}

if ($error_1 == 0 && $error_2 == 0) echo "<br /><form action=\"". $PHP_SELF ."\" method=\"post\" name=\"comparer\"><input name=\"action\" type=\"hidden\" value=\"compare\"><input name=\"img1\" type=\"hidden\" value=\"".$nom_file_1."\"><input name=\"img2\" type=\"hidden\" value=\"".$nom_file_2."\"><input name=\"\" type=\"submit\" value=\"Comparer les deux images\"></form><br />";
else echo "<br /><form action=\"". $PHP_SELF ."\" method=\"post\" name=\"error\"><input name=\"\" type=\"submit\" value=\"Une erreur est survenu durant le traitement d'une des images. Veuillez recommencer\"></form><br />";

break;

//appel de la fonction de comparaison
	case "compare":
$comparaison_img1_img2 = comparaison_img($_POST['img1'], $_POST['img2']);

echo "<p>
Image d'origine 1 : <br />
<img src=\"".$_POST['img1']."\" /><br />
</p>
<hr>
<p>
Image d'origine 2 : <br />
<img src=\"".$_POST['img2']."\" /><br /><br />
</p>
<p>

<h3>Résultat d'analyse</h3>

<fieldset><legend>Resultat 1: Image par gradients de difference</legend>
<img src=\"".$comparaison_img1_img2['resultat_1']."\" />
</fieldset>

<fieldset><legend>Resultat 2: Image Noir et Blanc des différences</legend>
<img src=\"".$comparaison_img1_img2['resultat_2']."\"/>
</fieldset>
<br />
Différences comptabilisée: ".$comparaison_img1_img2['diff']."

</p>";

break;

//defaut, formulaire d'upload des images

default:

echo "<form enctype=\"multipart/form-data\" action=\"". $PHP_SELF ."\" method=\"POST\">
<input type=\"hidden\" name=\"action\" value=\"upload\">
<p>Envoyer l'image 1 :</p>
<input name=\"image_1\" type=\"file\">
<p>Envoyer l'image 2 :</p>
<input name=\"image_2\" type=\"file\"><br />

<input type=\"submit\" value=\"Uploader\">
</form>";

}

//affichage du temps de génération de la page
echo "<div align=\"center\">Page générée en ".round( getmicrotime() - $debut, 3) ." secondes</div>";

?>

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

cs_manouille
Messages postés
73
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
22 juin 2007
-
ca a l'air simpa.
Est ce que tu crois que ce script pourrait servir de base (je dis bien de base) à la création d'un moteur de recherche d'image.
Ex On envoie une image et on cherche d'autre images ressemblant a celle qu'on a posté.
franco_se
Messages postés
151
Date d'inscription
samedi 1 novembre 2003
Statut
Membre
Dernière intervention
30 juillet 2018
-
Je doute avec cette methode, car elle verfifie les difference entre 2 pixels d'une meme coordonnée. Ainsi, dans l'exemple du zip, j'ai pris 2 images, dons l'une été décalée d'un pixel a gauche. Bien qu'identiques, le script a comptabilisé plus de 5000 pixels differents.
pour un moteur de recherche d'image, je pense qu'il faudrais pouvoir "superposer" les images, les centrer de manière a comptabiliser le moins de differences, puis analyser les 2 images .....
a moins d'utiliser un "systeme de mire", un point, ayant une valeur RGB precise, et de l'ituliser pour centrer les 2 images .... mais la, la moindre variation de sa valeur le ferait passé inapercu ...... sauf si l'on cherche dans une gamme de valeurs (par ex, R à +-5, G+-5 et B+-5 ) ......

faudrais y reflechir ........
cs_manouille
Messages postés
73
Date d'inscription
vendredi 29 août 2003
Statut
Membre
Dernière intervention
22 juin 2007
-
oui effectivment je me suis un avancé, de plus je n'ai pas pris le temps de regarder ton script, mais j'ai bien aimé l'idée.
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

j'aime bien, c'est très sympa, et simple.
Avec une fonction, ça eut été mieux :-)
cs_jean84
Messages postés
450
Date d'inscription
jeudi 26 août 2004
Statut
Membre
Dernière intervention
5 mars 2009
-
Salut !

C'est impressionant d'arriver a un tel resultat avec si peu de code ! Franchement rien que pour sa bravo !
Par contre je n'ai pas compris a quoi tu faisait reference quand tu parle de gradiant ? Kesako ?

Merci !!

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.