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 :

Détermination d'une couleur contrastée


Sujet :

Traitement d'images

  1. #81
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Bonjour,

    Ah, c'est bien qu'il y en ait qui suivent et regardent ça avec l'esprit reposé et détendu, ça leur permet de voir des choses que ceux qui sont à bloc avec tous ces nombres finissent par ne plus voir, le nez tellement sur le guidon qu'on ne sait même plus s'il existe un paysage...

    Un grand, énorme merci à toi, tbc92 !
    Le nouveau résultat en bas à droite, et même plus besoin du test de dépassement car ça ne dépasse plus

    Nom : avec00722.png
Affichages : 213
Taille : 27,7 Ko

    J'en profite pour souhaiter de bonnes vacances ou bon séminaire ou symposium ou que sais-je à l'ami wiwaxia dont je ne lui tiens aucune rigueur de son coup de gueule, il a raison, et les bourricots comme moi faut les cravacher pour les faire avancer, !

    Ceci étant dit, je me demande pourquoi on s'engraine avec ces niveaux de gris, au fait, quand le but de la manip serait d'avoir des couleurs bien contrastées !
    Allez, j'y retourne...

  2. #82
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Détermination d'une couleur contrastée
    1) Merci pour tes souhaits. Simple séjour à la campagne.

    2) En informatique, on est toujours le bourricot de quelqu'un.

    3)
    ... Ceci étant dit, je me demande pourquoi on s'engraine avec ces niveaux de gris, au fait, quand le but de la manip serait d'avoir des couleurs bien contrastées !
    À trouver la limite de part et d'autre de laquelle le blanc (ou le noir) présente le meilleur contraste sur la couleur de fond considérée.

    C'est d'ailleurs toi qui a eu la bonne idée de passer de la luminance au niveau de gris (#34 - 24/01/2017, 16h40).

    Déjà 80 réponses ! sevyc64 doit se sentir submergé.







    #34 24/01/2017, 16h40 #34

  3. #83
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Salut et bon séjour campagnard, alors
    Citation Envoyé par wiwaxia Voir le message
    Citation Envoyé par jipété
    je me demande pourquoi on s'engraine avec ces niveaux de gris, au fait, quand le but de la manip serait d'avoir des couleurs bien contrastées !
    À trouver la limite de part et d'autre de laquelle le blanc (ou le noir) présente le meilleur contraste sur la couleur de fond considérée.
    Certes, certes, c'était la demande initiale et j'avais pondu une image animée montrant que même avec une chose aussi simple qu'un texte en noir ou blanc selon le fond choisi, il n'était pas évident de trouver la bonne valeur.
    Citation Envoyé par wiwaxia Voir le message
    C'est d'ailleurs toi qui a eu la bonne idée de passer de la luminance au niveau de gris (#34 - 24/01/2017, 16h40).
    Mais maintenant, pour des besoins perso et de la curiosité, j'aimerais faire fonctionner ce bazar avec des textes colorés, et il y a encore un loooong chemin, je crois :
    Nom : 4panneauxHSL.png
Affichages : 195
Taille : 26,7 Ko

    Regardez les ovales rouges : il suffit d'un point en plus ou en moins pour avoir ou pas un texte lisible en fonction du fond : c'est la misère...

    Citation Envoyé par wiwaxia Voir le message
    Déjà 80 réponses ! sevyc64 doit se sentir submergé.
    Il attend de récolter les fruits de nos cogitations (nan, j'décon' )

  4. #84
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Déjà 80 réponses ! sevyc64 doit se sentir submergé.
    Pas tout à fait, mais c'est vrai que je lis vos réponses rapidement, un peu en travers et forcément je ne comprends pas forcément tout.

    Citation Envoyé par Jipété Voir le message
    Il attend de récolter les fruits de nos cogitations (nan, j'décon' )
    C'est pas entièrement faux

    Pour le moment, je suis passé à autre chose. Mais quand je reviendrais sur ce point, je relirais tout, prendrais le temps de comprendre et je choisirais la meilleure solution.

    Mais je suis sur que ce thread servira à beaucoup, même si on est plus tout à fait dans la demande initiale. On reste quand même dans le même domaine et en réponse à des potentielles questions voisine de la demande initiale.

  5. #85
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Bonjour,

    Les choses ont bien avancé, après une quantité astronomique d'heures de réflexions, gamberges, etc., pour savoir comment gérer l'affaire.

    Dans un 1er temps, j'ai débroussaillé à partir d'une courbe (droite !) grise (R=G=B) croissant de 0 0 0 à 255 255 255 et j'ai vite vu et compris que si son inverse (pour le contraste maximum, ce qui est le but) aux deux extrémités fonctionnait bien (noir -> blanc et blanc -> noir), au milieu c'était la loose totale car la courbe directe affichait 127 127 127 et la courbe inverse 128 128 128, autant dire la même chose, et avec gris sur gris le contraste est très moyen,
    On l'avait déjà vu avec l'ami wiwaxia et sa formule "magique".

    J'ai alors eu l'idée de modifier la "vitesse" de descente de la courbe inverse afin que lorsque la courbe directe atteignait 127, la courbe inverse n'y soit pas encore, loin de là (et paramétrable par trackbar) puis en faisant +1 à la directe, l'inverse plongeait brutalement à beaucoup plus que 128. Le croquis est beaucoup plus parlant :
    - en rouge la directe ;
    - en bleu foncé une inverse pas bonne du tout ;
    - en cyan ce qui fonctionne bien !
    Nom : diago_400x400.png
Affichages : 260
Taille : 17,2 Ko

    Restait plus (lol !) qu'à transposer tout ça dans le monde des couleurs, et après m'être longuement battu avec CIE L*a*b*, j'ai creusé les pistes HSL et TSV et, ma foi, si je pars du postulat que la couleur principale est choisie par l'utilisateur, le système va proposer automatiquement une couleur opposée avec des options d'ajustages parce que tout n'est pas rose en ce bas monde et que des réglages tip-top pour principale à jaune et opposée à bleue ne valent plus rien si on change la principale !
    Faut donc permettre à l'utilisateur d'ajuster ce que les calculs proposent, et voilà.

    En haut la couleur principale, en bas la couleur opposée, au milieu deux curseurs devenus inutiles, n'en tenez pas compte, à gauche HSL à droite TSV (2 manières car je n'ai pas encore choisi laquelle je vais garder au final) :
    Nom : invertHSL_TSV.png
Affichages : 190
Taille : 32,0 Ko

    Tout cela n'est pas très beau (à part les couleurs ), tout le monde aura compris qu'il s'agit d'une maquette d'étude et de recherches.
    Et les codes une autre fois, faut que je mette ça au propre et c'est un vrai foutoir.

    Ah, j'allais oublier : lors de mes pérégrinations sur le web, je suis un jour tombé sur un arc-en-ciel HSL que j'ai trouvé plus sympa que son frère RGB et que j'ai donc récupéré et à qui j'ai appliqué les 9 routines de transformations en niveaux de gris, et ça donne ça :
    Nom : niveaux_gris_HSL.png
Affichages : 198
Taille : 50,3 Ko

  6. #86
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Salut,

    24 h plus tard :

    Nom : hsl_tsv3.png
Affichages : 181
Taille : 32,1 Ko

    Je rappelle le fonctionnement : en haut les 3 curseurs simulent une boîte de dialogue pour permettre à l'utilisateur de choisir une couleur (le "fond"), et le programme se charge de déterminer la couleur opposée (bêtement, de 180° sur le cercle chromatique), l'affiche et permet à l'utilisateur de l'ajuster finement avec là aussi 3 curseurs.

    Bon, j'ai vérifié les couleurs du panneau droit (TSV) avec la boîte de dialogue de choix de couleurs dans The Gimp et c'est tout juste.

    Que dire de plus ? Bon week-end !

  7. #87
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 148
    Points : 9 614
    Points
    9 614
    Par défaut
    Ca parait surprenant, surtout le 2ème exemple
    RGB1 = (175,255,145)
    RGB2 = (143,10,191)
    R et B sont nettement au dessus de la moyenne, aussi bien sur la couleur d'origine que sur la couleur inverse.
    Heureusement que G passe de 255 à 10, ce qui assure une lisibilité.
    Ca marche bien parce que le vert semble être la couleur la mieux perçue. (Elle pesait 10 fois plus que le bleu dans les calculs de luminosité)
    Ca donne quoi avec RGB=(205,150,145) ou encore RGB= (130,125,205)

    Personnellement, j'aurais été très violent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SEUIL = 127  // à vérifier, peut être que SEUIL=130 ou 140 donnerait de meilleurs résultats
    SI R1 > SEUIL alors R2 = 0 sinon R2=255
    SI G1 > SEUIL alors G2 = 0 sinon G2=255
    SI B1 > SEUIL alors B2 = 0 sinon B2=255
    Ca donne comme couleur opposée une des 8 couleurs Rouge Vert Bleu Blanc Noir Jaune et ? et ?

  8. #88
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Yop !

    Citation Envoyé par tbc92 Voir le message
    Ca parait surprenant, surtout le 2ème exemple
    RGB1 = (175,255,145)
    RGB2 = (143,10,191)
    R et B sont nettement au dessus de la moyenne, aussi bien sur la couleur d'origine que sur la couleur inverse.
    Rien compris à ce qui est surprenant ou pas, je ne sais pas ce qui te choque dans ce 175,255,145, quant à la dernière phrase je ne la comprends absolument pas...
    Et le deuxième exemple, repris ci-dessous en HSL et TSV :
    Nom : 14310191.png
Affichages : 175
Taille : 28,5 Ko

    Citation Envoyé par tbc92 Voir le message
    Ca donne quoi avec RGB=(205,150,145) ou encore RGB= (130,125,205)
    Les copies d'écran ci-dessous, étant entendu que j'ai utilisé un autre outil pour saisir tes valeurs, outil qui m'a ensuite fait les conversions vers HSL et TSV, d'où les approximations RGB sur cette image (les approximations sont expliquées au § suivant) :
    Nom : 205150145_130125205.png
Affichages : 177
Taille : 30,8 Ko

    Et avec le sélecteur du Gimp :
    Nom : 205150145hsv.png
Affichages : 182
Taille : 51,4 Ko

    Citation Envoyé par tbc92 Voir le message
    Personnellement, j'aurais été très violent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SEUIL = 127  // à vérifier, peut être que SEUIL=130 ou 140 donnerait de meilleurs résultats
    SI R1 > SEUIL alors R2 = 0 sinon R2=255
    SI G1 > SEUIL alors G2 = 0 sinon G2=255
    SI B1 > SEUIL alors B2 = 0 sinon B2=255
    Ce n'est pas à moi de choisir d'être violent ou pas, chacun ses goûts : je propose juste un truc qui permet d'obtenir une couleur opposée à une autre, et d'afficher les réglages ensuite, et pas plus car ce n'est pas totalement automatisable, il y a une part d'esthétique qui entre ne jeu.


    Citation Envoyé par tbc92 Voir le message
    Ca donne comme couleur opposée une des 8 couleurs Rouge Vert Bleu Blanc Noir Jaune et ? et ?
    Pourquoi 8 couleurs quand les cercles chromatiques n'en proposent que 6 ? Ne compliquons pas plus les choses, elles le sont assez comme ça.

    Ceci étant dit, il y a peut-être des erreurs dans les routines de conversions, ce n'est pas moi qui les ai écrites, si quelqu'un se sent de tout vérifier, hop, un zip : hsltsv.zip
    Écrit en Lazarus, donc Pascal, donc ça devrait se compiler avec un peu de bricolage sous Delphi et d'autres.

  9. #89
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Détermination d'une couleur contrastée
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    ... Je rappelle le fonctionnement : en haut les 3 curseurs simulent une boîte de dialogue pour permettre à l'utilisateur de choisir une couleur (le "fond"), et le programme se charge de déterminer la couleur opposée (bêtement, de 180° sur le cercle chromatique), l'affiche et permet à l'utilisateur de l'ajuster finement avec là aussi 3 curseurs ...
    Là est l'essentiel de la question: par quelles relations passe-t-on d'une couleur à l'autre ? Peu importe le système de coordonnées utilisées (TSL ou TSB).

    Citation Envoyé par Jipété Voir le message
    ... Ceci étant dit, il y a peut-être des erreurs dans les routines de conversions, ce n'est pas moi qui les ai écrites, si quelqu'un se sent de tout vérifier, hop, un zip : hsltsv.zip ...
    La présentation monolithique du texte décourage tout effort de lecture ... et la démonstration est toujours convaincante lorsque l'on part de couleurs affirmées, nettement claires ou sombres.
    Mais que se passe-t-il dans le cas de divers gris ? Je crains un fiasco dans le cas de teintes situées sur l'axe chromatique, si la transformation sor la valeur ou la luminosité se réduit à une simple soustraction, du genre: (v' = 255 - v) ou (L' = 1 - L): essayer par exemple (g, g, g) en prenant g = 120, 125, 127, 128, 130, 135 .

    Citation Envoyé par tbc92 Voir le message
    ... Personnellement, j'aurais été très violent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SEUIL = 127  // à vérifier, peut être que SEUIL=130 ou 140 donnerait de meilleurs résultats
    SI R1 > SEUIL alors R2 = 0 sinon R2=255
    SI G1 > SEUIL alors G2 = 0 sinon G2=255
    SI B1 > SEUIL alors B2 = 0 sinon B2=255
    On en revient à la fonction discontinue évoquée dès le début de cet échange (#3, 4, 11), qui ne présente pas de point stationnaire ((r', v', b') = (r, v, b)) et permet d'obtenir toujours un bon contraste. Rien n'interdit d'ailleurs d'envisager des seuils différents (Sr, Sv, Sb).

    Citation Envoyé par tbc92 Voir le message
    ... Ca donne comme couleur opposée une des 8 couleurs Rouge Vert Bleu Blanc Noir Jaune et ? et ?
    ... Cyan et pourpre - qui correspondent aux 8 sommets du cube de couleurs.
    Citation Envoyé par Jipété Voir le message
    ... Pourquoi 8 couleurs quand les cercles chromatiques n'en proposent que 6 ? Ne compliquons pas plus les choses, elles le sont assez comme ça ...
    Où est le problème ? Tu oublies simplement les deux points limites (noir et blanc) de l'axe de ces cercles ...

  10. #90
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 148
    Points : 9 614
    Points
    9 614
    Par défaut
    Dans ton message du 10 février 12h35, tu as représenté une courbe en cyan, courbe qui sert à convertir ... quelque chose. Et c'est cette courbe que tu utilises dans les message suivants.
    A priori, cette courbe peut faire sens pour convertir les données RGB de la couleur d'origine, et calculer les coordonnées RGB de la couleur complémentaire.

    Pour convertir des coordonnées TSL, elle ne semble pas du tout adaptée. (par exemple parce que tu as décrit cette courbe comme une courbe de [0,255] vers [0,255], alors que pour les coordonnées TSL, la borne max n'est pas 255.)
    J'ai donc supposé que tu appliquais cette courbe à des coordonnées RGB.
    Et dans ce cas, quand R de la couleur d'origine est supérieur à 128, Le R de la couleur d'arrivée devrait être inférieur à 128. Et ce n'est pas le cas dans les valeurs numériques que tu présentes.

    On se retrouve du coup (texte bleu sur fond rose) avec du texte clair sur fond clair.

  11. #91
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Dans ton message du 10 février 12h35, tu as représenté une courbe en cyan, courbe qui sert à convertir ... quelque chose. Et c'est cette courbe que tu utilises dans les message suivants.
    Non ! Cette courbe cyan (3 morceaux de droite, en fait) n'est là que pour illustrer mes réflexions.
    Citation Envoyé par jipété Voir le message
    Dans un 1er temps, j'ai débroussaillé à partir d'une courbe (droite !) grise (R=G=B)

    Citation Envoyé par wiwaxia Voir le message
    Là est l'essentiel de la question: par quelles relations passe-t-on d'une couleur à l'autre ? Peu importe le système de coordonnées utilisées (TSL ou TSB).
    Couleurs diamétralement opposées sur un cercle chromatique, comme suggéré par plein de sites d'informaticiens et de graphistes/peintres/artistes/etc.
    Nom : cercle_chroma_RGB-OK_son-image.jpg
Affichages : 176
Taille : 23,4 Ko

    Citation Envoyé par wiwaxia Voir le message
    Mais que se passe-t-il dans le cas de divers gris ?
    le programme se charge de déterminer la couleur opposée, l'affiche et permet à l'utilisateur de l'ajuster finement avec 3 curseurs.
    J'avoue n'avoir pas fait de tests d'introduction en entrée d'une couleur grise, le programme n'ayant pas d'entrées RGB. Je note ça dans mon TODO car, si, oui, on peut amener la couleur d'entrée à afficher du gris, c'est en jouant sur sa saturation et sa lumin -ance -osité, mais la teinte de base ne varie pas, d'où un fond blanc ou noir et une police en couleur, mais corrigeable avec les curseurs !
    Nom : gris.png
Affichages : 179
Taille : 28,7 Ko

    Citation Envoyé par wiwaxia Voir le message
    Où est le problème ? Tu oublies simplement les deux points limites (noir et blanc) de l'axe de ces cercles ...
    C'est pas faux, et c'est pour ça que je donne la possibilité à l'utilisateur de jouer avec les 3 curseurs sur la couleur choisie par le prog.

    Encore une fois, dans la mesure où il n'y aura jamais de solution universelle pour ce problème, in fine il faut que l'utilisateur mette les mains dans le cambouis pour valider/affiner le choix automatique qui n'est en fait qu'un début dans le processus artistique de choix d'une bonne lisibilité.
    Au début j'étais parti sur des idées folles comme inverser la saturation (en plus de la couleur sur le cercle) et la lumin -ance -osité, mais c'était l'enfer !
    J'ai zappé ces automatismes pour donner le choix au décideur avec les curseurs S et L/V.


    Citation Envoyé par Jipété Voir le message
    Je rappelle le fonctionnement : en haut les 3 curseurs simulent une boîte de dialogue pour permettre à l'utilisateur de choisir une couleur (le "fond"), et le programme se charge de déterminer la couleur opposée (bêtement, de 180° sur le cercle chromatique), l'affiche et permet à l'utilisateur de l'ajuster finement avec là aussi 3 curseurs.

  12. #92
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 148
    Points : 9 614
    Points
    9 614
    Par défaut
    Faisons le parallèle avec le globe terrestre, ça parle à tout le monde.
    Pole Nord = Blanc; Pole sud = Noir ; les 3 points 'Rouge Vert Bleu sont en gros 3 points sur le tropique du Capricorne ( 23° sud), et les 3 autres points jaune cyan pourpre sont sur le tropique du cancer (23° Nord).
    Et malheureusement, quand on travaille sur les couleurs, on ne considère pas uniquement les points à la surface de la terre, mais aussi les points à l'intérieur de la terre. On a donc la notion de profondeur, ou de rayon à gérer en plus. En particulier, l'axe partant du pole sud au pole nord décrit les 256 nuances de gris.
    Avec ta méthode, tu prends comme couleur complémentaire une autre couleur sur le même parallèle, et avec la même profondeur. Si on part d'une couleur sur l'équateur (à la surface de la terre, ou au moins avec une profondeur pas trop grande), en faisant un demi-cercle, on va effectivement se retrouver très loin de la couleur d'origine (à plusieurs milliers de kilomètres de l'emplacement d'origine si on revient à l'analogie avec le globe terrestre).
    Idem si on part d'un point qui se trouve en gros entre les parallèles -60° et +60°

    Mais si on part d'un point qui se trouve sur le cercle polaire nord (disons bleu très clair), tu vas obtenir une autre point très proche (très proche en km, puisqu'on reste sur le cercle polaire Nord, et très proche en perception, puisque tu obtiens une autre couleur très claire)

    Si tu pars d'un point qui est sur le cercle polaire nord, il faut se débrouiller pour arriver dans l'hémisphère sud (pas forcément à la surface de la terre, tu peux parfaitement viser un point proche du centre de la terre)
    Sur les points testés, on a pris un point en Suède, et on a choisi comme point opposé un point en Alaska. Pourquoi pas choisir un point en Australie ?

  13. #93
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Faisons le parallèle avec le globe terrestre, ça parle à tout le monde.
    Pole Nord = Blanc; Pole sud = Noir ; les 3 points 'Rouge Vert Bleu sont en gros 3 points sur le tropique du Capricorne ( 23° sud), et les 3 autres points jaune cyan pourpre sont sur le tropique du cancer (23° Nord).
    Ça part mal : mes six points de couleur sont tous sur.. l'équateur !

    Citation Envoyé par tbc92 Voir le message
    --snip--
    Et tout le reste je le sais, et c'est pourquoi j'ai mis des curseurs d'ajustements.
    De la même manière que j'hésite sur la façon de gérer noir-gris-blanc d'où HSL à gauche et TSV à droite, et les curseurs

    Si quelqu'un a une meilleure idée et une meilleure manière de faire, qu'il montre son code...

  14. #94
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Envoyé par wiwaxia
    Là est l'essentiel de la question: par quelles relations passe-t-on d'une couleur à l'autre ? Peu importe le système de coordonnées utilisées (TSL ou TSB).


    Couleurs diamétralement opposées sur un cercle chromatique
    , comme suggéré par plein de sites d'informaticiens et de graphistes/peintres/artistes/etc.
    C'est entendu, mais cela ne suffit pas ! L'opposé d'un gris moyen est un gris moyen, de sorte qu'il n'y a alors plus de contraste.
    De plus, l'une des composantes (r, v, b) est obligatoirement nulle sur le cercle chromatique, où l'on ne trouve ni le blanc, ni le noir, ni les gris intermédiaires.

    Citation Envoyé par Jipété Voir le message
    Envoyé par wiwaxia
    Mais que se passe-t-il dans le cas de divers gris ?


    le programme se charge de déterminer la couleur opposée, l'affiche et permet à l'utilisateur de l'ajuster finement avec 3 curseurs.
    Autre façon de voir les choses: les composantes d'un gris sont par définition égales, et le point figuratif se trouve sur l'axe du cercle chromatique; l'angle caractérisant la teinte est alors indéterminé.
    Il intervient nécessairement une autre transformation, concernant le 3me terme (valeur ou luminosité), et qu'on ne peut voir qu'à l'aide d'une perspective spatiale (cône ou cylindre des couleurs).
    Il suffit de tester ton programme pour divers niveaux de gris (j'y reviens !): si l'on observe le passage brutal du blanc au noir pour la nouvelle couleur, en l'absence de toute intervention manuelle, c'est qu'il intervient une fonction discontinue (voir ce qui précède) v' = F(v) ou L' = G(L), indépendamment de la transformation définie sur le cercle chromatique ... Sinon il faut peut être reprendre et compléter le programme.

  15. #95
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Faisons le parallèle avec le globe terrestre, ça parle à tout le monde.
    Pole Nord = Blanc; Pole sud = Noir ; les 3 points 'Rouge Vert Bleu sont en gros 3 points sur le tropique du Capricorne ( 23° sud), et les 3 autres points jaune cyan pourpre sont sur le tropique du cancer (23° Nord).
    Et malheureusement, quand on travaille sur les couleurs, on ne considère pas uniquement les points à la surface de la terre, mais aussi les points à l'intérieur de la terre. On a donc la notion de profondeur, ou de rayon à gérer en plus. En particulier, l'axe partant du pole sud au pole nord décrit les 256 nuances de gris.
    Tu es en train de promouvoir l'utilisation d'un domaine de couleurs sphérique; ça marche effectivement, mais les calculs sont un peu compliqués. Ce modèle géographique est néanmoins très parlant.
    Je crois que dans le cadre de cette discussion, on pourrait se contenter des instructions simples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF Valeur<128 THEN Valeur1:= Valeur + 128
                  ELSE Valeur1:= Valeur - 128
    ou de quelque chose d'équivalent pour la luminosité.

  16. #96
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    C'est entendu, mais cela ne suffit pas ! L'opposé d'un gris moyen est un gris moyen, de sorte qu'il n'y a alors plus de contraste.
    De plus, l'une des composantes (r, v, b) est obligatoirement nulle sur le cercle chromatique, où l'on ne trouve ni le blanc, ni le noir, ni les gris intermédiaires.
    [...]
    Il suffit de tester ton programme pour divers niveaux de gris (j'y reviens !): si l'on observe le passage brutal du blanc au noir pour la nouvelle couleur, en l'absence de toute intervention manuelle, c'est qu'il intervient une fonction discontinue (voir ce qui précède) v' = F(v) ou L' = G(L), indépendamment de la transformation définie sur le cercle chromatique ... Sinon il faut peut être reprendre et compléter le programme.
    C'est bien ce que j'ai dit au début de la reprise de cette discussion, il y a deux jours.

    Ce passage brutal c'est ce que j'ai matérialisé par la droite cyan.
    Le but de la manip étant de trouver une lisibilité maximum (j'y reviens), il faut viser le contraste maximum qui ne pourra jamais être de 100 % sauf si blanc ou noir.
    Sinon c'est une affaire de compromis, et qui dit compromis dit curseurs pour ajuster tout ça...

    Je vous invite à relire le début de mon post :
    Citation Envoyé par Jipété Voir le message
    Dans un 1er temps, j'ai débroussaillé à partir d'une courbe (droite !) grise (R=G=B) croissant de 0 0 0 à 255 255 255 et j'ai vite vu et compris que si son inverse (pour le contraste maximum, ce qui est le but) aux deux extrémités fonctionnait bien (noir -> blanc et blanc -> noir), au milieu c'était la loose totale car la courbe directe affichait 127 127 127 et la courbe inverse 128 128 128, autant dire la même chose, et avec gris sur gris le contraste est très moyen,
    On l'avait déjà vu avec l'ami wiwaxia et sa formule "magique".

    J'ai alors eu l'idée de modifier la "vitesse" de descente de la courbe inverse afin que lorsque la courbe directe atteignait 127, la courbe inverse n'y soit pas encore, loin de là (et paramétrable par trackbar) puis en faisant +1 à la directe, l'inverse plongeait brutalement à beaucoup plus que 128. Le croquis est beaucoup plus parlant :
    - en rouge la directe ;
    - en bleu foncé une inverse pas bonne du tout ;
    - en cyan ce qui fonctionne bien !
    Nom : diago_400x400.png
Affichages : 260
Taille : 17,2 Ko

    Restait plus (lol !) qu'à transposer tout ça dans le monde des couleurs, et après m'être longuement battu avec CIE L*a*b*, j'ai creusé les pistes HSL et TSV et, ma foi, si je pars du postulat que la couleur principale est choisie par l'utilisateur, le système va proposer automatiquement une couleur opposée avec des options d'ajustages parce que tout n'est pas rose en ce bas monde et que des réglages tip-top pour principale à jaune et opposée à bleue ne valent plus rien si on change la principale !
    Faut donc permettre à l'utilisateur d'ajuster ce que les calculs proposent, et voilà.

  17. #97
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Le graphe couleur cyan ne représente pas les variations d'une fonction, car à une valeur unique de l'abscisse (x = 0.5) correspond une infinité de valeurs de (y), comprises entre (0.25) et (0.75). Tu as pris implicitement le cas limite d'un fonction continue, à tangente verticale au point d'inflexion (0.5 ; 0.5).
    Or il faut ici une fonction discontinue, par exemple définie par les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF x<0.5 THEN y:= 0.75 + (0.5 * x)
             ELSE y:= 0.5 * (x - 0.5);
    Voir le graphe vert.

    Nom : Graphe discontinu_01.gif
Affichages : 247
Taille : 20,9 Ko

  18. #98
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Or il faut ici une fonction discontinue, par exemple définie par les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IF x<0.5 THEN y:= 0.75 + (0.5 * x)
             ELSE y:= 0.5 * (x - 0.5);
    Voir le graphe vert.

    Nom : Graphe discontinu_01.gif
Affichages : 247
Taille : 20,9 Ko
    Pas mal du tout !
    Tu sais quoi ? Je n'y avais pas du tout pensé...

    J'étais parti de mon noir à 0,0 (la droite rouge) et de son opposé à 0,255 (la bleu foncé) et je voyais bien que ces droites allaient se croiser au milieu sans penser un instant à décaler le point de départ.
    C'est comme ça.
    J'avais vu qu'il fallait décaler le point de croisement, et c'est tout.

    Bref, voilà ce que donne ta formule :
    Nom : 6gris_wiwaxia.png
Affichages : 217
Taille : 13,6 Ko

    La zone "Gris txt =" est remplie régulièrement comme la droite rouge, et le texte est écrit avec la valeur de gris qu'il indique

    En Pascal j'ai fait comme ça :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      if trkGris.Position < PointDeBascule then
        CI := round(192 + (trkGris.Position * 0.5))  // 192 -> 255
      else
        CI := round(0.5 * (trkGris.Position - 128)); // 000 -> 064
    avec
    • trkGris qui est le trackbar qu'on voit sur mes images ;
    • PointDeBascule = 128, le milieu du parcours (j'avais un temps envisagé un trackbar, là aussi) ;
    • CI c'est la Couleur Inversée.

  19. #99
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 000
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 000
    Points : 15 487
    Points
    15 487
    Par défaut
    Bonjour,

    Je reviens deux minutes sur cette nouvelle formule magique de l'ami wiwaxia, car je l'ai testée avec des couleurs, et force est de constater que c'est comme ce que je dis depuis le début : selon la couleur du fond, ça passe ou ça casse avec l'automatisme...

    Comparez ces deux images, dans lesquelles le fond rose du rectangle correspond au mélange des 3 curseurs, notez le curseur vert qui ne varie que d'un point (126-->127) et le résultat sur le gris du texte (sans tenir compte du texte lui-même, qui n'est pas en rapport avec ce qu'on voit [oublié de le changer et flemme de refaire le montage des copies d'écran]) :
    Nom : vert_126127.png
Affichages : 165
Taille : 5,4 Ko

    Je me suis contenté d'appliquer la formule aux 3 curseurs pour générer une couleur "inversée".
    Il est bien nécessaire d'avoir des curseurs d'adaptation pour les réglages fins, on dirait.


    Autre chose :
    pour ceux qui auraient téléchargé le zip d'il y a qq jours, j'avais noté une chose qui m'ennuyait : pour avoir un affichage correct et symétrique entre les différents convertisseurs, dans tous les cas sauf un il me fallait multiplier la valeur de la teinte par 360.
    J'ai cherché et j'ai trouvé ça (1 ligne à rajouter dans le bas de la proc) :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure jpColorToTSV(aColor: TColor; out t,s,v: float); inline;
      ...
      if t < 0 then t := t + 360;
      t := t / 360; // oublié par l'auteur !
      if maxrgb = 0 then s := 0 else s := (maxrgb-minrgb) / maxrgb;
      v := maxrgb;
    end;

    Du coup je peux maintenant gérer l'affichage comme pour les autres conversions,
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.AjustTSVinvert(Sender: TObject);
        ...
        //Items[1].Text:=Format('%3.0f',[oT]);
        Items[1].Text:=Format('%3.0f',[oT*360]);

    mais attention car cette modif a un effet de bord qui se traduit par une correction lourde d'une autre procédure de conversion (juste une, alors je ne refais pas le zip) :
    EDIT du lendemain : dans certains cas de figure cette nouvelle fonction donnait elle aussi des résultats faux ! Je la remplace par une nouvelle, trouvée dans un ensemble de composants magiques :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    function jpTSVToColor(t,s,v: float): TColor; inline;
    var
      r, g, b: Integer;
      procedure TSVtoRGB(T, S, V: Double; out R, G, B: Integer);
      var
        i: Integer;
        f: Double;
        p, q, u: Double;
     
        procedure MakeRgb(rr, gg, bb: Double);
        begin
          R := Round(rr * 255);
          G := Round(gg * 255);
          B := Round(bb * 255);
        end;
     
      begin
        i := floor(T * 6);
        f := T * 6 - i;
        p := V * (1 - S);
        q := V * (1 - f*S);
        u := V * (1 - (1 - f) * S);
        case i mod 6 of
          0: MakeRGB(V, u, p);
          1: MakeRGB(q, V, p);
          2: MakeRGB(p, V, u);
          3: MakeRGB(p, q, V);
          4: MakeRGB(u, p, V);
          5: MakeRGB(V, p, q);
          else MakeRGB(0, 0, 0);
        end;
      end;
    begin
      TSVtoRGB(T, S, V, r, g, b);
      Result := RgbToColor(r, g, b);
    {pas glop ce truc...
    var // http://www.delphipraxis.net/157099-fast-integer-rgb-hsl.html
      hi: integer;
      f,p,q,u: float;
      cn: TColor;
      function jpRGBtoColor(const R,G,B: Byte): TColor;
      begin
        Result := (B shl 16) or (G shl 8) or R;
      end;
    begin
      hi := Floor(t/60);
      f := t/60 - hi;
      p := (v*(1-s))*255;
      q := (v*(1-s*f))*255;
      u := (v*(1-s*(1-f)))*255;
      v := v*255;
      case hi of
        0: cn := jpRGBtoColor( byte(round(v)), byte(round(u)), byte(round(p)) );
        1: cn := jpRGBtoColor( byte(round(q)), byte(round(v)), byte(round(p)) );
        2: cn := jpRGBtoColor( byte(round(p)), byte(round(v)), byte(round(u)) );
        3: cn := jpRGBtoColor( byte(round(p)), byte(round(q)), byte(round(v)) );
        4: cn := jpRGBtoColor( byte(round(u)), byte(round(p)), byte(round(v)) );
        5: cn := jpRGBtoColor( byte(round(v)), byte(round(p)), byte(round(q)) );
        6: cn := jpRGBtoColor( byte(round(v)), byte(round(u)), byte(round(p)) );
      end;
      Result := cn; }
    {// résultats faux selon la couleur passée...
    // dessous, copie adaptée de jpHSVtoColor
    var
      var_t,var_r,var_g,var_b,var_1,var_2,var_3: float;
      var_i: integer;
      R,G,B: byte;
    begin
      if S = 0 then
      begin
        R := round(V * 255);
        G := round(V * 255);
        B := round(V * 255);
      end else
      begin
        var_t := T * 6;
        if ( var_t = 6 ) then var_t := 0;      //T must be < 1
        var_i := round( var_t );                 //Or ... var_i = floor( var_t )
        var_1 := V * ( 1 - S );
        var_2 := V * ( 1 - S * ( var_t - var_i ) );
        var_3 := V * ( 1 - S * ( 1 - ( var_t - var_i ) ) );
     
        if      ( var_i = 0 ) then begin var_r := V;     var_g := var_3; var_b := var_1; end
        else if ( var_i = 1 ) then begin var_r := var_2; var_g := V;     var_b := var_1; end
        else if ( var_i = 2 ) then begin var_r := var_1; var_g := V;     var_b := var_3; end
        else if ( var_i = 3 ) then begin var_r := var_1; var_g := var_2; var_b := V;     end
        else if ( var_i = 4 ) then begin var_r := var_3; var_g := var_1; var_b := V;     end
        else                  begin      var_r := V;     var_g := var_1; var_b := var_2; end;
     
        R := round(var_r * 255);                  //RGB results from 0 to 255
        G := round(var_g * 255);
        B := round(var_b * 255);
      end;
      Result := R or (G shl 8) or (B shl 16);
    }
    end;

    On attend maintenant que l'ami sevyc64 nous poste ses remarques et commentaires

  20. #100
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 227
    Points : 28 228
    Points
    28 228
    Par défaut
    Tu me met la pression là

    Il va falloir que je trouve un moment pour tester tout ça, oui, même si ce n'est pour le moment qu'à titre perso. Mais déjà le travail est magnifique.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2015, 14h03
  2. Calculer un bon contraste d'une couleur
    Par Cypselos dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 20/11/2009, 18h16
  3. déterminer la "tonalité" d'une couleur.
    Par Alexdezark dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/10/2009, 11h24
  4. Déterminer si une image est en couleur
    Par ImagingAllthe dans le forum Images
    Réponses: 2
    Dernier message: 26/02/2008, 16h48
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 16h23

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