Calcul de la couleur dominante d'une image

Signaler
Messages postés
18
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
12 avril 2006
-
Messages postés
9
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2011
-
Bonjour,


Je souhaiterais calculer la couleur dominante d'une image jpg en php.


Pour cela j'ai pensé a deux solutions :


La premiere serait de parcourir l'image pixel par pixel de maniere à ranger dans un tableau chacune de ses couleurs. Mais est ce possible en php.


La seconde serait de redimentionner l'imaga en 1 pixel de maniere à récuperer sa couleur. Dans ce cas la je ne suis pas sur que cela corresponde a la couleur dominante.


Pouvez vous m'aider ? merci !

8 réponses

Messages postés
2268
Date d'inscription
mercredi 27 novembre 2002
Statut
Membre
Dernière intervention
13 septembre 2013
3
Salut!
Je sais pas pour ta 2ème idée, mais pour ta première, tu peux regarder ca:
http://php.benscom.com/manual/fr/function.imagecolorat.php

@++

R@f

Merci pour ton aide le parcours est maintenant possible.
Toutefois j'aimerais savoir s'il y a moyen de récuperer directement le tableau des couleurs plutot que de le construire car ca surchargerait moins le serveur je pense. Le temps d'execution est super important dans le cadre de mon projet !
Merci pour ton aide le parcours est maintenant possible.
Toutefois j'aimerais savoir s'il y a moyen de récuperer directement le tableau des couleurs plutot que de le construire car ca surchargerait moins le serveur je pense. Le temps d'execution est super important dans le cadre de mon projet !
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
Salut,

oublie la deuxième solution.

"La premiere serait de parcourir
l'image pixel par pixel de maniere à ranger dans un tableau chacune de
ses couleurs. Mais est ce possible en php."

ça c'est faisable mais c'est bien trop gourmand, PHP n'est absolument pas adapté pour faire ce genre de choses...

enfin bon si t'y tient quand même :

imagesx() et imagesy() d'abord pour avoir la largeur et la hauteur de l'image

deux while() pour parcourir l'image

dedans tu obtiens la couleur du pixel avec un imagecolorallocat() (cf coockiesch)

ensuite (aie aie aie gourmandise) tu peux stocker le nombre de fois que tu as trouvé la couleur dans un tableau qui regroupera les quantités.

exemple :

if(isset($tableau[$rgb]))
{
$tableau[$rgb]++;
}
else
{
$tableau[$rgb]=1;
}

$rgb représente la couleur que t'as obtenue avec imagecolorallocat()

etc... ensuite tu classes le tableau par nombre décroissant et tu prends le premier terme, et t'auras ta couleur dominante.

a +

Messages postés
18
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
12 avril 2006

Bonjour,

Merci pour votre aide !
C'est quand meme vraiment dommage d'opter pour une solution aussi gourmande !
J'ai effectivement du faire un tableau de stat avec deux for imbriqués et finir par un max du tableau pour récuperer la couleur dominante !
Enfin bon ca me permet de traiter en même temps si l'image est en niveau de gris ou noir et blanc ou couleur !
Messages postés
18
Date d'inscription
samedi 4 février 2006
Statut
Membre
Dernière intervention
12 avril 2006

Me revoila !

En fait, je compte opter pour un traitement a partir d'une miniature non reechantillonnée pour ne pas fausser les couleurs.

Mon probleme actuel est que si je veux trouver une couleur dominante significative d'une image, je dois regrouper les nuances.
En effet, une image peut être a dominante verte avec plein de nuance et peut contenir une toute petite surface de #0000FF ! Et ben avec mon algo la couleur dominante sera #0000FF !

Quels conseils me donneriez vous a ce sujet ?
Quelle fonction permet de dire quel est la couleur la plus proche d'un pixel donné parmit une liste de couleurs ?

Encore merci pour votre aide !
Messages postés
9433
Date d'inscription
mardi 9 octobre 2001
Statut
Membre
Dernière intervention
13 avril 2007
9
oulà, tu m'en demandes trop là, PHP n'étant pas fait pour faire du graphisme, c'est déjà pas mal, mais bon tout est affaire de maths après, tu n'as qu'à découper ton image en carrés (plus les carrés sont petits et plus ça sera précis jusqu'à une certaine limite) puis ensuite en carrés plus grands en prenant la couleur dominante de chaque carré pour en calculer ensuite la couleur dominante générale, mais bon ...

Messages postés
9
Date d'inscription
vendredi 13 novembre 2009
Statut
Membre
Dernière intervention
27 juin 2011

Coucou !

Je sais, je vais up un topic sur trois ans, j'ai honte :P

Mais au moins ça peut créer une indication pour les visiteurs suivants ^^...

Mes connaissances en PHP sont sommaires mais j'ai une petite idée sur la chose.

Déjà tu redimensionnes ton image en 100*100, comme ça tu conserves la rapidité du calcul (ton array ne fera "que" (XDD) 10 000 entrées), ensuite tu crées trois autres tableaux, qui enregistrent
hexdec(substr($valeurarray[x], 0, 2));
hexdec(substr($valeurarray[x], 2, 2));
hexdec(substr($valeurarray[x], 4, 2));
(où valeurarray[x] est ton premier tableau)
Comme ça tu obtiens la liste de chaque type de couleur en RGB

Il ne te reste plus qu'à créer trois variables qui feront la somme de chacunes des entrées de tes trois nouveaux arrays, tu divises par 10 000 (nombre d'entrées) comme ça tu obtiens la moyenne de chaque couleur dans l'image, et il te suffit donc de remettre tes données en hexadécimal, créer une nouvelle variable qui contient la moyenne de chaque type de couleur (si tu comprends ><) et tu as ta couleur dominante.


Exemple avec une image en 2x2 => couleurs : #11aaff, #88ddee, #995511, #aaeecc

tu vires les dièses avec un simple if (substr($couleur,0,1)=="#") $couleur=substr($color,1,6);

Tu crées un premier tableau, qui contient en [0] = 11aaff, [1]88ddee etc etc

Tu convertis tes couleurs en RGB (plus facile pour le traîtement des données), via des fonctions qu'on trouve un peu partout sur le net (tape PHP convertir HEX RGB)

Ensuite avec ce que j'ai écrit au dessus, tu crées trois nouveaux tableaux qui contiennent les valeurs R, G et B
couleurR
couleurG
couleurB

tu fais la somme des couleurR[x], la somme des couleurs couleurG[x], et des couleurC[x]
tu les enregistres dans des simples variables numériques

Tu divises tes variables par le nombre d'entrées dans le tableau (ici ça serait 4)

Et tu obtiens la valeur moyenne de R, de G et de B de ton image
Tu crées donc une nouvelle variable avec "$MoyenneCouleurR$MoyenneCouleurB$MoyenneCouleurB" => ta couleur dominante ^^...