electronika

Histogramme d’une image en php

La plupart des logiciels de retouches d’images disposent de fonctions permettant d’obtenir un histogramme d’une image suivant la luminance ou suivant les couleurs RVB.

Dans cet page nous réalisons l’histogramme de la luminance d’une image. La luminance prend une valeur différente pour chaque pixel de l’image suivant la couleur de celui-ci. La luminance est calculé avec une formule bien précise (Début de page).

Image de départ:

panneau.jpg

Traitement en php

function histogramme($file){

$key = 0;
$tab = array();
$x_dimension = 0;
$y_dimension = 0;
$image = 0;
$x = 0;
$y = 0;

//initialise le tableau (au cas ou il est des trous pour certaines valeurs)
$tab=array_fill(0, 255, ‘0′);

$image = imagecreatefromjpeg($file);
$x_dimension = imagesx($image);
$y_dimension = imagesy($image);

for ($x = 0; $x < $x_dimension; $x++) {
for ($y = 0; $y < $y_dimension; $y++) {
$key = pix_luminance($x,$y,$image);
$tab[$key]++;
}
}

// trie le tableau par ordre croissant des valeurs cles (Pas forcément nécessaire)
ksort($tab);

return $tab;
}

 Détail de la fonction:

La fonction va parcourir tout les pixels de l’image puis pour chacun de ces pixels elle va compter le nombre de pixels avec la même luminance. Il ne peut y a voir que 256 valeurs. Le tableau contient donc 256 clés avec pour chacunes une valeur correspondant aux nombres de pixels trouvés.  Afin d’éviter que l’histogramme soit déformé à cause de l’absence de pixel avec certaines valeurs de luminance on initialise chaque valeurs du tableau à 0.

La fonction retourne ensuite ce même tableau.

Pour déterminer la luminance de chaque pixels on utilise la fonction suivante:

//******************************************
// Retourne la luminance d’un pixel
//******************************************
function pix_luminance($x,$y,$image){

$luminance_running_sum=0;
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;

$luminance_running_sum = (0.30 * $r) + (0.59 * $g) + (0.11 * $b);

return $luminance_running_sum;
}

L’affichage du résultat s’effectue en utilisant la librairie spécialisé.

On passe le tableau à une autre page qui à pour rôle de réaliser le graphique sous forme d’ image.

On affiche l’image dans la page en cour comme ceci:

<img src=’histogramme_graph.php?data=”.serialize($tab).”‘>

Le tableau est sérialisé afin qu’il puisse être transmis à une autre page par la méthode GET, en clair tout passe directement dans la barre d’url.

De l’autre coté la variable $data est déserialisé afin de récupérer le tableau. Puis l’affichage se fait simplement avec la librairie artichow en appelant la classe suivant ../lib/artichow/LinePlot.class.php. (Voir les nombreux exemples sur le site artichow)

Résultat:

Les graphs sont obtenus comme toujours avec la librairie php  artichow.

resultat_histogramme_graph.png

Pour vous convaincre du résultat voici ce qu’obtient le logiciel photoshop:

histogramme_luminence_photoshop.jpg

 Les fichiers

Pour reproduire tout ceci il vous faut télécharger la librairie artichow et la placer sur votre serveur puis les 2 fichiers suivant:

histogramme.php qui contient les fonctions, c’est le fichier que vous devrez exécuter pour apercevoir l’histogramme.

Et le fichier histogramme_graph.php  qui génère l’histogramme.

Vous devrez probablement modifier le chemin de la librairie artichow dans le fichier histogramme.php

Enfin voici l’exemple ici de se que vous devriez obtenir:

Il arrive!

Les fichiers sources:

histogramme.php.txt

histogramme_graph.php.txt

panneau.jpg

En rapport avec le traitement d’images en php:

Image couleur vers noir et blanc en php

Conversion en noir et blanc d’une image en php

http://www.neophoto.fr/post/2007/02/09/Comprendre-lhistogramme-dune-photo-et-les-niveaux-sous-Photoshop

Un code plus poussé d’un histogramme multi-courbes en php qui n’utilise pas la librairie artichow:

http://www.paris-beyrouth.org/Afficher-l-histogramme-d-une-image

D’autres exemples de traitements sur le même site en php:

http://www.paris-beyrouth.org/Modifier-les-courbes-d-une-image

http://www.paris-beyrouth.org/Un-site-avec-un-grain

http://www.paris-beyrouth.org/De-saturer-une-image-en-passant-en

http://www.paris-beyrouth.org/Creer-automatiquement-une

http://www.paris-beyrouth.org/Un-filtre-de-dispersion-graphique

http://www.paris-beyrouth.org/Etendre-la-couche-alphahttp://www.paris-beyrouth.org/Corriger-les-niveaux-des-images

janvier 4th, 2009 Posted by admin | Traitement image | no comments