1

Afficher l’histogramme d’une image

24 juin 2006
par ARNO*

[SPIP 1.9 et GD2] Toujours à la recherche d’applications inédites des filtres de SPIP, je vous propose aujourd’hui de franchir une nouvelle étape : un filtre qui ne sert rigoureusement à rien !

À rien pour traiter une image, certes, mais dans une galerie de photos, ça peut produire un petit effet assez pro... Et il n’est pas impossible que, par la suite, nous trouvions un usage à la méthode développée ici1.

L’idée est d’extraire d’une photographie les informations de couleur de tous ses pixels et de les afficher dans un graphique synthétique, que l’on nomme habituellement un histogramme. Partons de l’image suivante :

elle nous donne l’histogramme suivant :

Le graphique se lit ainsi :
— en fond d’image, la courbe grise indique la répartition des niveaux de gris ;
— par dessus, trois courbes colorées indiquent les répartitions de rouge, vert et bleu ;
— pour chaque courbe, l’axe horizontal de gauche à droite parcourt les intensités de 0 à 255 ; pour le gris, par exemple, 0 est le noir, 255 est le blanc ; et verticalement, la « hauteur » de la courbe indique la densité de ce niveau de couleur, c’est-à-dire le nombre de pixels qui correspondent à ce niveau.

Par exemple, ici, pour le gris comme pour les trois composantes, on a des pics d’intensité situés aux alentours de l’intensité 200 ; ce qui signifie qu’un grand nombre de pixels ont une couleur proche du gris 78% (relativement clair, donc). On constate également qu’il n’y a quasiment pas de pixels avec des intensités supérieures à 220 ; ce qui signifie qu’il n’y a quasiment pas de pixels très clairs dans l’image (l’image n’a pas de zones très claires ou blanches).

Voici notre filtre image_histo :

La première partie détermine le nom et gère le système de cache pour l’image résultante. La seule particularité ici est que l’on travaille avec une image qui ne découle pas directement, pour ses dimensions, de l’image d’origine. C’est un graphique de taille fixe que l’on créée.

La double boucle, habituelle, parcourt l’image pixel par pixel :

On stocke les informations d’intensité dans des tableaux ($val_gris, $val_r...). À la fin de la double boucle, on détermine la valeur maximale de tous ces tableaux, de façon à pouvoir, ensuite, dessiner la valeur maximale à 127 pixels du bas de l’image.

C’est dans un deuxième temps, dans quatre boucles successives, de 0 à 255, que l’on parcourt les niveaux d’intensité pour dessiner nos quatre courbes.

Voici un autre exemple :

qui donne :

Qui êtes-vous ?
Votre message

Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.