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. #121
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    Il me reste un petit souci avant d'attaquer cette variation du chantier :

    Citation Envoyé par wiwaxia Voir le message
    L'entier IndiceC est un pilote qui peut prendre l'une des 3 valeurs (1, 2, 3) selon la couleur (Rouge, Vert, ou Bleu) du coin supérieur gauche (Csg); il détermine l'appel de l'une des 3 fonctions qui suivent:
    Quid si l'on a un jaune parfait, 255 255 0 ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #122
    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 : 77
    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
    Citation Envoyé par Jipété Voir le message
    Bonjour,

    Il me reste un petit souci avant d'attaquer cette variation du chantier :

    Citation Envoyé par wiwaxia
    L'entier IndiceC est un pilote qui peut prendre l'une des 3 valeurs (1, 2, 3) selon la couleur (Rouge, Vert, ou Bleu) du coin supérieur gauche (Csg); il détermine l'appel de l'une des 3 fonctions qui suivent:


    Quid si l'on a un jaune parfait, 255 255 0 ?
    Le jaune, complémentaire du bleu, se trouve à l'autre extrémité du grand côté du rectangle; il faut donc choisir (3).

    PS: l'un des 3 plans bissecteurs du cube de couleurs, contenant le sommet bleu (IndiceC = 3) et le jaune.
    Les 3 sections rectangulaires sont disposées dans l'espace.
    Ce schéma négligé fait tache dans un débat où l'on vient d'évoquer l'exigence impérieuse concernant la qualité professionnelle des graphiques, mais je n'ai pas les moyens de faire autrement .

    Nom : Plan bissecteur BJ.gif
