IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Traitement d'images Discussion :

voir si une couleur est foncièrement différente d'une autre [php]


Sujet :

Traitement d'images

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut voir si une couleur est foncièrement différente d'une autre [php]
    Bonjour, et désolé d'être encore là.

    J'ai un nouveau problème, et après m'être cassé les dent dessus pendant un moment je reviens vers vous ^^.

    Voila: j'ai une image représentant une personne sur un fond de ciel.
    donc: le ciel est bleu, la personne est plutôt rose.

    Je voudrais pouvoir avoire si le ratio rouge/vert/bleu et en fait, voir si il est différent.

    En gros, je voudrai avoir la couleur pure de l'image

    Comme ça, si le ciel est très foncé en haut (000001) et très clair en bas, (fffffe) ce la ne fera pas de différence.


    ne autre façon d'expliquer: je voudrai pouvoir considerer une couleur sans tenir compte de son degré d'éclairage.

    Merci

  2. #2
    Membre régulier Avatar de O( N )
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2006
    Messages : 126
    Points : 120
    Points
    120
    Par défaut ?
    Je n'ai pas tout compris !

    Tu veux un référent à ton image ! (par exemple la moyenne)
    tu additionnes tous tes bleus entre eux et tu les divises par le nombre de pixels de l'image.
    => moyenne des bleus de même avec les autres couleurs !

    Est-ce la réponse à une question que je ne crois pas avoir comprise ?
    Dans la vie il faut se cultiver ! Je suis développeur,
    je cultive des bogues.

    Citer c'est avouer qu'on a les mêmes idées que d'autres
    sans être capable de faire des phrases soit même ! - moi

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    modèle HSL et non RGB...

    tu te fous de la luminosité (L). Et tu cherches les mêmes Hue et Saturation.
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  4. #4
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    +1.

    Comme deja dit dans un post précédent, tu dois calculer une valeur de couleur independante de la luminosité.

    Donc en prenant les composantes H, S et L et en calculant la teinte T comme suit:

    si S est faible (<20%):
    -> la teinte est entre Noir (L=0) et blanc (L=100%).

    sinon (S>=20%)
    -> la teinte est entre Rouge (H=0°) et Violet (H=360°).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  5. #5
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Points : 9 860
    Points
    9 860
    Par défaut
    Bonjour,

    dans ce genre de situation, il faut en général changer de repère de couleur. IL faut préférer HLS ou LAB (un grand standart de l'industrie). Les adjacences entre couleurs sont plus évidentes.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    Merci.

    J'avais en effet pensé qu'il fallait changerde composante.
    Mais est-ce que vous connaissez une méthode pour le faire.

    Car en fait, j'en ai trouvé plein sur le net (et qui n'aboutissent pas au même résultats, soi dit en passant ) mais elles ont toute un gros défaut: elle font entre 15 et 30 lignes de codes.

    Or je code en php, et donc je dois essayer de restreindre au maximum ce traitement, surtout quand je parcours tous les pixels d'une image ( si elle fait 1000 * 1000, ça fait un millions de traitement. C'est a dire que si je rajoute un if, le temps est sensiblement plus grand. Inutile de préciser que dans ce genre de cas l'écriture dans la boucle se fait sans commentaires.)

    Merci pour votre aide.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    Bon, en farfouillant sur le net, j'ai trouvé un peu ce qu'il me fallait:

    Cette fonction prend en paramètre les composante rouge/vert/bleu d'une image et renvoi des composants hsv.

    function image_rgb2hsv ($R,$G,$B)
    {
    $var_R = ( $R / 255 ) ; //Where RGB values = 0 ÷ 255
    $var_G = ( $G / 255 );
    $var_B = ( $B / 255 );

    $var_Min = min( $var_R, $var_G, $var_B ) ; //Min. value of RGB
    $var_Max = max( $var_R, $var_G, $var_B ) ; //Max. value of RGB
    $del_Max = $var_Max - $var_Min ; //Delta RGB value

    $V = $var_Max;
    $L = ( $var_Max + $var_Min ) / 2;

    if ($del_Max == 0) //This is a gray, no chroma...
    {
    $H = 0; //HSL results = 0 ÷ 1
    $S = 0;
    }
    else //Chromatic data...
    {
    $S = $del_Max / $var_Max;

    $del_R = ( ( ( $var_Max - $var_R ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
    $del_G = ( ( ( $var_Max - $var_G ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;
    $del_B = ( ( ( $var_Max - $var_B ) / 6 ) + ( $del_Max / 2 ) ) / $del_Max;

    if ( $var_R === $var_Max ) $H = $del_B - $del_G;
    elseif ( $var_G === $var_Max ) $H = ( 1 / 3 ) + $del_R - $del_B;
    elseif ( $var_B === $var_Max ) $H = ( 2 / 3 ) + $del_G - $del_R;

    if ( $H < 0 ) $H = $H + 1;
    if ( $H > 1 ) $H = $H - 1;
    }
    $ret["h"] = $H;
    $ret["s"] = $S;
    $ret["v"] = $V;
    return $ret;
    }

    J'ai fait des tests, et c'est bien la composante h (hue, teinte) qu'il me faut.

    Ceci dit, cette fonctions est... trop efficace pour moi, c'est a dire qu'elle calcule le hsv, alors qu'il ne me faut que le h. De fait, dans ue boucle, elle ralentit considérablement le traitement (environ trois fois plus long).

    Auriez vous une idée/méthode pour n'avoir que la composante h?

    De plus, elle renvoi une valeur comprise entre 0 et 1, c'est a dire qu'on travaille avec des virgules flottantes. Ceci n'est pas plus lourd pour l'ordinateur?

    Merci de votre aide.

  8. #8
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par bubuche87
    Auriez vous une idée/méthode pour n'avoir que la composante h?
    wikipedia

    http://en.wikipedia.org/wiki/Hue#Computing_hue_from_RGB
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    Je parle pas top anglais (en fait je suis null mais je le cache).

    Mais bon, j'ai un peu compris... enfin, surtout j'ai compris que je n'ai pas compris grand chose

    sauf ça :


    démentiellement plus simple que la fonction précédente, c'est vrai ²

    Bon, je crois que je vais encore chercher, mais que parmi les trois c'est surement la composante la plus dur a atteindre.

    sinon, c'est super génial de pouvoir manipuler les images avec leur teinte: je suis en train de faire un système a la sin city, en plus de mon système pour enlever le fond d'une image. C'est tip top cool

  10. #10
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    C'est surtout le tableau en dessous de la formule qui est "tip top cool".

    Juste une comparison a faire sur R, G et B, et puis un simple calcul (soustraction et division d'entiers).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    on avance

    bon, j'ai implémenté, mais je n'ai pas compris le truc des degrés

    function image_rgb2h ($r, $g, $b)
    {
    if ($r === $g and $g === $b) return 0;
    if ($r >= $g and $g >= $b) $h = ($g-$b)/($r - $b);
    elseif ($g > $r and $r >= $b) $h = 1 + ($r - $b)/($g - $b);
    elseif ($g >= $b and $b > $r) $h = 2 + ($b - $r)/($g - $r);
    elseif ($b > $g and $g > $r) $h = 3 + ($g - $r)/($b - $r);
    elseif ($b > $r and $r >= $g) $h = 4 + ($r - $g)/($b - $g);
    elseif ($r >= $b and $b > $g) $h = 5 + ($b - $g)/($r - $g);
    //$h *= 60;
    return $h;
    }

    C'est pas multiplié par 60, j'ai essayé
    c'est pas non plus 60%
    C'est pas modulo 60.

    sinon, quand je test avec
    255, 255, 254, j'obtiens 1
    255, 254, 255 j'obtiens 6

    autant le premier résultat est sympathique (la teinte étant codée sur cent, ça faisait 100%, ça pouvait aller pour une couleur presque blanche).

    autant le deuxième me laisse songueur... et la différence entre les deux encore plus.

    tu as une idée sur l'origine de ce problème. Null doute qu'il viens de l'histoire des degrés que je n'ai pas implémenté, mais je n'arrive pas a le comprendre.

    Merci

  12. #12
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    si si, c'est multiplié par 60°. Le résultat final est en degré et donne la position sur le cercle des teintes:



    Rouge = 0°, Vert = 120°, Bleu = 240°

    Comme je l'ai dit precedement, la composante "Teinte" seule ne permet pas de reconnaitre les "couleurs" blanc/gris/noir. D'ailleurs les formules ne sont pas calculables si R=G=B (gris). C'est pourquoi il faut aussi calculer la "Saturation" et la "Luminosité".

    Si la Saturation est faible (S<20%), on est dans une couleur du type blanc/gris/noir. Il faut regarder la Luminosité pour differencier le blanc (L=100%) et le noir (L=0%).
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 90
    Points : 50
    Points
    50
    Par défaut
    Whouuuaaaaaaouuuuuu merci pseudocode.

    Pour la saturation et la luminosité, c'est pas grave, mais merci quand même. (je le garde sous le coude si le besoin s'en fait sentir ^^).

    Bon, la je met résolu et je crois bien que c'est pour de bon



    Merci encore

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/08/2009, 18h34
  2. [VBA] La valeur d'une couleur est négative!
    Par Rodrigue dans le forum IHM
    Réponses: 8
    Dernier message: 02/12/2008, 15h13
  3. couleurs de texte différentes dans une cellule
    Par mali29 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 14/09/2007, 12h38
  4. Comment savoir si une couleur est foncée ?
    Par Alec6 dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 07/09/2007, 10h09
  5. Couleurs de liens différents sur une même page
    Par traderpierre dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 21/03/2007, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo