Conversion image en couleurs données

matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006 - 6 févr. 2006 à 18:07
msaidani Messages postés 3 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 19 septembre 2008 - 19 sept. 2008 à 15:11
Bonjour,

Je souaiterais convertir une image en restreignant sa palette de couleurs à une palette de couleurs que j'ai definit.

Par exemple : j'ai une image en couleur vraie et je veux qu'elle soit recalculée en utilisant les couleur bleu vert et rouge.
Pour chaque pixel cette fonction chercherait ainsi si la couleur du pixel est plus proche du rouge, du bleu ou du vert !

C'est en fait la meme chose que de convertir une image en 256 couleurs (cas du gif par exemple) sauf que c'est moi qui donne les couleurs !

Merci beaucoup pour cette aide precieuse qui va me servir a calculer la couleur dominante d'une image de maniere fiable !

18 réponses

cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
7 févr. 2006 à 00:50
Salut,

à mon avis tu t'embarques dans un truc pas possible...

enfin y'a tellement de fonctions à proposer que vas ici : http://fr.php.net/manual/fr/ref.image.php

a +

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006
7 févr. 2006 à 07:48
Bonjour,

Dans ce cas la, je pense qu'il vaudrait mieux décomposer ma question :

Comment fait on pour calculer la distance entre une couleur et une autre ? (en code hexa par exemple)

Encore merci pour votre bonne volontée !
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 févr. 2006 à 09:07
Hello,

oui, tu peuxc t'en sortir avec les fonctions GD, mais à mon avis, ça ne va pas être facile.
Dans les fonctions GD, tu as la comparaison de couleurs, tout un tas de fonctions pour ça. Tu peux aussi récupérer la couleur d'un pixel spécifique. Tu peux aussi modifier un index de couleur dans la palette...
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
7 févr. 2006 à 09:18
"Comment fait on pour calculer la distance entre une couleur et une autre ? (en code hexa par exemple)"

c'est à dire ? la distance de quoi ? leur contraste ?

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 févr. 2006 à 09:35
Non, il veut par exemple savoir si 245, 135, 248 est plus proche du rouge, du vert, ou du bleu (là, c'est du bleu par exemple). C'est pas franchement difficile à calculer.
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
7 févr. 2006 à 10:00
bah RGB donc 255 /255 /255 c'est blanc

255 /0 /0 c'est rouge
0/ 255 /0 c'est vert
0 /0 /255 c'est bleu.

A toi de faire des pourcentages en mixant ensuite les couleurs primaires pour avoir une bonne précision. (tu pourras ainsi calculer le porcentage de rouge pur, de vert pur, etc...) A partir de ces couleurs de base tu peux calculer le pourcentage de jaune pur, etc...

Ensuite tu compares simplement tes valeurs pour déterminer la couleur secondaire dominante (car bon couleur primaire c'est pas vraiment précis à mon goût, secondaire non plus mais c'est déjà moins pire).

a +

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006
7 févr. 2006 à 12:20
Pour ce qu'il est de la distance entre des couleur je faisait allusion a un algo mathematique qui calcul la distance entre des mot (nb d'erreur). Il existe sans doute la meme chose pour les couleurs !

Autrement oui je pense que je vais essaer avec les pourcentages en ayant préalablement convertit mon image en 256 couleurs.
Ceci dit, il faut que je fasse une petite etude sur le fonctionnement des couleur.
Par exemple, pour du gris il faut que R V B.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 févr. 2006 à 13:27
Heu;..GD, comme je te le disais, te donne les couleurs, aavec leurs 3 composantes. Pourquoi tu t'emmerdes? Et GD te permet de calculer la distance entre les couleurs aussi (bon, pour une image, mais c'est anecdotique ça ).
0
matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006
7 févr. 2006 à 13:52
Ben le probleme c'est que cette fonction ne me renvoi aucun entier correspondant a la distance !
Je ne peux donc rien en faire...
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
7 févr. 2006 à 14:13
Je crois qu'on ne s'est pas compris.
En parcourant la palette de couleurs d'une image (imagecolorstotal), et en récupérant chaque index de sa palette de couleur (imagecolorsforindex), tu peux facilement voir de quelle composante cette couleur est la plus proche : je rappelle que cette fonction renvoie la valeur des 3 composantes dans un tableau : array ('red' => ??, 'green' => ??, 'blue' => ??). Et de là, réallouer avec imagecolorset.
Je suis sûr que dans les commlentaires d'une de ces fonctions, il y a déjà un script montrent un exemple pour faire ça (sur php.net).
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
7 févr. 2006 à 16:18
De toute façon c'est en train de prendre des proportions énormes pour rien, tu t'embêtes pour rien, laisse tomber si tu veux mon avis ;-)

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006
7 févr. 2006 à 18:34
Merci pour ton conseil ! ;)
En fait, je souhaitais simplement convertir mon image en 16 couleurs, palette que j'ai moi meme défini préalablement. Et donc pour chaque pixel trouver la couleur la plus proche parmi cette palette donnée.

Je comptais effectivemment me baser sur le meme principe que toi malalam sauf que je vais faire un algo de calcul de distance entre deux couleur en m'inspirant de celui de levenstein.
Puis, ensuite j'analyserais chaque pixel ou je mettrais les résultats de distance dans une table de hashage pour savoir laquelle est la plus proche.
Voila en gros ce que je vais faire !