Affichages : 452
Taille : 15,7 Ko


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    j'avais promis d'attaquer ce chantier cette semaine, j'ai tenu ma promesse mais ça n'a pas été glorieux...

    Au final je n'arrive à rien car je ne sais pas trop comment "causer" avec ta boîte noire : l'idée aurait été un truc qui renvoie une couleur opposée (ou pas, pour faire plaisir à tbc92 qui n'a pas complètement tort : en prod' deux boutons radio -couleur opposée -couleur ton-sur-ton et hop !) mais je ne sais pas par quel bout prendre ton code, c'est trop compliqué, d'autant plus que j'ai un gros souci sur un autre code très très très chronophage...

    Pi sur un autre forum, quelqu'un m'a fait la remarque suivante : quid si r=g=b pour la couleur de fond ? Que doit renvoyer IndiceC dans ce cas ?

    Voilà mes interrogations de fin de semaine et donc le mot de la fin (pour aujourd'hui) s'impose : bon week-end,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #124
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    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 193
    Points : 28 077
    Points
    28 077
    Par défaut
    Bon week-end à toi, c'est quand même le plus important.

    Il n'y a pas d'urgence car finalement ce n'est pas moi qui ferait cette modification (et probablement qu'elle ne sera désormais pas faite du tout) car je suis maintenant en préavis. Je vais m'en aller martyriser quelques autres codes.

    Par contre, je regarderais dans quelques temps, pour intégrer cela dans une petite bibliothèque perso de snippets car ça peut toujours servir.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  5. #125
    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 : 77
    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
    Salut,

    Citation Envoyé par Jipété Voir le message
    ... Au final je n'arrive à rien car je ne sais pas trop comment "causer" avec ta boîte noire ...
    Pas très grave, c'est un ensemble d'instructions inséparables, donc pas difficile à manier ... il faut simplement adapter les données introduites au contexte.
    Si cela peut te remonter le moral, je viens de perdre un après-midi sur une erreur stupide (elles le sont toutes) de programmation ; il a fallu passer à autre chose, et une nuit réparatrice a permis de tout remettre en ordre en quelques minutes.

    Citation Envoyé par Jipété Voir le message
    ... Pis sur un autre forum, quelqu'un m'a fait la remarque suivante : quid si r=g=b pour la couleur de fond ? Que doit renvoyer IndiceC dans ce cas ? ...
    La réponse est dans les fonctions discontinues rappelées il y a peu (#117), et qui portent au choix sur l'indice de couleur ou sa luminance:
    Code : 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
      // Critère (1) - le seuil (Is = 128) peut être modifié
     
    IF (Ic<128) THEN Jc:= Ic + 128                    // Ic: indice initial de couleur
                ELSE Jc:= Ic - 128;                   // Jc: nouvel indice
     
      // Critère (2)
     
    CONST N = 2.2; N1 = 1 / 2.2;
          Lmax = Power(255, N);      
          Seuil = 0.5 * Lmax;                    // Seuil de luminance modifiable en changeant le premier facteur
          DeltaL = Lmax - Seuil;
    ...
    LumA:= Power(Ic, n);
    IF (LumA<Seuil) THEN LumB:= LumA + DeltaL
                    ELSE LumB:= LumA - Seuil;                    // L(0) = DeltaL = L(Lmax)
    Jc:= Power(LumB, N1)
    Exemple d'application du premier critère (portant sur les indices):
    # le gris moyen (127, 127,127) donnera le blanc le plus clair (255, 255, 255), tandis que (128, 128, 128) conduira au noir le plus profond (0, 0, 0);
    # d'autres points située hors de l'axe chromatique, mais très proches des précédents, conduiront aux couleurs fondamentales:
    (127, 128, 128) au rouge (255, 0, 0), (127, 128, 127) au pourpre (255, 0, 255).
    Les teintes initiales correspondant toutes à des gris indiscernables, la couleur de contraste est imprévisible et l'on a l'impression que le code adopte un comportement erratique.

    Bon week-end.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  6. #126
    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 : 77
    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 Plages de dégradés
    Bonjour,

    Il existe un type de palette bidimensionnelle, dans laquelle les couleurs varient continûment entre celles définies aux quatre coins de la figure (rectangle ou carré, la forme est indifférente).
    Les 3 composantes locales (r, v, b) dépendent des coordonnées relatives (x, y) par un polynôme quadratique de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     z = Ka + Kx*(x - 1/2) + Ky*(y - 1/2) + Kxy*(x - 1/2)*(y - 1/2)
    et dont les coefficients s'expriment simplement en fonction des données extrêmes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Z(0,1) _ _ _ _ _ Z(1,1)
    |                |          Ka  = (Z00 + Z11 + Z01 + Z10)/4
    |                |          Kx  = (Z11 - Z00 - Z01 + Z10)/4
    |                |          Ky  = (Z11 - Z00 + Z01 - Z10)/4
    |                |          Kxy = (Z00 + Z11 - Z01 - Z10)/4
    |                | 
    Z(0,0) _ _ _ _ _ Z(1, 0)
    La courbure de la surface obtenue disparaît lorsque coïncident les moyennes des valeurs aux sommets opposés;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Kxy = 0 si (Z00 + Z11) = (Z01 + Z10)
    ce que l'on obtient correspond alors à une section plane du domaine cubique des couleurs - à l'exception de la forme réelle du contour (carré, rectangle ou parallélogramme).

    Le libre choix des quatre couleurs initiales permet une bonne exploration (bien que restreinte à une surface) des diverses régions du domaine.
    La particularité de la quadrique utilisée est de contenir deux faisceaux de droites, les lignes d'équation (x = Cte) ou (y = Cte), de sorte qu'aucune valeur intermédiaire ne sort du domaine défini par les données: [Min(Z00, Z10, Z01, Z11) ; Max(Z00, Z10, Z01, Z11)] .

    Nom : 1_BlNoBlNo_200x200.gif
Affichages : 388
Taille : 15,0 KoNom : 2_NoJPC_200x200.gif
Affichages : 403
Taille : 21,4 KoNom : 3_BcRBV_200x200.gif
Affichages : 407
Taille : 21,0 KoNom : 4_RPVB_200x200.gif
Affichages : 400
Taille : 21,2 KoNom : 5_VBVB_200x200.gif
Affichages : 380
Taille : 11,2 Ko

    Certains pourront regretter l'aspect un peu terne de certaines zones intermédiaires; c'est juste, et l'on peut y remédier par un ré-haussement des couleurs en introduisant dans la combinaison linéaire les luminances correspondantes (Icn) au lieu des indices (Ic). Mais ce n'est pas le sujet, et ce qui sert pour la suite.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  7. #127
    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 : 77
    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 Revenons à nos moutons
    Pour répondre avec plus de précision à la question du choix de la couleur présentant le plus grand contraste sur un fond donné, il faut considérer deux paramètres, relatifs à la fonction discontinue nécessairement présente au coeur du programme, et qu'on supposera pour simplifier linéaire par morceaux.

    1°) Le seuil de discontinuité: le choix se porte spontanément sur Lim1 = 255/2 = 127.5 ;
    mais il se peut que la limite correspondant à une luminosité relative de 50% se révèle plus pertinente, soit: Lim2 = 255/(21/n) = 186 (pour n = 2.2) ou 191 (pour n = 2.4);
    enfin rien n'empêche, par précaution, d"envisager une valeur intermédiaire, par exemple: Lim3 = 160 .

    2°) La pente du graphe de part et d'autre de la discontinuité: on a proposé d'emblée un décalage fixe entre le nouvel
    indice de couleur (Jc) et l'ancien (Ic), d'où une pente égale à l'unité: l'ensemble des valeurs de (Jc) couvre alors la totalité de l'intervalle [0 ; 255] ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     FUNCTION C_Contr00(Px: Pixel): Pixel;  // Lim = 255/(2^(1/n)
       CONST Max = 255; Lim = 160;          // = 186 (n=2.2) … 191 (n=2.4)
             M1L = Max + 1 - Lim;
       VAR i: Byte; p, q: Reel; P_: Pixel;
       BEGIN
         FOR i:= 1 TO 3 DO
           IF Px[i]<Lim THEN P_[i]:= Px[i] + M1L
                        ELSE P_[i]:= Px[i] - Lim;
         C_Contr00:= P_
       END;
    cependant une pente plus réduite (par exemple 0.5) permet d'améliorer le contraste sur des fonds relativement sombres, ce que réalise le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     FUNCTION C_Contr01(Px: Pixel): Pixel;
       CONST Max = 255; Lim = 160; Min = 79;          // p = 176 , 255
       VAR i, k: Byte; p, q: Reel; P_: Pixel;         // p =   0 ,  47
       BEGIN
         FOR i:= 1 TO 3 DO
           BEGIN
             p:= Px[i] / Lim; q:= Abs(1 - p); k:= Round(Min * q);
             IF (Px[i]<Lim) THEN P_[i]:= Max - k
                            ELSE P_[i]:= k
           END;
         C_Contr01:= P_
       END;
    le cas limite d'une pente nulle est le plus simple, la nouvelle couleur obtenue se réduisant à l'une des 8 couleurs fondamentales;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     FUNCTION C_Contr02(Px: Pixel): Pixel;
       CONST Max = 255; Lim = 160;                    // p = 255 , 255
       VAR i, k: Byte; P_: Pixel;                     // p =   0 ,   0
       BEGIN
         FOR i:= 1 TO 3 DO
           IF (Px[i]<Lim) THEN P_[i]:= Max
                          ELSE P_[i]:= 0;
         C_Contr02:= P_
       END;
    # La question des gris intermédiaires (soulevée par Jipété) trouve ici sa réponse, car les résultats ne dépendent plus ici de la pente; ils confirment ce que j'en avais dit (#125 )
    Les teintes initiales correspondant toutes à des gris indiscernables, la couleur de contraste est imprévisible
    et permettent de mieux cerner la valeur du seuil.
    Les images ci-dessous correspondent aux 3 seuils: Lim = (127.5 , 160.5 , 190.5); la diagonale montante appartient à l'axe chromatique et relie les sommets (g, g, g), (g', g', g'), avec g = Lim * 2.5 et g' = Lim + 2.5 = g + 5 :

    Nom : G1_G125_130_500_055_N20_L127.5.gif
Affichages : 374
Taille : 47,4 Ko Nom : G2_G158_163_005_550_N20_L160.5.gif
Affichages : 355
Taille : 35,7 Ko Nom : G3_G188_193_050_505_N20_L190.5.gif
Affichages : 404
Taille : 35,7 Ko

    La limite médiane paraît donner le meilleur contraste ... mais chacun reste libre de son jugement.

    # Voici pour le même seuil (Lim = 160) ce qu'on obtient pour les couleurs franches, dans le cas d'une pente (p) égale à 1, 0.5 et 0:
    ■ p = 1
    Nom : H1_CPJ_Noir_N20_L160.5.gif
Affichages : 458
Taille : 113,4 Ko Nom : H2_RVB_Blanc_N20_L160.5.gif
Affichages : 397
Taille : 112,9 Ko
    ■ p = 1/2
    Nom : H3_L160Min79_CPJNoir_N20.gif
Affichages : 383
Taille : 111,1 Ko Nom : H4_L160Min79_RVBBlanc_N20.gif
Affichages : 422
Taille : 110,7 Ko
    ■ p = 0
    Nom : H5_L160Min00_CPJNoir_N20.gif
Affichages : 383
Taille : 100,8 Ko Nom : H6_L160Min00_RVBBlanc_N20.gif
Affichages : 385
Taille : 100,6 Ko

    C'est dans le dernier cas qu'on obtient le meilleur contraste


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    wiwaxia, je ne te cacherai pas que tu m'as perdu avec tous tes ronds...

    Certainement que quelque chose de très intéressant doit se cacher dessous, permettant d'affiner aux petits oignons la formule magique qui permettra de trouver la meilleure couleur en matière de contraste et autres critères, mais je suis largué pour mettre ça "en prod".

    Alors j'ai suivi mon petit bonhomme de chemin, et j'en suis là :
    Nom : avancement.png