Je posterais l'algo si vous voulez !

Encore merci !
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
7 févr. 2006 à 18:53
Ok pas de problème, et les temps de génération pour quelques images types ^^

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 févr. 2006 à 07:57
la distance de levenstein pour une distance entre 2 couleurs, quand tu en as les 3 composantes primaires ?
Ma foi, si tu veux...mais je n'en vois pas du tout l'utilité. Le code va en effet déjà être assez lourd comme ça sans lui ajouter des trucs pour le sport ;-)
0
matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006
8 févr. 2006 à 17:55
Bonjour,

Voici ma methode complete pour ceux que ca interessent.

Elle realise le calcul de couleur dominante a partir d'une palette, dit si l'image est en couleur, noir et blanc ou niveaux de gris.

Désolé, je n'est pas encore eu trop le temps de la commenter ni vraiment de la tester !

private function setCouleurs(){

$netb = true;
$niveaugris = true;
$palette = Array([0]=>Array(0,0,0), //noir
[1]=>Array(128,128,128), //gris
[2]=>Array(128,0,0), //marron
[3]=>Array(255,0,0), //rouge
[4]=>Array(0,128,0), //vertfoncé
[5]=>Array(0,255,0), //vert
[6]=>Array(128,128,0), //olive
[7]=>Array(255,255,0), //jaune
[8]=>Array(0,0,128), //marine
[9]=>Array(0,0,255), //bleu
[10]=>Array(128,0,128), //violet
[11]=>Array(255,0,255), //fuchsia
[12]=>Array(0,128,128), //cobalt
[13]=>Array(0,255,255), //aqua
[14]=>Array(192,192,192),//argent
[15]=>Array(255,255,255),//blanc
[16]=>Array(255,128,0) //orange
);


for ($i=1 ; $i < ImageSX($this->miniatureNonReechantillonnee) ; $i++) {
for ($j=1 ; $j < ImageSX($this->miniatureNonReechantillonnee) ; $j++) {

$pixel = ImageColorAt($miniatureNonReechantillonnee,$i,$j);

if ($pixel != 0 || $pixel != 255255255) $netb = false;

$r = ($pixel >> 16) & 0xFF;
$v = ($pixel >> 8) & 0xFF;
$b = $pixel & 0xFF;

if ($r != $v || $v != $b || $r != $b) $niveaugris = false;
$distMin = 1000;
for ($k=0 ; $k < count($palette) && $disMin != 0 ; $k++) {
$distance = pow($palette[$k][0] - $r,2) + pow($palette[$k][1] - $v,2) + pow($palette[$k][2] - $b,2);
if ($distance < $distMin){$disMin $distance;$indCoulProche $k;}
}
$paletteDom[$indCoulProche]++;

}
}

$max = 0;
foreach ($paletteDom as $key => $val)if ($val > $max)$this->couleurDominante = $key);
$this->couleurDominante = $this->couleurDominante[0].$this->couleurDominante[1].$this->couleurDominante[2];

if ($netb)$this->coloration = 1;
else if ($niveaugris)$this->coloration = 2;
else $this->coloration = 3;

}
0
cs_Anthomicro Messages postés 9433 Date d'inscription mardi 9 octobre 2001 Statut Membre Dernière intervention 13 avril 2007 8
8 févr. 2006 à 22:06
"for ($i=1 ; $i < ImageSX($this->miniatureNonReechantillonnee) ; $i++) {
for ($j=1 ; $j < ImageSX($this->miniatureNonReechantillonnee) ; $j++) {"

tu fais deux appels de fonction à chaque tour de boucle, en plus c'est imagesx et imagesy (là tu te gourres)

$largeur=imagesx($this->miniatureNonReechantillonnee);
$hauteur=imagesy($this->miniatureNonReechantillonnee);

for ($i=1 ; $i < $largeur ; $i++) {
for ($j=1 ; $j < $hauteur ; $j++) {

et encore des while seraient préférables avec des $i++ dedans.

a +

<hr size="2" width="100%"><li>Entraide, dépannage et vulgarisation informatique : Mon site de vulgarisation informatique</li><li>Codes-php.net</li>
0
matique Messages postés 18 Date d'inscription samedi 4 février 2006 Statut Membre Dernière intervention 12 avril 2006
9 févr. 2006 à 18:10
Merci pour ta remarque !
Je l'avais carrement oublié dans mes corrections !

Je suis en plein dans mes test et je me rend compte que fonction ImageColorAt fonctionne bizzaremment.
Elle me renvoi 0 soit la couleur noir au lieu de la couleur orange !

orange.gif est une image d'un pixel de couleur orange

Voici mon code de test :
$imageSource = ImageCreateFromGif('orange.gif');
$pixel = ImageColorAt($imageSource,0,0);
echo $pixel; // renvoi 0 ???????

Savez vous d'ou vient le probleme ?
0
msaidani Messages postés 3 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 19 septembre 2008
19 sept. 2008 à 15:11
As tu finis ton fameux programme cela m interesse !!!!!!!!!!
Cordialement
Mystaire
0
Rejoignez-nous