Affichages : 422
Taille : 33,8 Ko

    en haut à gauche la couleur de fond pour laquelle on cherche la couleur au meilleur contraste,
    dessous à gauche un panneau de réglages HSL et à droite son frère TSV, pour l'instant la couleur opposée choisie automatiquement puis ajustée éventuellement ici n'est pas encore répercutée dans le grand rectangle, tout n'est pas fini.

    À droite du grand rectangle colorié, le "carré à outils" pour changer le texte et ses taille, police et attributs, une option "ton sur ton" (à venir), un bouton pour lancer un système de capture (pour quand la copine vient avec une photo sur clé uzbe) qui recopiera la zone sélectionnée dans le grand rectangle, et enfin une petite image de la grande plus un choix de différents niveaux de floutage afin d'avoir une moyenne de la grande image la plus moyenne possible, et à partir de là, hop ! 3 fois rien de calculs automatiques et les panneaux du bas s'adaptent, reste plus à la copine qu'à affiner au point près avec les... curseurs !

    Ce que j'ai fait pour générer cette image, d'ailleurs : j'ai baissé un poil le L du panneau HSL et le S du STV, ce qui a modifié la couleur du bleu déterminée par l'outil comme opposée à l'orange.

    Voili voilou,

    PS : ne pas tenir compte du décalage entre le curseur T à droite à 210 et l'indicateur en bas à 213, tout n'est pas fini (un ColorPicker confirme les chiffres des StatusBars).
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Ça avance, ça avance...

    Correction de tout un tas de bugs à la noix (glissement de la teinte en jouant avec la saturation, à cause des approximations des erreurs d'arrondis [J. Delmas en parle bien]), ça avance pas trop mal :
    Nom : avance.png
Affichages : 389
Taille : 54,6 Ko

    wiwaxia tu vas être content : j'ai utilisé ta formule pour la "cassure" du gris, je l'ai appliquée à la saturation en mode "ton sur ton" (mais bon, ça surprend, à l'utilisation )
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  10. #130
    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 : 77
    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
    Bonjour,

    Citation Envoyé par Jipété Voir le message
    ... j'ai utilisé ta formule pour la "cassure" du gris, je l'ai appliquée à la saturation en mode "ton sur ton" (mais bon, ça surprend, à l'utilisation )
    Je vois que tu as choisi le cas le plus difficile; mais cela doit conduire à des résultats intéressants. En rappel, et à toutes fins utiles, les fragments de code détaillés au #127 (26/02/2017, 20h46)

    # pente égale à l'unité: l'ensemble des valeurs de (Jc) couvre alors la totalité de l'intervalle [0 ; 255] ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     FUNCTION C_Contr00(Px: Pixel): Pixel;
    # pente plus réduite (par exemple 0.5)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     FUNCTION C_Contr01(Px: Pixel): Pixel;
    # pente nulle: cas le plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     FUNCTION C_Contr02(Px: Pixel): Pixel;
    ... ainsi que les graphes illustrant les discontinuités, et que je n'ai pas donné par négligence - d'autant que j'ai quelque peu abusé des grandes images, et de la patience des modérateurs
    Nom : Im [2017-02-28] Graphes 3 discontinuités.gif
Affichages : 400
Taille : 10,2 Ko

    # Pour en revenir à l'une de tes précédentes remarques,
    Citation Envoyé par Jipété Voir le message
    ... wiwaxia, je ne te cacherai pas que tu m'as perdu avec tous tes ronds ...
    l'abondance des "ronds" ne provient pas d'une obsession maniaque du cercle, mais de ce que mes programmes actuels ne me permettent pas d'insérer du texte dans une image avec toute la liberté souhaitée; je m'en suis donc tenu, faute de temps, à une figure unique facile à coder, et qui constitue un test local du contraste recherché.
    Ce que tu vérifies sur 7×16 = 112 cases à coloration aléatoire, je l'obtiens au niveau des 20×20 = 400 petits cercles, et sur une variation progressive de la couleur du fond:

    Nom : Im [2017-02-28] Palette Jpt 2.gif
Affichages : 436
Taille : 41,7 KoNom : Im [2017-02-28] RBlancBNoir_P0.5_L160.gif
Affichages : 406
Taille : 74,8 Ko

    On y décèle ainsi facilement les variations du contraste, et les zones où il apparaît insuffisant.

    PS: la connexion a été interrompue, et les documents perdus en cours de route.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    j'ai trente secondes...

    Citation Envoyé par wiwaxia Voir le message
    On y décèle ainsi facilement les variations du contraste, et les zones où il apparaît insuffisant.
    Certes, certes, cependant on ne m'ôtera pas de l'idée qu'une fonction à qui on passerait une couleur quelconque (sous forme de TColor en Pascal) et qui retournerait la couleur qu'elle calcule comme étant la plus appropriée, rendrait les plus grands services.

    Parce qu'en l'état, encore une fois, je ne vois pas par quel bout attraper tes formules pour les utiliser au mieux.

    Deux exemples tout simples, et dont les noms sont parlants :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function RGBtoColor(const R,G,B: Byte): TColor; 
    begin
      Result := (B shl 16) or (G shl 8) or R;
    end;
     
    procedure ColorToRGB(const aColor: TColor; out R,G,B: Byte); 
    begin
      R :=  aColor and $FF;
      G := (aColor shr  8) and $FF;
      B := (aColor shr 16) and $FF;
    end;

    Il nous faudrait un truc du genre
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function BlackBoxWiwaxia(const inColor: TColor): TColor;
    begin
      ColorToRGB(inColor, R,G,B);
      // bosse avec R, G, et B...
      . . .
      Result := RGBtoColor(R,G,B);
    end;
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  12. #132
    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 : 77
    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,

    Je réponds rapidement à ton message, trouvé à l'instant.

    Citation Envoyé par Jipété Voir le message
    ... cependant on ne m'ôtera pas de l'idée qu'une fonction à qui on passerait une couleur quelconque (sous forme de TColor en Pascal) et qui retournerait la couleur qu'elle calcule comme étant la plus appropriée, rendrait les plus grands services.

    Parce qu'en l'état, encore une fois, je ne vois pas par quel bout attraper tes formules pour les utiliser au mieux.

    Deux exemples tout simples, et dont les noms sont parlants :
    ... / ...
    Il nous faudrait un truc du genre
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function BlackBoxWiwaxia(const inColor: TColor): TColor;
    begin
      ColorToRGB(inColor, R,G,B);
      // bosse avec R, G, et B...
      . . .
      Result := RGBtoColor(R,G,B);
    end;
    C'est précisément ce que fait chacune des 3 fonctions proposées au message #127 ; il revient au programmeur de les adapter à son propre langage, et aux outils qui lui sont familiers.
    Il n'est pas exclu qu'une fonction ou procédure analogue existe dans l'arsenal de Delphi ou Lazarus: après tout, pourquoi pas ?
    Cependant quelqu'un nous l'aurait probablement indiqué depuis le début de cet échange (1) ... et l'essentiel n'est pas là: il s'agit de bien comprendre le but recherché, et les moyens que l'on se donne pour l'atteindre, et non d'insérer à tout prix la fonction d'un répertoire donné (X) ou (Y)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Pochette_Surprise(c: Type_Pixel): Type_Pixel;
    dont on ne connaît pas exactement le comportement.
    Une fois cette étape franchie, le code suit naturellement.

    De plus, les images proposées ne constituent pas un but en soi, il ne s'agit que de test visuels, qui permettent de juger du bon choix d'une limite, ou d'une fonction; chacun les réalise à sa façon.
    Et leur examen a permis, malgré leurs imperfections, d'apporter deux réponses concernant le contraste optimal de couleur:
    Lim = 160 pour la frontière de discontinuité, et Lum = 25% pour le basculement du noir au blanc (je reviendrai sur ce dernier point).

    (1) 2345 visiteurs au compteur : le record d'il y a un an (2516) serait-il bientôt battu ?

    PS: Je viens de découvrir une série d'articles tout récemment parus sur le blog de Gilles Vasseur et qui pourraient t'intéresser indirectement:

    Rotation d'une image - bibliothèque BGRABitmap avec Lazarus
    https://www.developpez.net/forums/bl...p-lazarus-1-2/
    https://www.developpez.net/forums/bl...p-lazarus-2-2/

    Redimensionnement d'une image - BGRABitmap avec Lazarus
    https://www.developpez.net/forums/bl...itmap-lazarus/

    Dessiner des rectangles - BGRABitmap avec Lazarus
    https://www.developpez.net/forums/bl...p-lazarus-2-3/
    https://www.developpez.net/forums/bl...p-lazarus-1-3/


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  13. #133
    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 : 77
    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 Develop'Assistance
    Bonjour,

    Pour revenir au dernier échange, il y a l'affirmation des principes
    ... il revient au programmeur de les adapter à son propre langage ...
    et la question de proposer quelque chose pour sortir de l'enlisement.

    Citation Envoyé par Jipété Voir le message
    ... Deux exemples tout simples, et dont les noms sont parlants :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function RGBtoColor(const R,G,B: Byte): TColor; 
    begin
      Result := (B shl 16) or (G shl 8) or R;
    end;
     
    procedure ColorToRGB(const aColor: TColor; out R,G,B: Byte); 
    begin
      R :=  aColor and $FF;
      G := (aColor shr  8) and $FF;
      B := (aColor shr 16) and $FF;
    end;
    Les noms, oui, mais le contenu: pas du tout ! Et je n'ai pas la capacité d'assimiler Free Pascal et Lazarus en 10 minutes ...

    Tentons d'injecter les instructions de la fonction la plus simple, et qui a donné les meilleurs résultats:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     FUNCTION C_Contr02(Px: Pixel): Pixel;
       CONST Max = 255; Lim = 160;                    
       VAR i, k: Byte; P_: Pixel;                     
       BEGIN
         FOR i:= 1 TO 3 DO
           IF (Px[i]<Lim) THEN P_[i]:= Max
                          ELSE P_[i]:= 0;
         C_Contr02:= P_
       END;
    dans l'emballage que tu souhaites:
    Citation Envoyé par Jipété Voir le message
    ... Il nous faudrait un truc du genre
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function BlackBoxWiwaxia(const inColor: TColor): TColor;
    begin
      ColorToRGB(inColor, R,G,B);
      // bosse avec R, G, et B...
      . . .
      Result := RGBtoColor(R,G,B);
    end;
    Pourrait-on envisager ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    FUNCTION BlackBox(const inColor: TColor): TColor;
    CONST Max = 255; Lim = 160;   
    VAR R1, G1, B1: Byte;
    BEGIN
      ColorToRGB(inColor, R,G,B);
      IF (R<Lim) THEN R1:= Max ELSE R1:= 0;                    // on peut sans doute abréger en R:= Max ELSE R:= 0; ... etc
      IF (G<Lim) THEN G1:= Max ELSE R1:= 0;
      IF (B<Lim) THEN B1:= Max ELSE R1:= 0;
      R:= R1; G:= G1; B:= B1:
      Result := RGBtoColor(R,G,B);
    END;
    Il est sans doute possible d'améliorer ces instructions pachydermiques; si cela ne marche pas, demande la traduction correcte sur le forum pascal: le code est suffisamment clair pour que vienne une réponse rapide.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    C'est rigolo ta réponse, c'est exactement ce à quoi je pensais ce matin

    Citation Envoyé par wiwaxia Voir le message
    Pourrait-on envisager ceci ?
    Mais tout à fait !

    Je dirai même plus, dans la mesure où "Max" doit être un mot réservé, qu'on va le remplacer par "Maxi", on peut même déplacer "Lim" en second paramètre de la fonction et donc accessible de l'extérieur (curseur, zone de saisie, etc.), et j'accepte l'abréviation, ce qui donne :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    FUNCTION BlackBox(const inColor: TColor; Lim: integer): TColor;
    CONST Maxi = 255; 
    VAR R, G, B: Byte;
    BEGIN
      ColorToRGB(inColor, R,G,B);
      IF (R<Lim) THEN R:= Maxi ELSE R:= 0;
      IF (G<Lim) THEN G:= Maxi ELSE G:= 0;
      IF (B<Lim) THEN B:= Maxi ELSE B:= 0;
      Result := RGBtoColor(R,G,B);
    END;

    Citation Envoyé par wiwaxia Voir le message
    Il est sans doute possible d'améliorer ces instructions pachydermiques;
    Meuh non, sont très bien tes instructions, lisibles et tout ; malheureusement, je n'ai pas trop le temps de tester ce matin, mais je promets un retour rapide.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonsoir,

    chose promise chose tenue, mais force est de constater, encore une fois, qu'il n'y aura pas de solution universelle et que le curseur de réglages s'impose au graphiste soucieux d'un résultat sympathique...

    Je suis donc parti de la formule de ce matin et de mes vieux bouts d'essais, j'ai utilisé un curseur en commençant à 150 (en commençant à 0 tous les textes sont noirs, et certains dont le fond est bien foncé, ont quand même du mal à s'inverser, par exemple col 3 ligne 1 bascule à 14 du curseur alors que 2 1 bascule à 7 )

    Bref, j'ai fait des images à 150, 160, 170, 180 et 210 où 2 1 va basculer vers un jaune clair et brillant (255 255 0), et la dernière image est un gif qui reprend les 5 :
    Nom : 150.jpg
Affichages : 402
Taille : 69,7 Ko Nom : 160.jpg
Affichages : 405
Taille : 69,2 Ko
    Nom : 170.jpg
Affichages : 351
Taille : 68,9 Ko Nom : 180.jpg
Affichages : 362
Taille : 67,6 Ko
    Nom : 210.jpg
Affichages : 365
Taille : 65,5 Ko Nom : 5essais.gif
Affichages : 511
Taille : 124,6 Ko

    Y a des jours, je me demande s'il ne faudrait pas tout repenser (encore que, le plus gros est fait) et envisager de travailler avec un espace de couleurs plus respectueux de la perception visuelle, j'ai nommé CIE L*a*b* (ou L*C*h).

    Pi tant qu'à y être faudrait aussi trouver des composants qui bossent en 16 bits, histoire de minimiser les erreurs d'arrondis (déjà constaté des erreurs chez moi, genre T varie quand je trifouille V en mode TSV 8 bits).

    Mais c'est probablement un chantier pour une vie future,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  16. #136
    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 : 77
    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,

    Il se confirme que la limite du meilleur contraste (blanc/noir) sur fond coloré correspond bien à une luminance relative de 25 %, comme cela avait été signalé plus tôt (#132, 02/03/2017, 17h27).
    J'ai repris le test sur quelques fonds dégradés, à teintes arbitraires, en y ajoutant le tracé de l'isophote limite, d'équation L = 0.25 .

    Nom : BN_BBlNoG220_300x300_13x13_Isoph.gif
Affichages : 325
Taille : 44,4 Ko _ Nom : BN_CPJNo_300x300_13x13_Isoph.gif
Affichages : 358
Taille : 41,8 Ko _ Nom : BN_JVCG150_300x300_13x13_Isoph.gif
Affichages : 360
Taille : 42,3 Ko _ Nom : BN_RVBBl_300x300_13x13_Isoph.gif
Affichages : 382
Taille : 42,0 Ko

    Le calcul de la luminance relative a été effectué à partir de son expression standard, dont le codage ne présente pas de complication particulière, compte tenu de ce que la correction aux faibles éclairements n'intervient pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     FUNCTION LumRvb(Px: Pixel): Reel;
       CONST Coeff: Lst3R = (0.2126, 0.7152, 0.0722);
             h = 14.025; Kl= 1.474E-6;     // h = 255 * 0.055
       VAR i: Byte; p, q, s, t: Reel;      // Kl = (255*1.055)^-2.4
       BEGIN
         s:= 0;
         FOR i:= 1 TO 3 DO BEGIN
                             p:= Power(Px[i] + h, 2.4); q:= Coeff[i] * p;
                             t:= s + q;                 s:= t
                           END;
         LumRvb:= Kl * s
       END;

    On a accordé beaucoup trop d'importance (moi le premier) à des simplifications anecdotiques dont l'intérêt apparaît finalement contestable, à part soulager le lecteur tétanisé par les mathématiques .
    Une approximation (citée nulle part) est à ce sujet envisageable, mais ce n'est pas le lieu de la développer ici.

    Le tracé des graphes d'équiluminance pourrait être amélioré; il résulte ici du balayage systématique des colonnes, et de la détection du changement de signe de l'écart:
    Elum = L(x, y) - 0.25 .

    Voilà donc la longue et laborieuse réponse apportée à la question de sevyc64.

    # Il faut que je signale ici une rectification qui n'a pas été faite dans les délais (#126 - 26/02/2017), afin d'éviter une perte de temps à qui voudrait reprendre le calcul des dégradés:
    Les 3 composantes locales (r, v, b) dépendent des coordonnées relatives (x, y) par un polynôme quadratique de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     z = Ka + Kx*(x - 1/2) + Ky*(y - 1/2) + Kxy*(x - 1/2)*(y - 1/2)
    et dont les coefficients s'expriment simplement en fonction des données extrêmes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Z(0,1) _ _ _ _ _ Z(1,1)
    |                | 
    |                |          Ka  = (Z11 + Z00 + Z10 + Z01) * (1/4)
    |                |          Kxy = (Z11 + Z00 - Z10 - Z01)
    |                | 
    |                |          Kx  = (Z11 - Z00 + Z10 - Z01) * (1/2)
    |                |          Ky  = (Z11 - Z00 - Z10 + Z01) * (1/2)
    |                | 
    Z(0,0) _ _ _ _ _ Z(1, 0)


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour bonjour,
    Citation Envoyé par wiwaxia Voir le message
    [...] On a accordé beaucoup trop d'importance (moi le premier) à des simplifications anecdotiques dont l'intérêt apparaît finalement contestable, à part soulager le lecteur tétanisé par les mathématiques .
    Ah, je me reconnais, là,

    Bon, j'avais dit que je me pencherais sur CIE L*a*b* et son complément "cylindrique" CIE L*C*h, c'est chose faite.
    J'ai rajouté une option dans mon prog de test pour colorer les cellules (je suis parti d'une bête fonction LCHtoRGB, qui englobe LCHtoLAB, puis LABtoXYZ et enfin XYZtoRGB), et je m'appuie toujours sur la fonction "BlackBox" d'il y a quelques jours pour la couleur des textes, et ça donne ça :
    Nom : test_CIELCh.png
Affichages : 354
Taille : 37,7 Ko

    Il reste des cafouillages, notamment en col 5 ligne 2, col 6 ligne 7 et dernière col ligne 5, je crois que c'est inévitable, mais dans l'ensemble c'est pas mal du tout.
    Ceux qui veulent pinailler/affiner se rajouteront un curseur pour contrôler la BlackBox et hop !
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  18. #138
    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 : 77
    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 Du grabuge résultant des fonctions discontinues dans les calculs internes
    Bonjour,

    Envoyé par wiwaxia
    [...] On a accordé beaucoup trop d'importance (moi le premier) à des simplifications anecdotiques dont l'intérêt apparaît finalement contestable, à part soulager le lecteur tétanisé par les mathématiques .

    Ah, je me reconnais, là,
    Tu n'est pas le seul, et cela ne t'empêche pas de mettre au point de belles palettes.

    ... Il reste des cafouillages, notamment ... , je crois que c'est inévitable, mais dans l'ensemble c'est pas mal du tout ...
    Il y a toujours des cas décevants, près de la frontière, que rien n'interdit de déplacer un peu (L = 24 ou 26 %); tu es par ailleurs désavantagé par la finesse des caractères affichés, qui ne facilite pas leur perception: essaie, si tu peux, le passage aux caractères gras.

    # C'est seulement après coup, faute d'un bonne vue, que j'ai perçu l'aspect fortement dégradé du tracé des graphes d'égal éclairement L(x, y) = Cte; cette altération ne relevait ni de la présence des pixels, ni de la compression.

    La cause a été vite repérée: le balayage comportait le calcul de 5 points par pixel, afin de maintenir la continuité du graphe et d'éviter l'apparition des pointillés; et la détermination de la luminance locale L(x, y) passait par celle du pixel virtuel correspondant, triplet d'entiers obtenus par arrondi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE Pixel = ARRAY[1..3] OF Byte;
    Tout est rentré dans l'ordre après son remplacement par un vecteur de (R3), triplet de réels qui dispense d'utiliser la fonction Round(.):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE Lst3R = ARRAY[1..3] OF Extended;
    Ainsi la seconde image, dont les dessins ont été soustraits:

    # Avant correction: Nom : CPJNo_400x400_Discontinu.gif
Affichages : 367
Taille : 64,1 Ko # Après: Nom : CPJNo_300x300_Continu.gif
Affichages : 359
Taille : 64,1 Ko

    Le contraste devient saisissant au voisinage des points singuliers, lorsque la luminance L(x, y) devient quasi-constante: les isophotes sont alors méconnaissables - elles correspondent toujours à L = 0.25 , mais il a fallu monter à 15 points calculés par pixel afin de préserver la continuité, compte tenu de l'inclinaison des branches.

    # Avant correction: Nom : 222.222.224_100.100_K15_Discont.gif
Affichages : 361
Taille : 62,5 Ko # Après: Nom : 222.222.224_100.100_K15_Continu.gif
Affichages : 347
Taille : 62,0 Ko

    D'où la nécessité de prendre garde à l'usage involontaire des fonctions discontinues (Round, Int, Trunc ... etc) en cours de calcul.

    Je crois avoir lourdement insisté sur ce point par le passé Faîtes ce que je dis, ne faîtes pas ce que je fais !


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 133
    Points
    15 133
    Par défaut
    Bonjour,

    je reviens sur ce sujet 9 mois tout ronds plus tard (à 3 jours près, on va pas chipoter), juste le temps de faire un beau bébé,

    Ayant détecté des accrocs dans la première version (
    Citation Envoyé par Jipété Voir le message
    Il reste des cafouillages, notamment en col 5 ligne 2, col 6 ligne 7 et dernière col ligne 5
    ), j'ai remis tout ça sur l'établi à l'atelier, j'ai repris la perceuse, la lime et le marteau, l'accouchement a été un peu laborieux, voir ici, mais au final, tout est bien qui finit bien.

    Pour vous montrer, j'ai réalisé ce petit .gif avec des couleurs de fonds de cellule aléatoires, et les couleurs du texte à la recherche du contraste perdu (on dirait du Proust, ).
    Il y a 3 images qui s'enchaînent, les différences de rendu sont pilotées par une variable "seuil" qui oscille entre 16 et 20 par pas de 2, répercutée sur la variable L du triplet LCh.
    Nom : contrastes_en_lch.gif
Affichages : 372
Taille : 84,9 Ko

    Entre 16 et 20 il y a 18, qui correspond dans la littérature au milieu du chemin visuel allant du noir au blanc.

    Ma fonction de création de couleur inversée devient donc (seuil = variable globale positionnée par un curseur) :
    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
    function CouleurOpposee(Lorig, Corig, Horig: double): TColor;
    var
      Lopp, Copp, Hopp: double; // LCH opposé
    begin
      // 90 et 10 sont arbitrairement choisis pour donner des couleurs très claires ou très sombres,
      // très saturées ou très peu saturées, à l'inverse de la couleur originale
     
      if Lorig < seuil then Lopp := 90 else Lopp := 10; // inversion avec seuil pour L
      if Corig < 50 then Copp := 90 else Copp := 10;    // inversion sans seuil pour C, fixé à 50
      if Horig < 180 then Hopp := Horig + 180 else Hopp := Horig - 180; // diamétral. opposé sur le cercle chroma
     
      // 2 cas particuliers : noir et blanc
      if (Lorig =   0) and (Corig = 0) then begin Lopp := 100; Copp := 0; end;
      if (Lorig = 100) and (Corig = 0) then begin Lopp :=   0; Copp := 0; end;
     
      // sécurités :
      if Hopp < 0 then Hopp := 0; if Hopp > 359 then Hopp := 0;
     
      Result := LCHtoRGB(Lopp, Copp, Hopp);
    end;

    Passez de bonnes fêtes avec tout ça,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  20. #140
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 193
    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 193
    Points : 28 077
    Points
    28 077
    Par défaut
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/06/2015, 13h03
  2. Calculer un bon contraste d'une couleur
    Par Cypselos dans le forum Traitement d'images
    Réponses: 11
    Dernier message: 20/11/2009, 17h16
  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, 10h24
  4. Déterminer si une image est en couleur
    Par ImagingAllthe dans le forum Images
    Réponses: 2
    Dernier message: 26/02/2008, 15h48
  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, 15h23

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