# Gnral Dveloppement > Algorithme & Mathmatiques > Traitement d'images >  Dtermination d'une couleur contraste

## sevyc64

Bonjour,

Je poste ici mme si c'est pas le forum le plus ddi, c'est pas du traitement d'image  proprement parl.
En fait tous les forums pourraient tre concerns.

Dans un logiciel, j'ai un contrle o l'utilisateur peut librement dfinir la couleur de fond (background). Comment et sur quels critres je peux automatiquement dterminer une couleur contraste pour le text (Foreground) qui sera affich dans ce contrle.
Je n'ai la couleur de fond que sous la forme RGB. Je me limiterais  2, ventuellement 3 si ncessaire, couleurs de texte,  savoir Noir ou Blanc (3me  dterminer si besoin).
Ex : Si j'ai un bleu sombre, je prend blanc, mais si j'ai un bleu clair, je prend noir, rouge donne blanc, etc ....

Existe-il des mthodes, des formules, quelque chose ?

----------


## sevyc64

Un lien m'a t donn sur le chat : https://www.w3.org/TR/WCAG20-TECHS/G17.html

 ne donne pas la formule magique, mais a donne quand mme des explications. Je vais voir ce que je peux en tirer.

----------


## tbc92

Btement, je ferais a, c'est simple, et a marche pas trop mal :



```

```

Dans les faits, les chelles R V B ne sont pas perues ""linairement"" par l'oeil humain. Je m'explique : Si je remplace une couleur (R,V,B) par (R,V,B+10), l'oeil humain ne verra quasiment aucune diffrence si on est dans des couleurs sombres, alors qu'il verra une diffrence si on est dans des couleurs claires (en tout cas,  j'ai l'impression que mon oeil ragit comme a). Et l'oeil humain serait plus sensible  une diffrence V --> V+10 qu' une diffrence B --> B+10 ... d'o l'intrt des fonctions plus complexes exposes dans le lien en question.

----------


## Jipt

Salut,



> Btement, je ferais a, c'est simple, et a marche pas trop mal :
> 
> 
> 
> ```
> 
> ```


Euh, a serait pas l'inverse, plutt ?


```

```

Si rouge tend vers full alors rouge_oppos tend vers noir sinon tend vers full.

----------


## sevyc64

Le problme est que moi je vais me limiter  seulement 2 couleurs pour le texte, noir, et blanc.

D'aprs les premiers tests, trs trs rapides, que j'ai fait par rapport au lien donn, j'obtiens pas toujours des rsultats joyeux.

J'ai pas encore regarder les autres propositions.

----------


## tbc92

Dans ce cas, une solution 'basique' : 


```

```

Si on veut rester trs simple, mais se rapprocher de ce qui est dit sur ton lien, on peut faire :


```

```

Mais ce qu'on peut noter, c'est que quand la couleur de fond est proche du gris (disons R entre 110 et 130, et idem pour G ; B a peu d'impact) alors ni le blanc ni le noir ne conviennent selon ton lien ; dans les 2 cas, l'cart de luminosit entre le fond et la police sont insuffisants.

----------


## sevyc64

> Dans ce cas, une solution 'basique' :


Idem, ta formule ne marche pas pour toutes les couleurs. Par exemple, pour les couleurs RGB(1,247,89) et RGB(7,221,101), a me donne du blanc alors que c'est des couleurs claires. De mme pour la couleur RGB(137,61,189), a me donne noir alors que c'est une couleur sombre.

Plus je fais de tests et plus j'ai l'impression qu'il n'y a pas de formule magique pour trouver automatiquement la meilleure couleur de texte par rapport  celle du fond.


EDIT : La dernire formule serait peut-tre la moins mauvaise, mais elle fait pas de miracle non plus, pour certaines couleurs ca pas forcment la bonne couleur de text qui est choisie

----------


## tbc92

Effectivement, sur les 2 premiers jeux de donnes proposes, ma formule 'basique' donne du blanc, alors que la 2me formule donne du noir.
Pourquoi n'utilises-tu pas cette 2me formule ?


```
Si R*0.2126+V*0.7152+B*0.0722 >  117 alors C2=Noir sinon C2=Blanc
```

Ma formule archi-basique donne la mme importance au bleu et au vert. Ton site donne en gros 10 fois plus d'importance au Vert qu'au bleu ; a fait une diffrence norme.

----------


## sevyc64

c'est ce que je dis dans l'dit, la seconde formule semble un peu moins mauvaise, elle corrige les 3 exemples mauvais avec ta formule basique, mais il y a d'autres jeux de couleur qui ne sont pas non plus joyeux. Certains d'ailleurs taient, eux, correct avec ta formule basique.

C'est pour a que je commence  me dire que la formule magique n'existe pas, qu'il y aura toujours des couples malheureux, car je ne trouve aucune relation vidente, que ce soit dans l'volution des valeurs RVB ou des valeurs HSB pour dterminer le seuil  partir duquel changer de couleur de texte.

----------


## tbc92

Ce que veut Sevyx, c'est choisir soit noir, soit blanc. Et donc dterminer si la couleur en entre est claire ou fonce.


Si on se rfre au site donn, et qu'on l'applique  la lettre, a va donner :



```

```

----------


## wiwaxia

Bonjour,  ::): 

Il y a plusieurs questions en cause:

1) Comment associer entre elles deux couleurs quelconques et suffisamment contrastes ? des fonctions discontinues telles que:


```

```

dont le graphe ne prsente aucun point d'intersection sur [0 ; 255] avec la 1re bissectrice (y = x), donc aucun point stationnaire (F(x) = x) , devraient conduire  un contraste suffisamment marqu, puisque l'on aurait pour chacun des indices de couleur (r, v, b):
|y - x| = a ou (255 - a) selon le domaine o l'on se trouve, donc |y - x| >= Min(a, (255 - a)) .
Des perfectionnements sont possibles, mis ce n'est pas ici le sujet.

2) Si le rsultat attendu se restreint aux extrmes (blanc ou noir), les 2 droites prcdentes seront remplaces par des paliers horizontaux:


```

```

 C'est ce qui a dj t propos, mais reste  ce stade encore insuffisant parce que l'on obtiendrait selon la teinte de dpart l'une des 8 couleurs simples correspondant aux 8 sommets du domaine cubique des indices (r, v, b); il faut donc caractriser la couleur initiale par une donne unique, la "luminance relative" (je ne suis pas sr que ma traduction soit correcte, mais peu importe).

3) Il faut alors se coltiner l'expression normalise de cette fonction F(r, v, b), qui a imprativement besoin d'une cure d'amaigrissement.
a) On remarque que la partie linaire se restreint au domaine: IsRGB <= 0.03928 , soit encore: 
I8bit <= 255 * 0.03928 = 10.0164 ~ 10 , 
limite  en-dessous de laquelle la couleur devient indiscernable (et mme bien au-dessus !); comme de plus on s'intresse  les luminances moyennes, pour lesquelles le seuil critique est beaucoup plus lev, nul besoin de cette expression conditionnelle; on vire donc l'alternative <_IF ... THEN ... ELSE ..._> .

b) Cette luminance relative est donne par la combinaison linaire: L = 0.2126 * R + 0.7152 * G + 0.0722 * B
que l'on peut numriquement prsenter sous la forme: L = 0.7152*(0.29726 * R + G + 0.10095 * B)   ::weird:: 
et qui compte tenu de la simplification prcdente deviendra:

L = (0.7152/1.0552.4)*(0.29726 * (RsRGB + 0.055)2.4 + (GsRGB + 0.055)2.4 + 0.10095 * (BsRGB + 0.055)2.4) , 
soit encore:   ::calim2:: 
L = K*(0.29726 * (R8bit + m)2.4 + (G8bit + m)2.4 + 0.10095 * (B8bit + m)2.4)   ::help:: 

avec m = 0.055 * 255 = 14.025 et K = (0.7152/1.0552.4/2552.4) = 1.0542E-6 .
La luminance relative maximale (Lmax) est par dfinition gale  l'unit, et correspond au blanc le plus brillant (255, 255, 255).

c) Enfin nul besoin de calculer l'expression complte, puisque l'on se contentera de la comparer au seuil arbitraire sparant les teintes sombres des claires; d'o la nouvelle grandeur proportionnelle  la prcdente:
L1 = (L / K) = (0.29726 * (R8bit + m)2.4 + (G8bit + m)2.4 + 0.10095 * (B8bit + m)2.4) ,
qui admet pour valeur maximale: L1max = L1(255, 255, 255) = 948582 = (Lmax / K) = (1 / K) .

Il suffira donc de reprendre l'algorithme initial en posant x = L1 et a ~ 500000 (limite  choisir).

On peut,  ce stade, se contenter d'une relation numrique raisonnablement allge:
L1 =  (0.297 * (R8bit + 14)2.4 + (G8bit + 14)2.4 + 0.101 * (B8bit + 14)2.4) .

----------


## isangoma

Bonjour,

J'arrive un peu a la bourre, mais pourquoi ne pas passer par le system HSV ?
Je n'ai pas fais de test, mais je dirais un truc du genre.
1) RGV -> HSV
2) On prend H' = H + 180 (la roue chromatique done des couleurs oppose tres contrastes)
                 S' = 1.0 - S
                 V' = 1.0 - V
3) H'S'V' -> RGB pour avoir la couleur de fond.

[Edit]
Je viens de coder le truc sous opencv. Apres plusieurs test voici les resultats:
Quand on est en HSV, il n'est pas utile de modifier le S. Le V ne doit etre modifier que si le V du texte est trop faible (< 0.5).

Avec une image contenant des resultat pris au hasard


Et voici le code utilis pour gnrer l'image



```

```


Les conversion RGB-> HSV viennent de stack overflow : Code pour convertir.

----------


## tbc92

A l'origine, la question tait : Choisir une couleur (Soit NOIR, soit BLANC, uniquement 2 options), qui donne un contraste suffisant. Donc pas la couleur obtenue par ta formule.

----------


## Jipt

Salut,

Quelque chose comme a, alors ? :



Me suis bas sur HSL (L varie de blanc  noir) plutt que HSV, et voil le code en Pascal, qui utilise une TStringGrid nomme "sg" :


```

```

Les procdures myHSLtoColor et myColorToHSL s'appuient sur les formules qu'on peut trouver l.

----------


## sevyc64

Il n'y a pas apparemment de formules magiques. 

De ce que j'ai test, perso, c'est la formule donne par wiwaxia au post 11  qui est la moins mauvaise, mais elle donne quand mme quelques choix de couleurs pas trs heureux.(je n'ai pas retester d'autres choses depuis)

De ce que tu montre Jipt, il en va de mme. Colonne 2 ligne 5, et colonne 3 ligne 2 c'est un peu limite. Colonne 3, ligne 8, a passe pas.
a peut paraitre acceptable dans des petits carrs de tests comme a, mais lorsque c'est dans une grille d'une 20ne de colonnes et jusqu' 1000 lignes voire plus, a peut se rvler assez vite fatiguant.

Pour le moment l'application va finalement partir avec un texte noir impos, l'utilisateur choisira sa couleur de fond,  lui de voir ce qui contraste le mieux ou pas (avec 16 millions de couleurs possible quand mme).
On prvoie finalement a pour une version 2, qui ne verra probablement jamais le jour car l'utilisateur, une fois qu'il aura choisi ses couleurs, ne va pas en changer tous les 4 matins.

----------


## Jipt

> Colonne 3, ligne 8, a passe pas.


D'accord.
Il faudrait surement moduler le premier test (

```

```

) par des adaptations lies  la valeur de H : si (L = blanc) and (H = couleur_claire [jaune, rose, vert pâle, bleu ciel]) alors L := noir.
Mais l a devient du tuning pointu pointu et je n'ai pas eu trop le temps de finasser.

----------


## wiwaxia

*Jipt* a vu l'essentiel



> ... 
> Il faudrait surement moduler le premier test (
> 
> ```
> 
> ```


mais il reste  choisir la valeur du seuil de luminance (L = s ou L1 = s * L1max = s * 948582), au voisinage duquel se produit le basculement du noir au blanc. Ce choix exprimental n'est pas du tout vident:



> Il n'y a pas apparemment de formules magiques. 
> De ce que j'ai test, perso, c'est la formule donne par wiwaxia au post 11  qui est la moins mauvaise, mais elle donne quand mme quelques choix de couleurs pas trs heureux. ...


Bien que l'expression de la luminance tienne compte de la sensibilit de la rtine humaine aux diverses composantes (r, v, b), il faut s'assurer pour un seuil donn (s) du meilleur contraste possible (noir/blanc), pour toutes les teintes abordables - et il y en a une infinit ( luminance fixe) dpendant de deux paramtres - par ex. (r/v) et (b/v).
En consquence tester une srie de valeurs du seuil (s = 0.55, 0.50, 0.45, ... ?) pour 7 couleurs principales:
# rouge, vert, bleu: _ _ _ (u, 0, 0), (0, u, 0), (0, 0, u)
# cyan, pourpre, jaune et gris: _ _ _ (0, u, u), (u, 0, u), (u, u, 0) et (u, u, u).

L'entier (u) dpend du seuil (s), ainsi que de la teinte choisie, d'o sept calculs en vue, pas difficiles mais fort indigestes, et qui ne rjouissent personne. 
Un programme s'en chargera, et pourrait conduire  une srie de 14 images (comportant une chane de caractres en noir ou blanc) semblables  celles que deux d'entre vous ont dj donnes.

Un calcul unique est envisageable en introduisant *3 grandeurs bivalues (x, y, z)*, dont *chacune peut tre gale  (0) ou (1)*, et en posant:
R8bit = u * x ; G8bit = u * y ; B8bit = u * z ;
(u) vrifie alors l'quation: L1 =  (0.297 * (u * x + *14 * x*)2.4 + (u * y + *14 * y*)2.4 + 0.101 * (u * z + *14 * z*)2.4) .

La bizarrerie du rsultat vient de ce que la formule gnrale : 
L1 =  (0.297 * (R8bit + 14)2.4 + (G8bit + 14)2.4 + 0.101 * (B8bit + 14)2.4) 
ne s'applique plus aux faibles indices (Icoul < 10), et que le terme correspondant s'annulle en mme temps que (x, y) ou (z).
L'expression L1 =  F(u) est  prendre comme relation algorithmique, et non algbrique; elle peut se simplifier considrablement:
L1 =  (u + 14)2.4 * (0.297 * x2.4 + y2.4 + 0.101 * z2.4) = s * L1max , et sa rsolution ne pose plus de difficult.

----------


## Jipt

Salut salut  ::coucou:: 



> *Jipt* a vu l'essentiel


Tu es trop bon.
Je me suis juste souvenu que le systme HSL fait varier L de blanc  noir, mais tout comme sevyc64 le remontait et comme tu l'as expliqu aussi, le systme ne fonctionne pas avec certaines couleurs pour lesquelles il faudrait inverser la rgle.
Une misre...




> La bizarrerie du rsultat vient de ce que la formule gnrale : L1 =  (0.297 * (R8bit + 14)2.4 + (G8bit + 14)2.4 + 0.101 * (B8bit + 14)2.4) 
> ne s'applique plus aux faibles indices (Icoul < 10)


La dernire ligne me parle (suis en train de lire "La gestion des couleurs pour les photographes, les graphistes et le prpresse" de J. Delmas chez Eyrolles, excellent pour s'endormir !  ::mouarf:: )
Et la premire ligne je lui ai tordue le coup comme a :


```

```

Au final, en scrutant des patches de couleurs R G B Y C M avec un ColorPicker maison, j'en ai sorti a :


```

```

mais je ne sais pas quoi en faire...
Et d'abord, sont-ce les bonnes valeurs (je veux dire, sont-elles dans les clous, dans ce qu'on est suppos obtenir) ?
On verra aprs pour quand Icoul < 10...




> --snip-- et sa rsolution *ne pose plus de difficult*.


Parle pour toi  ::ptdr::

----------


## Jipt

Bon, je ne rsiste pas au plaisir de vous poster cette premire victoire (qu'il faudra sans doute amliorer, mais  chaque jour suffit sa peine, et les rsultats encourageants incitent  progresser. Nan ?)

Et donc :


Le rouge en haut  gauche est  255,1,1 ; dessous le vert augmente de 16 : 255,17,1 et ainsi de suite.
 ct le jaune est classiquement  255,255,1, le vert  1,255,1, le cyan  1,255,255 et cette colonne est trs intressante car au voit au milieu le basculement du texte de noir  blanc, trs exactement  1,128,255, et c'est + ou - pareil pour les autres colonnes, chacune en ce qui la concerne, particulirement la 1 et la 6, or, verticalement, l'cart d'une ligne  la suivante est de 16, rgulirement.
C'est pas mal du tout, wiwaxia !
 :+1: 
D'autant plus qu'un premier test avait lamentablement foir pour la bonne et simple raison que sur cette grid, incroyable mais vrai, un ColorPicker me montre que la valeur de L (si j'extrais HSL de la couleur de la cellule) est partout la mme, aussi bien sur le jaune le plus clair que le bleu le plus sombre ! Trs surprenant...

Comment j'ai fait :
1- une fonction avec la formule magique 

```

```

2- son utilisation 

```

```


J'ai dtermin 25 en regardant un premier rsultat bas sur 50 et sur ces donnes (valeurs brutes -- arrondies -- raccourcies -- encore un point) :


```

```

Les 3 dernires lignes sont "sombres" et ncessitent donc du texte blanc.
Faudra voir ce que a va donner avec un fond de grid plus randomized, comme mon premier essai, mais a va bien comme a pour ce soir.
That's all, folks !

----------


## wiwaxia

Bravo pour la palette !  ::ave::   ::ccool:: 

Trs flatt par l'identificateur de fonction ...



> ... Comment j'ai fait :
> 1- une fonction avec la formule magique
> Code pascal : 	
> 
> 
> ```
> function CalculeLwithWiwaxia(R,G,B: byte):integer;
> ```


... je ne me savais pas dot de super-pouvoirs, lesquels me seraient bien utiles depuis tout  l'heure, o je me suis lanc dans l'exploration numrique de la fonction en question.  ::pc:: 

Je posterai les calculs demain.

----------


## Jipt

> Bravo pour la palette !


Bravo pour ta formule magique !

Ce matin j'ai rajout une 7e colonne (!) noir->blanc, et une option pour avoir des couleurs alatoires dans les 6 autres.
a donne ce qui suit, ce qui est moche c'est que l'alatoire n'a pas l'air au mieux de sa forme (colonne 5 zone "vert d'eau", il n'y a que le rouge qui varie, et rgulirement  ::koi::  -- bah, si quelqu'un a une ide c'est bien, sinon c'est pas grave du tout) :


Le code (les machins qui commencent par jp ou my, c'est mes fonctions perso, vous virez ces prfixes et c'est tout bon -- sous Lazarus) :


```

```

Enjoy !

EDIT : j'ai rajout un trackbar qui va de 0  88 pour jouer sur le coeff de basculement Noir/Blanc, ce qui est rigolo c'est qu' 0 (zro), les deux cellules les plus sombres ne basculent pas :


```

```


alors qu' 88 tout le monde bascule, dans l'autre sens.
a doit tre ce dont tu parlais avant-hier, wiwaxia, cette histoire de mauvaise rponse dans les trs basses lumires. Bah...

----------


## wiwaxia

Bonjour,  ::salut:: 

Tu t'es apparemment lanc dans des calculs de luminance, sur des couleurs proches de celles des sommets du cube (rvb), en suivant - bonne ide - l'ordre dcroissant des grandeurs calcules.



> Et la premire ligne je lui ai tordue le coup comme a :
> 
> 
> ```
> 
> ```
> 
> Au final, en scrutant des patches de couleurs R G B Y C M avec un ColorPicker maison, j'en ai sorti a :
> 
> ...


Rien  redire aux rsultats, dont les valeurs sont proches des limites que j'ai calcules,  l'exception de la dernire qui devrait tre nulle par dfinition: tu as utilis la formule simplifie l o elle est totalement invalide, et trouv L = 948228*(14/269)2.4 = 787 .

# D'abord le calcul littral, qui n'a pas provoqu un enthousiasme irrsistible:



> Envoy par wiwaxia: _ ... et sa rsolution ne pose plus de difficult._
> Parle pour toi


On envisage donc les sept couleurs - autres que le noir, sans intrt - dont les composantes non nulles sont gales et donnes par la relation: (r, v, b) = (u*x, u*y, u*z) , avec (9 < u <= m = 255) et (x, y) et (z) valant (0) ou (1) * l'exclusion de tout autre valeur*.
Alors (et dans ce cas seulement) la luminance de la couleur considre admet pour expression:
L1c =  (u + 14)2.4 * F(x, y, z) = s * L1max avec F(x, y, z) = (0.297 * x2.4 + y2.4 + 0.101 * z2.4) et L1max = 948228 (maximum absolu observ pour le blanc).
La mme couleur - caractrise par le mme triplet (x, y, z) - prsente  son maximum d'clat (u = m) la luminance maximale:
L1cm =  (m + 14)2.4 * F(x, y, z) , et l'on obtient par le rapport des quantits correspondantes:

(s * L1max) / L1cm = (u + 14)2.4 / (m + 14)2.4 , soit encore:

(u + 14) / 269 = (s * L1max / L1cm)(5/12) , d'o l'expression finale de (u), qui dpend du seuil (s) que l'on s'est donn:

u = 269 * (s * L1max / L1cm)(5/12) - 14 , et qui doit (rappelons-le) vrifier les conditions: (9 < u <= m = 255).

# Et c'est l que cela se gte, lorsqu'on s'avise de passer aux valeurs numriques; j'ai repris tes rsultats, et complt le tableau:



```

```

L'cart entre les luminances extrmes est si grand (Lmblanc/Lmbleu = 13.8) qu'il est difficile de trouver un seuil accessible  toutes les nuances de couleurs envisageables, dfinies par les couples (r/(r+v+b) , b/(r+v+b)); le domaine est restreint aux valeurs limites:
a) s1 = 3.03E-3 correspondant au gris trs sombre (10, 10, 10);
b) s2 = 7.23E-2 correspondant au bleu pur (0, 0, 255).
Je vois mal comment utiliser en pratique, sur le domaine entier des couleurs,  la luminance comme critre de distinction entre teintes claires et sombres, bien qu'elle se rattache  une tude approfondie de la sensibilit de l'oeuil; et l'on comprend la dception de l'auteur du sujet:



> Il n'y a pas apparemment de formules magiques. 
> De ce que j'ai test, perso, c'est la formule donne par wiwaxia au post 11  qui est la moins mauvaise, mais elle donne quand mme quelques choix de couleurs pas trs heureux ...


Une tude empirique du contraste fournira des rsultats plus rapides et plus srs - mme s'ils sont plus flous.

PS: fin du texte  reprendre (voir le message suivant).

----------


## wiwaxia

Aprs un premier mouvement de dception d  la lourdeur des calculs, je m'aperois, en relisant la liste des valeurs maximales, que j'ai fait preuve d'un pessimisme excessif: la mdiane L = (1/2)*Lmax = 948228 / 2 = 474114 se situe aprs tout entre le 4me et le 5me terme, sparant ainsi les 4 couleurs principales les plus brillantes (blanc, jaune, cyan et vert) des 4 autres, ce qui est conforme au bon sens. 
Que le pourpre, le rouge et le bleu restent classs sombres quelle que soit la valeur des indices, cela n'est pas tonnant et l'on n'y peut finalement rien. Je m'accrochais hier  l'ide (fausse) que la surface d'quiluminance mdiane (L(r, v, b) = 0.5*Lmax) devait absolument recouper les axes du repre dans l'intervalle [0 ; 255] - il n'en est rien, cela n'est vrai que pour le vert (v = 218).

J'ai repris les calculs des indices, pour les couleurs principales, dans le cas o le seuil de luminance prend les valeurs:
1) s = L1m(vert) / L1max = L1cm[4] / L1max = 678274 / 948228 = 0.7153 ;
2) s / 1 / 2 ;
3) s = L1m(pourpre) / L1max = L1cm[5] / L1max = 269953 / 948228 = 0.2847 .


```

```

  ::yaisse::  On dispose ainsi d'un domaine large et raisonnable (de 28.5  71.5 %) pour choisir la valeur du seuil (s).

----------


## Jipt

> On dispose donc d'un domaine large et raisonnable (de 28.5  71.5 %) pour choisir la valeur du seuil (s).


Je me doutais que tu allais encore nous balancer une tripote de calculs,  ::ptdr:: , alors j'ai suivi mon petit bonhomme de chemin, et a donne le gif ci-dessous dont les images sont longues  changer, pour avoir le temps de les voir : 3 secondes !
Et il y a 3 sries qui se suivent :
- d'abord le fond avec les dgrads dj prsents et la variation de 0  88 grce  un curseur ;
- ensuite un fond alatoire avec la mme variation du seuil, de 0  88 ;
- et enfin, des fonds alatoires pour un seuil qui ne varie pas, cal  25.



Vous voulez le code ? Toujours en Lazarus :


```

```

Toujours le mme topo avec les prfixes _jp_ et _my_  virer, et ceux qui mettront a dans du Delphi auront un poil d'adaptation  faire (genre remplacer aRect par Rect).

----------


## wiwaxia

Vraiment bien, l'image alatoire !  :+1:  ::bravo:: 
Il faut que je me mette  Lazarus.
Quel seuil as-tu pris pour le changement blanc/noir ?

----------


## Jipt

> Vraiment bien, l'image alatoire !


Merci merci  ::ccool:: 




> Il faut que je me mette  Lazarus.


'tention, c't'une bestiole capricieuse, avec des sautes d'humeur et un caractre parfois un peu tatillon...




> Quel seuil as-tu pris pour le changement blanc/noir ?


Euh, j'ai utilis le curseur qu'on voit en bas de l'image, variant de 0  88 pour les deux premires sries et fix  25 pour la troisime :
quelque part dans la procdure de calcul : if (Ltmp <= *coeff*) then L := 1 else L := 0; et positionn par 

```

```

Bon dimanche (et encore merci pour la "formule magique"  :+1: )

----------


## Jipt

Bonjour,

J'ai un souci...
Je me suis attaqu  ce qui n'tait pas demand,  savoir le texte dans la couleur oppose  la couleur de son contenant (je suis intress).

En mode bourrin rapide, j'ai fait a :


```

```


qui fonctionne dans 80 % ( la louche) des cas, mais il y a des rsultats curieux, parfois, comme par exemple sur cette image qui reprsente la bas de la grille en mode "random" et le texte en mode B/W grce  la formule magique.
J'ai rajout en bas un mmo (mmoTest) pour faire office de zone de test et deux boutons-radio pour choisir.


Et comme on peut le voir, le texte est blanc avec la formule magique en mode B/W et trs fonc (rgb 22 34 31,  hsl 165 21 11) en mode couleur inverse du fond (rgb 225 89 115, hsl 347 70 61).
Avec cette couleur de fond ce n'est pas trop gnant, mais j'ai eu d'autres cas plus problmatiques...
Par exemple ce couple avec le fond  rgb 74 8 254 hsl 256 99 51 et le texte  rgb 4 5 2 hsl 80 43 1.


Comment amliorer ces rendus ?
Le fond est trs bleu (rgb 254, hsl 256), l'inversion a fonctionn (hsl 80 c'est jaune) mais le L  1 plombe tout...

Par ailleurs, le seuil de basculement B/W est trs sensible, regardez (images rduites),  gauche rgl  31 et  droite  32, 1 point de plus et 3 textes noirs ont bascul, je les ai reprs  droite par des ronds rouges et je trouve que le basculement n'est pas trs heureux pour la cellule orange (celle du bas) :

----------


## wiwaxia

Bonsoir,  ::D: 

Quelques observations concernant les nombreuses informations que tu as donnes:

1)  propos de l'expression approche de la luminance L(r, v, b): la premire troncature est rendue inutile par la rduction importante du nombre de chiffres significatifs qui intervient ensuite; le codage de la fonction concerne 


```

```

 pourrait se rduire :


```

```

et admet pour limite suprieure Round(94.8228) = 95; elle reprsente donc approximativement le seuil (s), exprim en pourcentage.

2) 


> Je me doutais que tu allais encore nous balancer une tripote de calculs,


Sans malice aucune. J'avais au dpart beaucoup de mal  ::weird::   saisir la forme et l'emplacement des surfaces d'quation L(r, v, b) = Cte, d'o les premiers ttonnements numriques. J'indiquerai plus loin (si j'en ai le temps) une mesure  prendre dans une telle situation.

3) 


> ce qui est rigolo c'est qu' 0 (zro), les deux cellules les plus sombres ne basculent pas ...  alors qu' 88 tout le monde bascule, dans l'autre sens.


Le problme, c'est le cas de l'galit  la limite:


```

```

dont la probabilit n'est pas du tout ngligeable dans le cas de ta fonction; et la faible sensibilit de cette dernire (au plus gale  95) aggrave encore la situation; on trouve ainsi dans le cas des noirs les plus sombres (x, x, x): 


```

```

(a)  valeur fausse, la relation ne s'appliquant pas aux faibles indices, infrieurs  (10); mais l'arrondi fait ici disparatre l'erreur.
 seuil nul, tes instructions classent les 16 premiers noirs sombres, et tous les autres clairs.
Pour la fonction initialement propose L1(r, v, b), qui peut atteindre 948228, l'ventualit d'une galit devient ngligeable.

4) 



> ... En mode bourrin rapide, j'ai fait a :
> ... *qui fonctionne dans 80 % ( la louche) des cas, mais il y a des rsultats curieux, parfois,* comme par exemple sur cette image ...
> ... mais *j'ai eu d'autres cas plus problmatiques* ...
> ... Par ailleurs, *le seuil de basculement B/W est trs sensible* ...


Lorsque l'on dplace un tant soit peu une frontire (ici la luminance) dpartageant un ensemble de couleurs alatoirement dfinies, un petit nombre d'entre elles se retrouve de l'autre ct, et d'une manire imprvisible: il n'y a l aucun dysfonctionnement du logiciel, j'ai test les indices pour quelques exemples cits.
Je reprendrai plus loin les dtails.

----------


## Jipt

Bonjour,

(je rponds sans utiliser "_Rpondre avec citation_", cette fonction ne fonctionne plus ce matin...) 

Concernant le 1er point, j'ai mis en application ta simplification, et de mon ct, ayant trouv de la lecture 


> https://imagej.nih.gov/ij/docs/menus/edit.html#memory
> The default weighting factors (0.299,0.587,0.114), which are based on human perception, are the ones used to convert from RGB to YUV, the color encoding system used for analog television
> 
> https://fr.wikipedia.org/wiki/Couleur
> Dans ce modle, utilis en tlvision, le blanc est compos de 29.9 % de rouge, 58,7 % de vert et 11,4 % de bleu.


, j'ai voulu faire un test comme a, en rajoutant une case  cocher (ckbxYUV) :


```

```


Il en ressort qu'avec le curseur de seuil  0 toutes les cases ont le texte noir, et  63 le dernier texte noir bascule  blanc : l'chelle est plus petite (0-63 vs 0-88) mais elle est complte.

La grande question, c'est : d'o sors-tu ces nombres (0.297, 1, 0.101) ? J'ai fouill le web, je trouve une page en rapport avec POVRay pour calculer le gris d'une couleur RGB, qui mlange les deux formules :


```

```

Voil (fouhhh, l'ergonomie du forum me fait souffrir, a laggue depuis ce week-end c'est une horreur...)

----------


## wiwaxia

1)


> ... Il en ressort qu'avec le curseur de seuil  0 toutes les cases ont le texte noir, et  63 le dernier texte noir bascule  blanc : l'chelle est plus petite (0-63 vs 0-88) mais elle est complte ...


J'ai dj parl de l'inconvnient d'une chelle trop rduite de valeurs entires.

2)


> ... La grande question, c'est : d'o sors-tu ces nombres (0.297, 1, 0.101) ?


Tout simplement de la factorisation du plus fort coefficient (0.7152) attach  la composante verte, afin que celle-ci se retrouve affect du facteur (1) dans la fonction simplifie servant de test. Voir le message #11 (14/01/2017, 13h43):



> ... Cette luminance relative est donne par la combinaison linaire: L = *0.2126 * R + 0.7152 * G + 0.0722 * B*
> que l'on peut numriquement prsenter sous la forme: L = *0.7152*(0.29726 * R + G + 0.10095 * B)* 
> et qui compte tenu de la simplification prcdente deviendra:
> L = (*0.7152*/1.0552.4)*(*0.29726* * (RsRGB + 0.055)2.4 + (GsRGB + 0.055)2.4 + *0.10095* * (BsRGB + 0.055)2.4) , 
> soit encore: 
> L = K*(*0.29726* * (R8bit + m)2.4 + (G8bit + m)2.4 + *0.10095* * (B8bit + m)2.4) 
> avec m = 0.055 * 255 = 14.025 et K = (*0.7152*/1.0552.4/2552.4) = 1.0542E-6 ...
> ... On peut,  ce stade, se contenter d'une relation numrique raisonnablement allge:
> L1 =  (*0.297* * (R8bit + 14)2.4 + (G8bit + 14)2.4 + *0.101* * (B8bit + 14)2.4) .


3) 


> ... J'ai fouill le web, je trouve une page en rapport avec POVRay pour calculer le gris d'une couleur RGB, qui mlange les deux formules :
> 
> 
> ```
> 
> ```


Rfrence curieuse,  creuser en amont. Mais ce bricolage qui bazarde les exposants (2.4), et donc la non-linarit, ne me plat pas beaucoup.

----------


## Jipt

(ah, a refonctionne...)



> 3) 
> Rfrence curieuse,  creuser en amont. Mais ce bricolage qui bazarde les exposants (2.4), et donc la non-linarit, ne me plat pas beaucoup.


Si on considre qu'un doigt s'est fait des nuds entre le 9 et le 7 ((0.29*9*, 0.58*7*, 0.114) vs (0.29*7*,0.58*9*, 0.114)) chez POVRay en recopiant la formule,  alors c'est celle de wikipdia, qui a peut-tre t recopie aussi par les gens d'ImageJ (qui n'ont pas l'air d'tre des gamins), et si j'ai bien compris, a vient des ingnieurs pour la conversion vers YUV.

Mais j'ai le souvenir d'avoir vu/lu d'autres formules, que je n'arrive pas  retrouver...

----------


## Jipt

> Il en ressort qu'avec le curseur de seuil  0 toutes les cases ont le texte noir, et  63 le dernier texte noir bascule  blanc : l'chelle est plus petite (0-63 vs 0-88) mais elle est complte.


Je ne sais pas ce que j'ai chang (quand je regarde le code, je rpondrais volontiers "rien !"), il n'empche qu' 0 maintenant j'ai encore 2 cases avec le texte noir, et que la bascule complte  blanc se fait  60.
Go figure...

----------


## wiwaxia

> ... *Si on considre qu'un doigt s'est fait des nuds entre le 9 et le 7* ((0.29*9*, 0.58*7*, 0.114) vs (0.29*7*,0.58*9*, 0.114)) chez POVRay en recopiant la formule,  alors c'est celle de wikipdia, qui a peut-tre t recopie aussi par les gens d'ImageJ (qui n'ont pas l'air d'tre des gamins) ...


Je n'irai pas jusque l, et je ne prtend pas qu'on ait affaire  des dbiles !  ::mrgreen::  Encore que parfois...
Au fait, quel est lien concernant POV Ray ?




> ... et si j'ai bien compris, a vient des ingnieurs pour la conversion vers YUV ...


Bonne remarque, justement: il faudrait s'assurer du type de coordonnes en cause ... mais l, je n'en ai vraiment pas le temps.

L'essentiel, c'est que l'expression de la luminance sur laquelle on change dans cette discussion est la meilleure de toutes, du point de vue de la photomtrie visuelle, et qu'aprs s'tre donn la peine d'tudier et de coder la fonction, ce serait du gchis que de la troquer contre une formule plus rudimentaire.

----------


## Jipt

> Au fait, quel est lien concernant POV Ray ?


C'est l o j'ai trouv cette macro de conversion RGB2Gray : 

```

```

EDIT : je viens de chercher un peu.
Ici, Matlab utilise 0.2989 * R + 0.5870 * G + 0.1140 * B

L, Intel roule (moins prcis que la prcdente) avec Y' = 0.299 * R' + 0.587 * G' + 0.114 * B'

Un Franais (c'est reposant, fais une recherche dans la page sur _NTSC_) utilise la prcdente et deux autres : Y = 0.2126 * rouge + 0.7152 * vert + 0.0722 * bleu (les valeurs utilises par OpenCV sont Rouge : 0.212671, Vert : 0.715160, et Bleu : 0.072169) et luminosit = 0.34 * rouge + 0.5 * vert + 0.16 * bleu  

Et enfin l, avec les mmes formules, il y a des images et des histogrammes, pour comparer  ::ccool:: 

Avec tout a y a de quoi faire,  ::P: 

EDITEDIT : et je ne rsiste pas  poster l'aide de The Gimp  propos de l'outil de dsaturation (c'est l qu'il y avait cette autre formule que je cherchais... Cette du milieu !) :



Maintenant, la diffrence entre Lightness, Luminosity et Average Brightness, je crois qu'on n'est pas rendu...  ::mouarf::

----------


## Jipt

Yep !

Je suis parti des formules trouves, j'ai pondu un truc viteuf, a donne a :


Lgende : 

```

```

Et si j'enlve le " * 0.0001 " dans la formule "magique" a donne une image toute merdique avec des dfauts, un vrai bazar non prsentable.

----------


## wiwaxia

Merci pour l'info sur POV Ray. L'anciennet de la rfrence ( 30 Mar 2001) devrait cependant inciter  la prudence (cette remarque concerne d'ailleurs la plus grande partie de la littrature sur POV Ray).

La documentation rassemble est impressionnante,  ::ccool::  mais concerne un autre sujet: la conversion des couleurs en niveaux de gris. Cela ne concerne plus la luminance, mais n'est pas sans rapport avec cette notion.

Je constate que les meilleurs rsultats proviennent de la formule dont les coefficients respectent la prsance: 
Cvert > Crouge > Cbleu .




> Et si j'enlve le " * 0.0001 " dans la formule "magique" a donne une image toute merdique avec des dfauts, un vrai bazar non prsentable.


 ::mrgreen::  Je crois deviner ce que tu as voulu faire: arrange-toi pour que ta nouvelle fonction L(r, v, b) culmine  255 en posant par exemple:


```

```

avant de poser r' = v' = b' = g = CalculeLwithWiwaxia(r, g, b) pour passer au gris.  

Je crois me rappeler la dfinition du niveau gris se fonde sur l'galit des luminances: L(g, g, g) = L(r, v, b); il suffit donc d'inverser la fonction F(g) = L(g, g, g) pour obtenir le niveau de gris correspondant: g = F-1(L) .

----------


## sevyc64

Alors, comment dire, lorsque j'ai ouvert ce sujet, j'tais loin de me douter qu'il susciterait autant dintrts. Je m'attendais mme  n'avoir aucune rponse concrete.
D'autant plus que je pense que ce sujet doit se poser assez rgulirement  plusieurs dveloppeurs. Ils trouveront ici nombre de rponses.

Ne m'en voulez pas, je ne peux dire qui de l'un ou de l'autre  raison. Je vous suis, de loin, en survol, j'ai normment de retard dans les tests de vos solutions. Ce que je retiens, c'est qu'effectivement la formule magique fantasme n'existe pas. Mais vous vous tes quand mme pas mal rapproch d'un rsultat proche de l'idal.

Continuez  faire avancer le schmilblick, je suis sur que a servira  plus d'un.

Quant  moi, lorsque je pourrais dgager une petite pause dans les projets en cours, faudra que je revienne par ici, pour tester et implanter une de vos solutions dans mes projets.

 ::bravo::   :+1:

----------


## Jipt

Yop !



> Alors, comment dire, lorsque j'ai ouvert ce sujet, j'tais loin de me douter qu'il susciterait autant dintrts. Je m'attendais mme  n'avoir aucune rponse concrete.
> D'autant plus que je pense que ce sujet doit se poser assez rgulirement  plusieurs dveloppeurs. Ils trouveront ici nombre de rponses.
> 
> Ne m'en voulez pas, je ne peux dire qui de l'un ou de l'autre  raison. Je vous suis, de loin, en survol, j'ai normment de retard dans les tests de vos solutions. Ce que je retiens, c'est qu'effectivement la formule magique fantasme n'existe pas. Mais vous vous tes quand mme pas mal rapproch d'un rsultat proche de l'idal.
> 
> Continuez  faire avancer le schmilblick, je suis sur que a servira  plus d'un.


T'imquites, il y a des sujets comme a (l'ami wiwaxia en sait quelque chose  ::coucou:: ) qui font marcher les neurones, c'est excellent pour ne pas vieillir et il se trouve qu'en ce moment je bricole un document avec beaucoup d'images NB sur lesquelles je dois appliquer des textes, un peu l'inverse de ton histoire, mais les principes restent les mmes : lisibilit maximum donc contraste  fond.

Mais sur un fond plein de gris variables, va le trouver ! M'en suis sorti en utilisant deux calques du mme texte, un en couleur claire l'autre en couleur fonce et dcals en hauteur et en largeur de 1 px et ma foi, a le fait pas mal :


Quant au reste, au gros morceau, voici une belle image :





> Merci pour l'info sur POV Ray. L'anciennet de la rfrence ( 30 Mar 2001) devrait cependant inciter  la prudence.


Pour comparer, j'ai mis cte  cte 0.299 0.587 et 0.297 0.589 sur la deuxime range, images 2 et 3 : il n'y a pas une norme diffrence, je n'ai trouv que deux patches diffrents (ou alors il aurait fallu crire une moulinette pour analyser tous les patches un par un, un peu la flemme, l, donc sondages par ColorPicker) :
1re colonne 1re range, 2e image* 75* 3e image *76*
5e colonne dernire range, 2e image *100* 3e image *101*




> Je constate que les meilleurs rsultats proviennent de la formule dont les coefficients respectent la prsance: 
> Cvert > Crouge > Cbleu .


Et donc les images  jeter sont les deux de la 1re ligne et les deux... tiennes (dernire ligne),  ::mrgreen:: 
2 tiennes car il y en a une dont j'ai trafiqu la formule (celle de droite, en lui rajoutant du vert) ce qui, curieusement, n'impacte pas les rsultats lus au ColorPicker.

J'avais dj signal que les 96 patches de dpart ont tous la mme valeur de L quand ils sont lus en mode HSL : ceci impacte sans doute ce qui prcde.

Faudrait maintenant que je me trouve une image "relle", de la vraie vie, pour la passer dans ces moulinettes.

D'un autre ct, il y a plein de gens trs pointus (les ing. de la tlvision NB) qui se sont pris la tte avec tout a il y a dj longtemps, je me demande si on ne perd pas notre temps  rinventer la roue...

'fin bon, si certains veulent en savoir plus, c'est trs simple : un nouveau projet, un bouton, un TOpenPictureDialog, 10 TImage et roule ma poule :


```

```


Les numros du case dans la fonction ReturnGray sont un peu en dsordre, c'est juste pour pouvoir comparer visuellement d'une manire trop cool  ::ccool::

----------


## wiwaxia

J'ai fait un peu de recherches sur la Toile, et la pellete de formules rcoltes en divers endroits ne m'a pas convaincu; entre autres ce que donne *le lien* donn par *Jipt*:



> Vous pouvez trouver en ligne plusieurs mthodes pour dfinir ce mlange des trois valeurs RGB. Par exemple, avec 
> le format PAL/NTSC (utilis par la tlvision analogique), le niveau de luminance est dfini comme ceci :
> Mlange RGB vers Gris (plus proche de la perception humaine)
> lum = 0.299 * rouge + 0.587 * vert + 0.114 * bleu
> 
> La luminance est dfinie dans la norme CIE 1931 comme suit :
> Y = 0.2126 * rouge + 0.7152 * vert + 0.0722 * bleu
> 
> (Les  valeurs utilises par OpenCV sont Rouge : 0.212671, Vert : 0.715160, et Bleu : 0.072169).
> ...


Qu'il existe des relations approches pour certains logiciels, ou lies au fonctionnement de certains appareils (camras, appareils photo, tlvisions ...) soit. 
Mais une lecture attentive montre qu'un bon nombre de recettes du genre:
Lum (luminance, luminosit, brillance ... ?) = Coeff1 * "Rouge" + Coeff2 * "Vert" + Coeff3 * "Bleu"
rsulte d'un confusion aussi euphorique que complte  ::mrgreen::  entre indices (r, v, b), grandeurs colorimtriques (x, y, z)  et termes exponentiels comme le sympathique (IsRGB + 0.055)2.4 dj rencontr.

Donc veiller, l comme ailleurs,  rechercher des sites fiables, pour obtenir des informations de premire main, ou tout au moins bien rfrences. Je cite en vrac (la lecture n'est pas facile):
https://fr.wikipedia.org/wiki/CIE_XYZ
http://www.profil-couleur.com/ec/106b-espace-rvb.php
https://fr.wikipedia.org/wiki/Niveau_de_gris
https://en.wikipedia.org/wiki/Relative_luminance
https://en.wikipedia.org/wiki/SRGB#T...transformation
https://www.w3.org/WAI/GL/wiki/Relative_luminance

Le dernier site est d'ailleurs celui qu'indiquait *sevyc64*, par *le lien* qu'il avait cit en dbut de forum; on y trouve la description la plus claire du calcul de la luminance relative.

Nous avons d'ailleurs nglig la fin du texte, qui donne le critre  d'un contraste suffisamment fort entre deux couleurs:



> Calculate the contrast ratio using the following formula:  (L1 + 0.05) / (L2 + 0.05), where
> 
> # L1 is the relative luminance of the lighter of the foreground or background colors, and
> 
> # L2 is the relative luminance of the darker of the foreground or background colors.
> 
> Check that the contrast ratio is equal to or greater than 7:1

----------


## Jipt

Bonsoir,



> J'ai fait un peu de recherches sur la Toile, et la pellete de formules rcoltes en divers endroits ne m'a pas convaincu;


C'est rigolo, mais c'est ce que je me disais aussi, en voyant la quantit de formules rcoltes (j'ai trouv un autre logiciel pointu de dveloppement et de traitement d'images numriques, RawTherapee, qui utilise, lui aussi, 0.299*R + 0.587*G + 0.114*B -- est-ce que [presque] tout le monde se copie, ou est-ce vraiment *la* bonne formule ?), suite  moi aussi farfouillage webistique + avancement du _Delmas_ et essais divers :

L'image n'est sans doute pas tip-top pour comparer des trucs et des machins, il n'empche que je vois bien que les joues rondes de Titi sont plus sympathiques en mode "Luminosit" (c'est avec The Gimp et ses options que j'ai gnr les trois images NB).




> Donc veiller, l comme ailleurs,  rechercher des sites fiables, pour obtenir des informations de premire main, ou tout au moins bien rfrences. Je cite en vrac (la lecture n'est pas facile):
> https://fr.wikipedia.org/wiki/CIE_XYZ
> http://www.profil-couleur.com/ec/106b-espace-rvb.php
> https://fr.wikipedia.org/wiki/Niveau_de_gris
> https://en.wikipedia.org/wiki/Relative_luminance
> https://en.wikipedia.org/wiki/SRGB#T...transformation
> https://www.w3.org/WAI/GL/wiki/Relative_luminance
> 
> Le dernier site est d'ailleurs celui qu'indiquait *sevyc64*, par *le lien* qu'il avait cit en dbut de forum; on y trouve la description la plus claire du calcul de la luminance relative.


Merci pour ces lectures, a va m'occuper le week-end, je sens  ::mrgreen:: 




> Nous avons d'ailleurs nglig la fin du texte, qui donne le critre  d'un contraste suffisamment fort entre deux couleurs:


Non non, juste que je considre qu'il me faut matriser les choses simples avant d'attaquer les compliques, et comme j'ai d'autres chantiers sur le gaz en mme temps et que les journes ne sont pas extensibles...

 l'il, dans ces petites images, c'est ta formule (en bas  gauche) qui donne le contraste max, on dirait :

Revoir mon dernier post avec les formules relatives aux emplacements des rsultats pour savoir qui fait quoi.

----------


## wiwaxia

Bonjour,  ::D: 

@ *sevyc64*
La dernires indication du texte auquel renvoyait ton lien ( www.w3.org/TR/WCAG20-TECHS/G17.html )



> Calculate the contrast ratio using the following formula: (L1 + 0.05) / (L2 + 0.05), where
> 
>  # L1 is the relative luminance of the lighter of the foreground or background colors, and
> 
>  # L2 is the relative luminance of the darker of the foreground or background colors.
> 
>  Check that the contrast ratio is equal to or greater than 7:1


conduit en fait aux rsultats suivants:
a) Une couleur quelconque prsentera un contraste suffisant avec le noir (Lnoir = 0) si sa luminance relative dpasse un certain seuil et vrifie la condition:
(L + 0.05)/(0 + 0.05) > 7 , soit: L > 7*0.05 - 0.05 et pour la luminance un minimum: Lmin = 0.30 ;
b) La mme couleur contrastera suffisamment avec le blanc (Lblanc = 1 , valeur maximale) si elle apparat nettement plus sombre et vrifie la condition symtrique: (1 + 0.05)/(L + 0.05) > 7 , d'o: L < 1.05/7 - 0.05 ; la luminance ne doit pas alors dpasser la limite Lmax = 0.10 .

Les valeurs trouves pour les 2 bornes sont malheureusement incompatibles (Lmax < Lmin), il n'y a pas de domaine de luminance sur lequel les critres seraient simultanment vrifis.  ::weird:: 

Un compromis est cependant envisageable, par la recherche d'un rapport commun:
k = (L + 0.05)/(0 + 0.05) = (1 + 0.05)/(L + 0.05)
qui conduit : (L + 0.05)2  = 1.05 * 0.05 = 0.0525 et au seuil de luminance: Llim = Sqrt(0.0525) - 0.05 = 0.18 
correspondant au rapport: k = 4.58 , infrieur au prcdent: le critre apparat moins exigeant, mais fournit une limite entre couleurs sombres et claires.

PS: Je viens de retrouver un lien que je cherchais depuis quelques jours, sur *la luminosit et la clart, ou leucie*.

----------


## anapurna

salut 

peut tre un liens qui pourrais t'intresser grayscale

----------


## Jipt

> PS: Je viens de retrouver un lien que je cherchais depuis quelques jours, sur *la luminosit et la clart, ou leucie*.


a plus les autres liens donns prcdemment, j'ai de la lecture ce week-end !

Plus l'ami anapurna qui me casse le moral avec sa page trs bien faite (sans compter que tout le reste du site a l'air trs intressant...) 



> peut-tre un lien qui pourrait t'intresser grayscale


car hlas, on y trouve 


> Note that while this formula produces arguably the best possible results from an objective technical perspective, *that doesnt mean its results always look the best subjectively.* Other formulas have been devised that may give better-looking results for specific images.


Comment s'en sortir ?
 priori quelque chose de 100 %  automatique n'est pas envisageable, on dirait, car subjectivement il y aura des couleurs avec lesquelles a ne le fera pas, et il faudra mettre les mains dans le cambouis... En premire approche, je verrais bien un curseur qui dplacerait le seuil de basculement noir-blanc, comme j'avais bricol il y a quelques jours.
"100 fois sur le mtier" vous connaissez la suite  ::P: 

PS :  propos du site cit par ana, vous noterez que ses couleurs ne sont pas pures, par exemple son rouge est  255 25 0, son jaune  255 240 0 son vert  0 216 0 ! Pourquoi ? Il ne le dit pas...

----------


## wiwaxia

Bonsoir,  ::D: 

La recherche du niveau de gris quivaut  celle de la luminance, parce que celle-ci ne dpend plus alors que d'un seul indice de couleur (g); et c'est au dpart une bonne ide, dans la mesure o il s'agit d'une moyenne pondre, ce que tout lecteur comprend intuitivement. 
L'affaire se corse ds que l'on entreprend d'y regarder d'un peu plus prs; l'galit des luminances de la couleur considre (r, v, b) et du gris quivalent (g, g, g): L(r, v, b) = L(g, g, g) 
devient, si l'on reprend la relation standard propose par la CIE et *pour des indices de couleur tous suprieurs  10*(1)
(g + h)2.4 = 0.2126 * (r + h)2.4 + 0.7152  * (v + h)2.4 + 0.0722  * (b + h)2.4 , en posant h = 255 * 0.055 = 14.025 ;
d'o le niveau de gris quivalent:
g = [0.2126 * (r + h)2.4 + 0.7152  * (v + h)2.4 + 0.0722  * (b + h)2.4](1/2.4) - h  ::massacre:: 
rsultat de nature  faire fuir la majorit des internautes ...  ::P: 
(1) Dj une restriction !
C'est donc, en thorie, reculer pour mieux sauter ...

Le site indiqu par *anapurna* donne quelques relations, sans aucune indication de provenance; il les prsente cependant clairement comme des recettes imparfaites, ne donnant pas partout de bon rsultats; et il les donne par ordre de complexit croissante:



> Gray = (Red + Green + Blue)/3
> Gray = 0.299Red + 0.587Green + 0.114Blue  (?)
> Gray = 0.2126Red + 0.7152Green + 0.0722Blue
> Gray = (0.2126Red2.2 + 0.7152Green2.2 + 0.0722Blue2.2)(1/2.2)


On devine le rapprochement progressif avec la formule standard - si l'on a eu l'occasion de la lire ...
Un seul reproche: quitte  prendre le parti de la simplicit - et l l'auteur ne s'en prive pas - pourquoi s'encombrer de donnes  4 dcimales ? Observant que 2126/722 = 2.94 ~ 3 et que 7152/722 = 9.91 ~ 10 , j'aurais crit:
g = ((3 * rn + 10 * vn + bn)/14)(1/n) en posant n = 2.2 - Au fait, pourquoi pas 2.4 ? a, c'est une autre histoire ... sans doute pour compenser la disparition du terme constant (h) ?




> ... PS :  propos du site cit par ana, vous noterez que ses couleurs ne sont pas pures, par exemple son rouge est  255 25 0, son jaune  255 240 0 son vert  0 216 0 ! Pourquoi ? Il ne le dit pas ...


L, tu te montres encore plus mesquin que moi ... ::mrgreen::

----------


## wiwaxia

> ...  priori quelque chose de 100 %  automatique n'est pas envisageable, on dirait, car subjectivement il y aura des couleurs avec lesquelles a ne le fera pas, et il faudra mettre les mains dans le cambouis... En premire approche, je verrais bien un curseur qui dplacerait le seuil de basculement noir-blanc, comme j'avais bricol il y a quelques jours.
> "100 fois sur le mtier" vous connaissez la suite  ...


La seule manire de vrifier la pertinence des tests proposs, c'est d'explorer le domaine des couleurs et d'tablir quelques palettes bidimensionnelles de contraste.
J'ai pris les 3 plans de symtrie du cube admettant pour intersection l'axe chromatique, et contenant par consquent l'origine du repre (0,0,0) et le point blanc (255,255, 255), diamtralement oppos.
Le contour de l'intrieur du domaine est un rectangle de dimensions (l, L = l*Rac(2)), construit sur deux artes et deux diagonales des faces opposes.
Les dimensions de l'image sont prises dans le rapport (17/12), valeur rationnelle la plus proche de Rac(2) dans le cas de petits entiers ne dpassant pas (40) .


```

```

Vous reprerez les sommets colors du cube, qui prsentent des teintes complmentaires (Rouge/Cyan, Vert/Pourpre, Bleu/Jaune). Le texte est un peu fruste, mais le temps m'a manqu pour faire mieux.
On y voit les rgions d'estompement du noir et du blanc, avec l'invitable zone de transition.



L'idal et t d'y superposer quelques courbes de luminance (ou de niveau de gris*(1)*) constants, mais la programmation des fonctions rciproques (par ex. r = F(L, v, b) s'est rvle franchement hyperch pnible.
*(1)*:  C'est peut-tre une bonne piste, sous rserve de vrification.

----------


## Jipt

Bonjour,

Autant j'ai apprci ton post de la nuit, autant celui de ce matin avec ses tapis de douche, tu m'as compltement perdu, largu  des profondeurs insouponnes. Pour faire court et simple, je n'ai absolument rien compris -- bon, ok, je ne suis pas un critre de qualit, je suis juste le botien lambda qui s'intresse  mettre un texte sur une image en visant la meilleure lisibilit possible.


Avec tous ces liens, un truc s'est quand mme tlescop, tout  l'heure ; dans le lien de sevyc64, on peut lire, en bas, rubrique "procedure", a :



> Measure the relative luminance of each letter (unless they are all uniform) using the formula:
>     L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:
>         if R sRGB <=* 0.03928* then R = R sRGB /*12.92* else R = ((R sRGB +0.055)/1.055) ^ 2.4


(Je ne mets que la ligne "R" pour ne pas alourdir)

Et en fouillant sur le site donn par ana, dans l'article A close look at the sRGB formula rubrique "0.03928?" en bas, je lis 



> In any case, theres certainly *no reason* to use* 0.03928* *together with 12.92*.


Que faire, alors, avec la formule prcdente ?...
Bon sang, o est mon aspirine ??????????????????????

----------


## wiwaxia

> ... Autant j'ai apprci ton post de la nuit, autant celui de ce matin avec ses tapis de douche, tu m'as compltement perdu, largu  des profondeurs insouponnes. Pour faire court et simple, je n'ai absolument rien compris ...


Chaque couronne circulaire a t partage en deux zones (noire et blanche) afin de ne pas envoyer deux fois plus d'images, l'une ne comportant que des "O" blancs, et l'autre que des noirs. Je jugeais l'ensemble assez encombrant comme cela, d'autant que j'aurais pu y ajouter les 3 faces du cube adjacentes  l'origine (pour ne s'en tenir qu' celles prsentant les plus sombres teintes).
Mais il est vrai que cela peut compliquer le discernement des rgions de contraste net du blanc (ou du noir) sur le fond color.



Il y a bien deux zones de fort contraste pour les deux sortes de caractres, mais dont les frontires (ici grossirement traces) ne concident pas: c'est l qu'interviendra l'apprciation personnelle, pour le choix d'une limite intermdiaire.

Contrainte indispensable pour des rsultats cohrents: les frontires choisies dans tous les plans possibles (ici bleu-jaune, d'quation r = v) doivent vrifier la *mme relation gnrale: g = F(r, v, b) =  Cte* . 
Les exemples ne manquent pas:  ::aie::  voir la braderie propose sur les prcdents liens.

Je tcherai de mettre au point de nouveaux tapis de douche, dots d'un faisceau de courbes de niveau, et toujours exempts de TVA.  ::mrgreen::

----------


## wiwaxia

> ... Avec tous ces liens, un truc s'est quand mme tlescop, tout  l'heure ; dans le lien de sevyc64, on peut lire, en bas, rubrique "procedure", a :
> Measure the relative luminance of each letter (unless they are all uniform) using the formula:
> L = 0.2126 * R + 0.7152 * G + 0.0722 * B where R, G and B are defined as:
> if R sRGB <= 0.03928 then R = R sRGB /12.92 else R = ((R sRGB +0.055)/1.055) ^ 2.4 
> (Je ne mets que la ligne "R" pour ne pas alourdir)
> 
> Et en fouillant sur le site donn par ana, dans l'article A close look at the sRGB formula rubrique "0.03928?" en bas, je lis 
> 
> In any case, theres certainly no reason to use 0.03928 together with 12.92. 
> ...


J'ai effectivement peru un flottement sur la valeur de la limite (~0.4) lors du codage numrique de la fonction luminance; il ne m'a pas inquit dans la mesure o:
a) il s'agit d'une borne sparant deux domaines, qui n'intervient pas dans le calcul mais dcoule au contraire de la confrontation de deux quations; 
b) les carts observs sont faibles (0.03928 | 0.04045), et plus encore ceux ceux qui en dcoulent sur (L);
c) les indices de couleur sont des variables entires, pour lesquelles la frontire demeure inchange:
I0 = Floor(255 * 0.03928) = Floor(10.01640) = 10 ;
I'0 = Floor(255 * 0.04045) = Floor(10.31475) = 10 .

J'ai d'autre part repris par curiosit le calcul de la racine de l'quation: s/K = ((s + 0.055)/1.055)2.4
en cherchant la limite de la suite un+1 = 1.055(un/K)(5/12) - 0.055 , en prenant K = 12.92 et u0 = 0.04044 .
La convergence est assez lente; ma calculette a cependant donn au bout de 886 itrations: 
s = 0.040 448 236 277 566 et y = 0.0031 306 684 425 361 .
Arrtons-l le dlire calculatoire, pour en revenir  l'incertitude incompressible des coefficients, qui dcoulent d'un grand nombre de valeurs exprimentales: K = 12.92 , s = 0.04045 et y = 0.003131 - soit 4 chiffres significatifs.

# L'article de Wikipdia *dj cit* donnait dj des informations sur les conditions de raccordement (continuit de la fonction et de sa drive premire); voir  _Theory of the transformation_.
# Celui de *W3.org*, quoique bien rsum, citait la valeur conteste (0.03928).
# *La page* du dernier site m'avait chapp, et sort de l'ordinaire: il n'est pas frquent qu'un informaticien se livre  une analyse numrique aussi pousse d'un systme d'quations. 
Un grand  ::merci::  , donc,  *anapurna* dont l'information nous a finalement permis de connatre cette mise au point.

----------


## Jipt

> Mais il est vrai que cela peut compliquer le discernement des rgions de contraste net du blanc (ou du noir) sur le fond color.


C'est fou comme deux btes traits colors a change la vie et la comprenette du fourbi  ::ccool:: 




> Je tcherai de mettre au point de nouveaux tapis de douche, dots d'un faisceau de courbes de niveau, et toujours exempts de TVA.


 ::ptdr:: 




> [...]
> # Celui de *W3.org*, quoique bien rsum, citait la valeur conteste (0.03928).
> # *La page* du dernier site m'avait chapp, et sort de l'ordinaire: il n'est pas frquent qu'un informaticien se livre  une analyse numrique aussi pousse d'un systme d'quations.


Oui, et c'est exactement ce que je disais : un site prconise une formule et un autre site en dmonte (sans "r") la moiti : *qu'est-ce qu'on fait ?*

Et pendant qu'on est dans les formules, j'en ai une qui me sort un rsultat hallucinant avec les patches de couleurs dcouverts hier (et pour lesquels j'ai forc les couleurs au taquet : le vert est 0 255 0 par ex, et idem pour les autres) : regardez la dernire image, en bas  droite, elle est calcule avec round(0.34  *Ri) + round(0.5   *Gi) + round(0.16  *Bi); et son rendu du blanc est compltement noir !,  comparer avec l'image  sa gauche o le blanc est blanc avec des valeurs de formule assez proches : round(0.3   *Ri) + round(0.59  *Gi) + round(0.11  *Bi); // intel...



En attendant une rponse  la question *en gras* un poil au-dessus, j'ai jou un peu avec une ide qui me trottait dans la tte... D'abord l'image :


et ensuite le test que j'ai fait : sur le fond rouge, 
si j'enlve la ligne de code qui crit en blanc, les lettres "ste" en bas  droite sont illisibles ;si j'enlve la ligne de code qui crit en noir, les lettres "Co" en haut  gauche sont illisibles.
Je vais un peu laisser reposer avant d'enfourner...

Ah, les patches, si d'aventure quelqu'un voulait jouer avec (fichier zip, le forum n'aime pas les tifs) : testcardtif128.zip

----------


## wiwaxia

> ... Et pendant qu'on est dans les formules, j'en ai une qui me sort un rsultat hallucinant avec les patches de couleurs dcouverts hier (et pour lesquels j'ai forc les couleurs au taquet : le vert est 0 255 0 par ex, et idem pour les autres) : regardez la dernire image, en bas  droite, elle est calcule avec round(0.34  *Ri) + round(0.5   *Gi) + round(0.16  *Bi); et son rendu du blanc est compltement noir !,  comparer avec l'image  sa gauche o le blanc est blanc avec des valeurs de formule assez proches : round(0.3   *Ri) + round(0.59  *Gi) + round(0.11  *Bi); // intel...
>  ...


F1(255, 255, 255) = Round(0.34*255) + Round(0.50*255) + Round(0.16*255) = Round(86.7) + Round(127.5) + Round(40.8) = 87 + 128 + 41 = *256 = 0 (Mod 256)*

F2(255, 255, 255) = Round(0.30*255) + Round(0.59*255) + Round(0.11*255) = Round(76.5) + Round(150.45) + Round(28.05) = 77 + 150 + 28 = *255*

 ::mrgreen::  lmentaire, Watson.

Je te propose un petit jeu: colorier une grille triangulaire 101x101 en couleurs selon les 3 valeurs du rsultat donn par la formule:
s = F(i, j) = Round(2.55 * i) + Round(2.55 * j) + Round(2.55 * (100 - i - j))
avec (s, i, j) de type Word et (i + j)<101
et qui, lorsque les "Round(.)" s'vaporent, donne 255.

----------


## Jipt

Salut,



> F1(255, 255, 255) = Round(0.34*255) + Round(0.50*255) + Round(0.16*255) = Round(86.7) + Round(127.5) + Round(40.8) = 87 + 128 + 41 = *256 = 0 (Mod 256)*
>  lmentaire, Watson.


C'est bien quand on a affaire  un matheux et qu'il explique avec des couleurs : on comprend tout  ::ccool:: 

Et donc, l'abus de "round" nuit,  consommer avec modration :
F1(255, 255, 255) = Round(0.34*255) + Round(0.50*255) + Round(0.16*255) = Round(86.7) + Round(127.5) + Round(40.8) = round(86.7 + 127.5 + 40.8) = round(255) = *255*Alors mfiance partout !
(va falloir que je repasse sur tous mes codes ! Tu parles d'un dimanche...)

En attendant, je rcupre un blanc bien blanc  droite, c'est Coluche (RIP) qui serait content :

Mais la diffrence entre le vert (col4) et le pourpre (col5) n'est pas vraiment flagrante, hein ! Cette formule m'nerve...




> Je te propose un petit jeu: colorier une grille triangulaire 101x101


C'est quoi une grille triangulaire ?  ::koi::

----------


## wiwaxia

> ... C'est quoi une grille triangulaire ?


Un tableau carr dont on ne s'occupe pas des termes situs en-dessous de la 2de diagonale, d'quation (i + j) =  Conste .
Par exemple en codant:


```

```

 ::D:  J'aurais d tre plus clair.




> ... Et donc, l'abus de "round" nuit,  consommer avec modration :
> F1(255, 255, 255) = Round(0.34*255) + Round(0.50*255) + Round(0.16*255) = Round(86.7) + Round(127.5) + Round(40.8) = round(86.7 + 127.5 + 40.8) = round(255) = *255*Alors mfiance partout ! ...


 ::ccool::  Bon rflexe.

----------


## Jipt

> Je te propose un petit jeu: colorier une grille triangulaire 101x101 en couleurs selon les 3 valeurs du rsultat donn par la formule:
> s = F(i, j) = Round(2.55 * i) + Round(2.55 * j) + Round(2.55 * (100 - i - j))
> avec (s, i, j) de type Word et (i + j)<101
> et qui, lorsque les "Round(.)" s'vaporent, donne 255.


J'arrive  a :

C'est ce  quoi tu pensais ? J'avoue ne pas bien capter ce que tu entends par _lorsque les "Round(.)" s'vaporent_...

The code, avec un TImage de 101 x 101 sur la fiche :


```

```

Tu noteras qu'il a fallu que je bidouille tes dfinitions car il n'est pas possible d'avoir Grille[i, j] avec TYPE Mat = ARRAY[0..Max] OF Word;...
Y a un truc qui ne tourne pas rond entre "s", Grille[i, j] et aBuf.Canvas.Pixels[i,j]...
Mais comme je ne suis pas dans ta tte...
 ::koi::

----------


## wiwaxia

En gros, c'est a ...  quelques anomalies prs dcelables sur l'image agrandie.

Je m'attendais  quelque chose de ce genre (en adaptant certains types de variables):


```

```

Attention  la condition sur la diagonale !




> J'avoue ne pas bien capter ce que tu entends par lorsque les "Round(.)" s'vaporent...


Le rsultat est selon les cas 254, 255 ou 256 lors que l'expression purge de toutes les fonction d'arrondi vaut toujours 255 . 
Une illustration de la pagaille qui peut s'introduire avec les fonctions discontinues.

----------


## Jipt

> En gros, c'est a ...  quelques anomalies prs dcelables sur l'image agrandie.


J'ai repris ton dernier code texto, j'obtiens a (agrandi) :





> Attention  la condition sur la diagonale !


 ::koi:: 




> ```
>            aBuf.Canvas.Pixels[i,j] := Grille[i, j]     // Je ne connais pas cette instruction
> ```


Expliqu dans le code :


```

```

Attention, ce aBuf.Canvas.Pixels[i,j] := couleur; est pouvantablement bouffeur de ressources et ne peut tre utilis que pour des petits tests (comme ici),  partir de 300x300 a commence  ramer et au-del c'est inexploitable : faut passer par les ScanLines.

----------


## wiwaxia

Bonsoir,  ::D: 

L'image donne une rpartition probable des valeurs "accidentelles" (s <> 255). Quelques rectifications pourraient amliorer le code.

# D'abord une erreur que je viens de trouver dans le code initial, et que tu as contourne: le type (_Mat_) correspond  un tableau  2 dimensions, j'aurais donc d crire quelque chose du genre:  ::toutcasse:: 


```
TYPE Mat = ARRAY[N1..N2, N1..N2] OF Word;
```

et comme tu tiens  partir de zro et  retrouver (Max) lments dans chaque ligne et chaque colonne:


```
TYPE Mat = ARRAY[0..(Max-1), 0..(Max-1)] OF Word;
```

# la zone triangulaire occupe s'tend jusqu'aux 2 sommets (0, Max-1), (Max-1, 0) et inclut les cases ranges en diagonale, vrifiant (i + j) = (Max-1) , d'o la condition d'exclusion:


```
IF ((i + j)>=Max) THEN Grille[i,j]:= 0  // Couleur noire
```

lie au choix des bornes.

# Il me semble me rappeler que la cration des images bitmap ne te posait pas de problmes, et je te proposais une matrice pour faciliter le passage  la variable (TBitmap ?) utilise dans ton programme.
La variable (_Grille_) ne ferait-elle pas double emploi ? Ne pourrais-tu pas t'en passer ?
Curieusement, la constante (_Max_) n'intervient pas dans la dfinition de ton type de tableau:  ::koi:: 


```

```

N'aurais-tu pas involontairement cr un monstre (indirectement par ma faute, le le reconnais  ::oops:: ) ? Une entit dont la taille atteindrait par omission de paramtre les limites de capacit du logiciel ? Et cela n'autait-il pas un rapport avec les difficults dont tu fais tat ?



> ... Attention, ce aBuf.Canvas.Pixels[i,j] := couleur; est pouvantablement bouffeur de ressources et ne peut tre utilis que pour des petits tests (comme ici),  partir de 300x300 a commence  ramer et au-del c'est inexploitable : faut passer par les ScanLines.


Personnellement, je n'ai pas rencontr de difficult particulire - hormis la lenteur - avec des images Bmp de dimensions (2000x2000).

# Le plus fort, c'est que cela a l'air de marcher: ton programme parat viable ... Tu pourrais, aprs amlioration, regarder ce que cela donne pour Max = 100, 101, 102, 103 ... (102 et 255 ont pour diviseur commun 51).

----------


## Jipt

Bonsoir aussi,



> La variable (_Grille_) ne ferait-elle pas double emploi ? Ne pourrais-tu pas t'en passer ?


Tutafait ! Voir le code + bas.




> N'aurais-tu pas involontairement cr un monstre (indirectement par ma faute, le le reconnais ) ? Une entit dont la taille atteindrait par omission de paramtre les limites de capacit du logiciel ? Et cela n'aurait-il pas un rapport avec les difficults dont tu fais tat ?


Non, je ne pense pas. Pas beau, a je te l'accorde volontiers, avec des machins inutiles et des trucs redondants...  ::oops:: 




> Personnellement, je n'ai pas rencontr de difficult particulire - hormis la lenteur - avec des images Bmp de dimensions (2000x2000).


Cette histoire d'accs aux pixels comme je l'ai crite, c'est trs connu sur le web pour sa lourdeur et sa lenteur ; d'ailleurs, au tout dbut des essais ici de la transformation d'une petite (128x128) image couleur en niveaux de gris, j'employais cette manire de faire que j'ai trs vite abandonne quand j'ai commenc  gnrer plusieurs images en gris : fallait compter 8 secondes environ par image !




> # Le plus fort, c'est que cela a l'air de marcher: ton programme parat viable ... Tu pourrais, aprs amlioration, regarder ce que cela donne pour Max = 100, 101, 102, 103 ... (102 et 255 ont pour diviseur commun 51).


Commentaires dans le code au dbut pour voir les rsultats. Avec 101 j'ai exactement la mme image que celle poste ce matin.


```

```

Mais on s'loigne du sujet, l... J'ai pass une bonne partie de l'aprme  faire joujou avec CIE L*a*b*, et je suis un peu du : l aussi il y a des cas o le texte a du mal  se dtacher du fond.

----------


## wiwaxia

> ... Pas beau, a je te l'accorde volontiers, avec des machins inutiles et des trucs redondants ...


 ::D:  Je ne permettrais pas ce genre d'apprciation concernant un programme dont je ne connais pas le langage ! 
Je me demandais ce qui pouvait tant ralentir l'excution ...



> ... Cette histoire d'accs aux pixels comme je l'ai crite, c'est trs connu sur le web pour sa lourdeur et sa lenteur ; d'ailleurs, au tout dbut des essais ici de la transformation d'une petite (128x128) image couleur en niveaux de gris, j'employais cette manire de faire que j'ai trs vite abandonne quand j'ai commenc  gnrer plusieurs images en gris : fallait compter 8 secondes environ par image ! ...


J'ai retrouv les messages livrant des parties de tes programmes, au sujet du maniement des images bitmap, sur un autre forum o sont longuement intervenus des participants superfun que nous connaissons bien  ::mrgreen::  .
Les difficults portaient sur des dtails (ajustement de bornes et de variables), mais pas sur la cration du fichier, qui ne te posais pas de problme. 

# http://www.developpez.net/forums/d16...degrade-faire/

# 04/11/2016, 00h27 _ _ #37 (p2)
# 05/11/2016, 12h03 _ _ #41 (p3)
# 07/11/2016, 10h25 _ _ #49 (p3)

Si cela peut t'aider ...

PS: Je regarde toujours la fonction "niveau de gris", mais la matrise des approximations reste pnible  ::furieux::

----------


## Jipt

Salut salut



> Je ne permettrais pas ce genre d'apprciation concernant un programme dont je ne connais pas le langage !


T'inquite pas, c'est moi qui l'ai crit !




> Je me demandais ce qui pouvait tant ralentir l'excution ...


C'est comme a, c'est par construction...
J'ai un petit prog dans un coin qui me sert  tester/optimiser mes trucs, j'arrive  gnrer une image 256 x 256 en 8xx Sec avec ScanLine et il faut compter 460xxx Sec pour la mme chose avec aBmp.Canvas.Pixels[x, y] := aColor;, ce qui fait un rapport de 1  575 environ (test  l'instant)...


```

```



J'ai eu la flemme de chercher  savoir pourquoi noir et blanc sont inverss entre les deux rendus...




> PS: Je regarde toujours la fonction "niveau de gris", mais la matrise des approximations reste pnible


On en est l, et ce matin je n'ai pas eu le temps de regarder, et cet aprme je n'aurais pas plus le temps...

----------


## wiwaxia

a marche, les teintes semblent se correspondre. 
Encore qu'en y regardant de plus prs  ::weird::  ...
on trouve aux 3 coins pourpres:
# Tapis de douche: _ _ _ _ _ _ _ _ 247 _ 8 _ 247
# Fond continus/ carrs (1) et (2): 232 _ 9 _ *120* ( ::mrgreen::  je ragis comme toi !)
et c'est pareil pour le vert:
# Tapis de douche: _ _ _ _ _ _ _ _ 08 _ 248 _ 008
# Fond continus/ carrs (1) et (2): 25 _ 248 _ *138*
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _08 _ 246 _ *126*

La diffrence de teinte est visible, et la variation de l'une des composantes reprsente ~ 50 % du maximum (255): que s'est-il pass ? Tes logiciels te laissent-ils la totale matrise des couleurs ? As-tu correctement paramtr la composante bleue ?


L'inversion des couleurs provient d'un simple changement de convention pour l'origine; il suffit d'insrer dans l'un des deux programmes: x' = 255 - x ; y' = 255 - y .

----------


## Jipt

> Encore qu'en y regardant de plus prs  ...
> on trouve aux 3 coins pourpres:


Aux *3* coins pourpres ? Mais de quoi tu parles, l ?????????????????? Je n'en vois qu'un seul, en bas  droite.
En plus, je me demande si tu ne te rajoutes pas des problmes en utilisant une image rectangulaire... Regarde ce que donne l'espace situ entre les deux premiers ronds situs en bas  droite, en zoomant beaucoup :

Le point noir indique que c'est le pixel  sa droite et en descendant qui va tre analys.
Vus, les artefacts ? Qui n'existent pas quand je regarde l'espace entre le rond tout en bas et celui qui est au-dessus de lui !




> # Tapis de douche: _ _ _ _ _ _ _ _ 247 _ 8 _ 247
> # Fond continus/ carrs (1) et (2): 232 _ 9 _ *120* ( je ragis comme toi !)
> et c'est pareil pour le vert:
> # Tapis de douche: _ _ _ _ _ _ _ _ 08 _ 248 _ 008
> # Fond continus/ carrs (1) et (2): 25 _ 248 _ *138*
> _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _08 _ 246 _ *126*


Simplifie-toi la vie avec tes textes, si tu les veux aligns : utilise la baslie "code" ("*#*')


```

```

Faut juste bien compter les espaces,  ::mrgreen:: 



> La diffrence de teinte est visible, et la variation de l'une des composantes reprsente ~ 50 % du maximum (255): que s'est-il pass ? Tes logiciels te laissent-ils la totale matrise des couleurs ? As-tu correctement paramtr la composante bleue ?


Trois questions se suivent que j'ai du mal  capter... La premire fait-elle rfrence  ce qui la prcde ou  ce qui la suit ?
La deuxime (matrise des couleurs), ben oui, si c'est moi qui les cris, a serait malheureux qu'ils ne fassent pas ce que je demande,  ::mouarf:: 
Et pour la dernire (composante bleue), je pense que en rapport avec dessous, non ? :



> L'inversion des couleurs provient d'un simple changement de convention pour l'origine; il suffit d'insrer dans l'un des deux programmes: x' = 255 - x ; y' = 255 - y .


Encore plus simple : suffisait d'inverser x et y dans la codification des couleurs :


```

```

 

Quant aux couleurs contrastes, j'aimerais bien que tu jettes un il aux jolis cercles chromatiques qui sont l : peut-tre qu'en changeant de bases on y arriverait mieux ?

----------


## wiwaxia

#


> ... Aux 3 coins pourpres ? Mais de quoi tu parles, l ?????????????????? Je n'en vois qu'un seul, en bas  droite ...


*L'extrmit du coin pourpre* de chaque image, la mienne (*le rectangle*) et *tes deux carrs*: 
1 + 2 = 3 , le compte y est.  ::D: 
Je me suis mal exprim.
J'ai refait systmatiquement plusieurs prlvements, qui fournissent des rsultats identiques  1 ou 2 units prs.

# Je crois comprendre pourquoi ton bleu arrive  127 (au lieu de 0 ou 255):
au lieu de 


```
        Canvas.Pixels[h, w] := RGBtoColor(byte(w), byte(h), byte(((h)+(w)) div 2));
```

ne devrait-on pas avoir plus tt


```
        Canvas.Pixels[h, w] := RGBtoColor(byte(w), byte(h), byte(w)     );
```

puisque le plan considr vrifie l'quation (r = b) ?



> ... En plus, je me demande si tu ne te rajoutes pas des problmes en utilisant une image rectangulaire ...


Il s'agit d'un plan bissecteur du cube, et le contour de l'intersection est un rectangle (dtail ici secondaire, en ce qui concerne les couleurs).

----------


## anapurna

bonsoir 

pour faire avancer le shmilblick  :;): 
j'ai dcouvert "La thorie des couleurs opposes"  de Hering 
c'est fort intressant car il ne parle pas de trois couleur primaire mais de quatre

tu as une prfrence pour l'arbre o mettre la corde  ::D:

----------


## Jipt

> # Je crois comprendre pourquoi ton bleu arrive  127 (au lieu de 0 ou 255):
> au lieu de 
> 
> 
> ```
>         Canvas.Pixels[h, w] := RGBtoColor(byte(w), byte(h), byte(((h)+(w)) div 2));
> ```
> 
> ne devrait-on pas avoir plus tt
> ...


 ::nono:: 
Avec ta proposition  droite :



```

```

(aux artefacts jpg prs.)

Mais de toute faon, ceci n'a aucune importance : c'est juste pour des tests de timing et de comprhension des mcanismes de scanline, alors halte au feu !

Allez, je retourne  mes cercles chromatiques...




> bonsoir 
> 
> pour faire avancer le shmilblick 
> j'ai dcouvert "La thorie des couleurs opposes"  de Hering 
> c'est fort intressant car il ne parle pas de trois couleur primaire mais de quatre
> 
> tu as une prfrence pour l'arbre o mettre la corde


Non mais lol quoi ! Je suis en train de lire la mme chose ! Et si on parle du mme site, videmment je relve des trucs incomprhensibles... :


Cette chose me plaisait bien jusqu' ce que je regarde *en mme temps* (et arm d'un ColorPicker) cette page (en bas sur mon montage) et l'animation associe (dernier slide, en haut du montage).
Alors pour savoir quel cercle s'applique aux mtiers d'art, on repassera...

----------


## anapurna

salut 

a bin non on parle pas du meme site mais presque 


leblanc jean marc.- couleur
et celui-ci 
https://www.atramenta.net/lire/oeuvr...hapitre-1.html

qu'est ce que tu n'a pas compris ?

----------


## Jipt

> a bin non on parle pas du meme site mais presque 
> 
> leblanc jean marc.- couleur
> et celui-ci 
> https://www.atramenta.net/lire/oeuvr...hapitre-1.html


Arrte, ton 1er lien c'est exactement le contenu du site que je donne ! Compare les tables des matires et les illustrations : l'un a pomp l'autre. Et regarde l'image page 38 : il y a le logo de l'autre site ! CQFD !

Quant au 2nd lien, il a l'air sympathique (je l'ai survol  la va-vite).





> qu'est ce que tu n'a pas compris ?


Sur la petite image (en bas dans mon montage) on peut lire " *droite* la roue chromatique *adopte* dans les arts de la peinture."
Et dans la capture de l'animation (haut du montage) le texte stipule que "Ce cercle chromatique (*gauche*) est la *rfrence* des mtiers d'art."

J'ai donc fait ce montage pour pouvoir comparer le cercle *gauche d'en haut* et le cercle *droit d'en bas*, et force est de constater qu'ils sont loin d'tre identiques ! 
Avec un ColorPicker tu pleures... Alors parler de "*rfrence*" ou d'"adoption" pour ces deux cercles, euh, comment dire...

J'aurais bien aim lui crire mais je n'ai pas trouv de lien...

----------


## anapurna

salut 

a oui cela ne m'avait pas choqu 

mais tout s'explique  :;): 

pour la peinture quand tu parle de couleur primaire (les pigments naturel de base)ce sont 
le bleu, le jaune et le rouge (BJR)
d'ou  la Roue chromatique adopte dans les arts de la peinture
actuellement avec la srigraphie ,l'impression et tout autre moyen de reproduction les couleurs primaire sont :
Cyan Magenta et Yellow  (CMY) d'ou a mon avis la petite notes qui te trouble 
Ce cercle chromatique (gauche) est la rfrence dans les mtiers dart

----------


## Jipt

Salut bonsoir,



> mais tout s'explique


Parle pour toi  ::mrgreen:: 
Bon, de toute faon, la solution n'est pas l... Lecture :

a fait deux jours que je me bagarre avec les conversions de/vers CIE L*a*b* et de/vers HSL pour au final confirmer ce que sevyc64 (depuis le dbut) et dans une moindre mesure wiwaxia (suite  exprimentations pousses) disaient,  savoir qu'il n'y a pas de solution miracle et surtout pas universelle...

Voil d'abord des essais avec CIE L*a*b*, 

et si les deux "Memo3" de gauche sont sympathiques, adieu Berthe avec ceux de droite (le mmo avec les nombres prsente la couleur slectionne dans l'a-e-c et, de haut en bas, 
- les valeurs RGB de la dite couleur
- les valeurs converties avec CIE L*a*b*, donc respectivement L*, a* et b*
- un essai d'inversion de ces valeurs)
La case  cocher "L chang" force un calcul de L du genre L := 100 - L; mais selon la couleur c'est bon ou pas...

Et mme topo avec HSL (image un peu rduite) : 


en haut le texte est illisible dans le mmo de droite avec ce bleu de fou :
- valeurs RGB dans le mmo central, 1re ligne ;
- 2e ligne = conversion vers HSL
- 3e ligne = inversion/adaptation du L.

Image du haut alors que je n'avais pas touch la formule if L < 50 then L := 100 else L := 0; et image du bas en changeant le niveau du test : if L < 75... donne alors un bon rsultat avec le bleu (je n'ai pas mis l'image, aucun intrt, le texte est blanc et basta) mais c'est mort pour le jaune...

Voil, quoi.
C'est assez dcourageant...

La solution serait d'utiliser, comme je l'ai dj montr, du texte "ombr" mais a fait un peu pt baveux dans les petits corps de police.
Pas de solution universelle, on dirait.

----------


## anapurna

salut 

petites question si la valeur que tu cherche n'est autre que la couleur complmentaire
c'est a dire 

```
CouleurCompl = CouleurMax-CouleurChoisie
```

----------


## wiwaxia

> Petite question: si la valeur que tu cherches n'est autre que la couleur complmentaire
> c'est--dire: 
> CouleurCompl = CouleurMax-CouleurChoisie


*Gros ennui*:  un ton proche du gris moyen (r, v, b ~ 128) correspondra une couleur quasiment indiscernable (r', v', b' ~ 128), d'o le recours incontournable  des fonctions discontinues (voir #11).

# Les systmes de couleur des imprimeurs et des peintres concernent les *surfaces claires*, qui diffusent la lumire incidente; alors que la question initiale traite du contraste peru sur une image apparaissant  l'cran d'un moniteur, *surface mettrice* de lumire.
C'est un autre domaine, vaste, intressant et conduisant  de superbes palettes; mais je crains que ce nouveau dveloppement ne mne  une impasse.

# L'inventivit de *Jipt* ne faiblit pas ds qu'il s'agit de montrer de nouvelles palettes! Mais je ne partage pas le pessimisme qu'il me prte:



> ... a fait deux jours que je me bagarre avec les conversions de/vers CIE L*a*b* et de/vers HSL pour au final confirmer ce que sevyc64 (depuis le dbut) et dans une moindre mesure wiwaxia (suite  exprimentations pousses) disaient,  savoir qu'il n'y a pas de solution miracle et surtout pas universelle ...


Cependant je crois me rappeler que le systme HSL est li  un expression simpliste et inapproprie de la luminance, de mme que son jumeau (TSV): LTSV = Max(r, v, b) et LTSL = (Max(r, v, b) + Min(r, v, b)) / 2 .

Il faut s'en tenir  la relation propose par la CIE, et chercher une solution  partir de la luminance relative (ou du niveau de gris) d'une couleur - comme cela a t suggr assez tt an cours de cet change:
*tbc92* a introduit une expression approche de (L) (#6), puis son expression rigoureuse (#10);
*Jipt* a voqu le niveau de gris (#34)
*anapurna* a donn le lien vers la meilleure documentation sur ces sujets (#42)
C'est de l'une ou l'autre de ces notions (troitement lies) que l'on tirera une solution.

Je n'a pas termin le codage des fonction inverses, faute de temps ... _L'esprit est prompt, mais la chair est faible_   ::D:

----------


## anapurna

salut 

tu as raison si nous raisonnons uniquement sur les couleur RVB 
par contre rien ne nous empche de rflchir autrement. 

si nous pensions plus au couleur chromatique situ sur un cercle 
le blanc et le noir ne faisant pas parti de l'ensemble de ce cercle ces deux couleur servant  la saturation et la luminance

prenons le format HSL qui ce sert de ce cercle pour dfinir la teinte (H => HUE)
il est claire que si la luminance et/ou la saturation se trouve au borne de leur tendu il faudra jouer dessus

PS : j'ai trouv un site permettant de faire la conversion selon le format choisie 
colorizer

----------


## Jipt

Bonjour,



> *Gros ennui*:  un ton proche du gris moyen (r, v, b ~ 128) correspondra une couleur quasiment indiscernable (r', v', b' ~ 128), d'o le recours incontournable  des fonctions discontinues (voir #11).


+ 1 !




> Il faut s'en tenir  la relation propose par la CIE, et chercher une solution  partir de la luminance relative (ou du niveau de gris) d'une couleur - comme cela a t suggr assez tt an cours de cet change:
> *tbc92* a introduit une expression approche de (L) (#6), puis son expression rigoureuse (#10);
> *Jipt* a voqu le niveau de gris (#34)
> *anapurna* a donn le lien vers la meilleure documentation sur ces sujets (#42)
> C'est de l'une ou l'autre de ces notions (troitement lies) que l'on tirera une solution.


Jipt patauge dans les conversions... 

Pour essayer d'y voir un peu plus clair (et juste !) et de comprendre pourquoi j'avais parfois des rsultats qui ne me convenaient pas (sans pouvoir l'expliquer), j'ai bricol a  toute allure :

- un panel dont la couleur suit les rglages des 3 trackbars ;
- un poil de code :


```

```

Les formules qui se cachent sous CIELABtoRGB (un peu + bas) viennent de http://www.easyrgb.com/index.php?X=MATH
Et l'inspiration vient de ce graphique (honteusement pomp sur le web je ne sais plus o...) :


Pas de quoi fouetter un chat, hein, et pourtant c'est l'enfer !

Si "a" = "b" = 0, en jouant avec L de 0  100 on obtient un joli dgrad de noir  blanc en passant par tous les gris, c'est impec  ::ccool:: 

Mais en mettant L  100 et en jouant avec "a" seulement ("b" au milieu), -100 = violet, -90 = bleu, -80 = parme, -70 = parme clair, -60 = un bleu qui ressemble  l'autre, etc. j'arrte l c'est le foutoir total !
C'est pareil en allant vers les valeurs positives, et c'est la mme pagaille en jouant avec le curseur "b".

Enfin, si "a" et "b" ne sont pas au centre ( "0"), jouer avec "L" renvoie n'importe quoi.

O me suis-je gourr ?


```

```






> salut 
> 
> tu as raison si nous raisonnons uniquement sur les couleur RVB 
> par contre rien ne nous empche de rflchir autrement.


Oui mais non : on est bien oblig, tout  la fin, de convertir les valeurs (de n'importe quel modle, de n'importe quel espace) en R G B pour pouvoir les faire afficher  l'cran...
Quand je dis Panel.Color := aColor; il faut que aColor soit cod en RGB avec les classiques 0..255 3 fois.
C'est incontournable.

Vais jeter un il  ton site...

----------


## wiwaxia

> Oui mais non : on est bien oblig, tout  la fin, de *convertir les valeurs* (de n'importe quel modle, de n'importe quel espace) *en R G B* pour pouvoir les faire afficher  l'cran ...
>  ... C'est incontournable.


... et d'employer un paramtre tenant compte de la grande disparit des luminances intrinsques des couleurs de base, qui sont dans les rapports:
*(Lr : Lv : Lb) = (3 : 10 : 1)* - voir (#44 ).

Chercher ailleurs est fort instructif et divertissant, mais c'est quand mme une raction d'vitement  ::mrgreen::  .

Quelqu'un pourrait-l entreprendre le trac d'un faisceau de courbes de niveaux de gris g(r, v, b) = Cte sur l'une des faces du cube par exemple,  partir de l'*expression approche* 

*Gray = (0.2126Red2.2 + 0.7152Green2.2 + 0.0722Blue2.2)(1/2.2)
*que l'on a rencontre sur entropymine.com/imageworsener/grayscale/ ?

----------


## Jipt

> Quelqu'un pourrait-l entreprendre le trac d'un faisceau de courbes de niveaux de gris g(r, v, b) = Cte sur l'une des *faces du cube* par exemple,


_cube_ ??? De quel cube parles-tu ?




> partir de l'*expression approche* *Gray = (0.2126Red2.2 + 0.7152Green2.2 + 0.0722Blue2.2)(1/2.2)
> *que l'on a rencontre sur entropymine.com/imageworsener/grayscale/ ?


Alors,  propos de ta formule, dj j'aimerais bien qu'on mette les pendules  la bonne heure !
J'ai bien compris, dans toutes ces formules que j'ai vues passer, que coeffr +coeffg +coeffb = 1, la preuve 0.299 + 0.587 + 0.0114 = 1, ou 0.2126 + 0.7152 + 0.00722 = 1 aussi, mais j'ai trouv quelque part que openCV utilisait [0.212671, 0.715160, 0.072169] et il existe aussi des formules avec des dcimales longues comme le bras, je vous laisse les chercher, en tout tat de cause un arrondi + juste de 0.212671 serait plutt, mha, 0.212*7* et du coup 0.715160 deviendrait 0.715*1*, il y aurait moins d'erreur qu'avec les nombres que tu donnes, repris partout et par tous, et je trouve bizarre de n'avoir jamais rien lu  ce propos...
Un scoop sur dvlp ?
 propos des erreurs d'arrondis, je vous invite  regarder l'animation sur ce (clbre !) site, c'est enrichissant.

Et le rsultat de ta demande montre en bas  droite qu'on "perd" le blanc :

Pour en tre sr, j'ai fait sauter mon approximation des arrondis "justes" (2127 7151) pour reprendre les arrondis "faux" (2126 7152), le rsultat est identique en ce qui concerne la perte du blanc,  ::aie:: 

Le gag, c'est selon o on met les parenthses...
L'image ci-dessus a t gnre avec 

```
Result := round( power (0.2127*power(Ri ,2.2) + 0.7151*power(Gi, 2.2) + 0.114*power(Bi, 2.2), (1 / 2.2) ));
```

 et le petit bout ci-dessous avec


```
Result := round( power (power(0.2127*Ri, 2.2) + power(0.7151*Gi, 2.2) + power(0.114*Bi, 2.2), (1 / 2.2) ));
```



_In fine_, quand je lis 


> 0.2126Red2.2


est-ce que je dois comprendre 0.2126(Red2.2) ou (0.2126Red)2.2 ?

----------


## anapurna

salut 

un autre site intressant sur les niveaux de gris 

grayscale

ok c'est du vb mais cela ne le rend pas moins intressant  ::D:

----------


## sevyc64

> # Les systmes de couleur des imprimeurs et des peintres concernent les *surfaces claires*, qui diffusent la lumire incidente; alors que la question initiale traite du contraste peru sur une image apparaissant  l'cran d'un moniteur, *surface mettrice* de lumire.


En lumire mise (crans, ampoules, projecteur, etc....) on utilise la gamme RVB (Rouge Vert Bleu), l'absence de couleur donne du noir, la somme des trois couleur donne du blanc

En lumire rflchie (plus exactement en lumire absorbe, puis que st rflchie celle qui n'est pas absorbe), soit tout ce qui est imprim, peint, les objets et la nature elle-mme, on utilise la gamme CMJ (Cyan, Magenta, Jaune). L'absence de couleur donne du blanc, la somme des couleurs donne du Noir.

Dans chacune des gammes, le mlange de ces 3 couleurs permet de reproduire toutes les couleurs possibles.

A la gamme CMJ est souvent rajout le Noir pour donner plus de profondeur,  la gamme RVB est rajout une notion de transparence au contraire.

----------


## wiwaxia

> cube ??? De quel cube parles-tu ?


 ::zen::  Du cube de couleurs, dont les coordonnes des points varient entre (0) et (255).




> Alors,  propos de ta formule, dj j'aimerais bien qu'on mette les pendules  la bonne heure !


C'est dj fait: je prends les donnes du site indiqu, qui apporte les explications les plus dtailles et apparat digne de confiance (on a dj parl de tout cela #48 , 28/01/2017, 18h00  ). 
J'ajoute que mgoter sur la 4me ou 5me dcimale d'un coefficient, dans une *formule approche* qui de surcrot conduit  un entier au plus gal  255 (soit *au mieux 3 chiffres significatifs*),  ::aie::  cela me parat aussi pertinent que certaines disputes mdivales, sur la question de savoir combien d'anges pouvaient poser le pied sur une tte d'pingle.




> le rsultat est identique en ce qui concerne la perte du blanc,


 ::mrgreen::  La fonction _Round(.)_ a encore frapp !




> In fine, quand je lis *0.2126Red2.2*
>  est-ce que je dois comprendre 0.2126(Red2.2) ou (0.2126Red)2.2 ?


Il n'y a aucune ambigut, parce que l'exponentiation ne concerne que le terme qui prcde: 
0.2126Red2.2 = 0.2126(Red^2.2) = 0.2126(Red2.2)




> Le gag, c'est selon o on met les parenthses ...


videmment, puisqu'on change de fonction  ::furax::  et le dchiffrage n'a rien d'amusant.



```

```

 ::furieux::  Quand tu auras compris que les fonctions embotes sont inintelligibles et un repaire potentiel de bogues, tu auras accompli un pas de gant dans la rdaction de tes codes.
La squence


```
Result := round( power (0.2127*power(Ri ,2.2) + 0.7151*power(Gi, 2.2) + 0.114*power(Bi, 2.2), (1 / 2.2) ));
```

doit tre imprativement remplace par une srie d'instructions comme: 


```

```

Et encore, je me retiens d'en rajouter ...  ::):  
Je considre les 3 premires instructions comme incorrectes - mais cela nous mnerait trop loin.
Une somme de (n) produits se calcule aisment par le produit scalaire de 2 vecteurs de dimension (n), sans que surviennent les lourdeurs prcdentes.

----------


## Jipt

HS : dsol de ne pas avoir rpondu plus tt, mais le systme de messagerie de mon FAI a cafouill : je reois ce soir les mails m'informant des entres de ce midi... /HS




> La fonction _Round(.)_ a encore frapp !


La fonction Round est utilise pour toutes les images en niveaux de gris que j'ai prsentes ce midi...




> Quand tu auras compris que les fonctions embotes sont inintelligibles et un repaire potentiel de bogues, tu auras accompli un pas de gant dans la rdaction de tes codes.
> La squence
> 
> 
> ```
> Result := round( power (0.2127*power(Ri ,2.2) + 0.7151*power(Gi, 2.2) + 0.114*power(Bi, 2.2), (1 / 2.2) ));
> ```
> 
> doit tre imprativement remplace par une srie d'instructions comme: 
> ...


Tiens, cadeau, j'ai rcrit ma ligne :


```

```

et le rsultat est le mme, perte du blanc transform en noir...

EDIT : je viens de me taper les calculs pour le blanc (255 255 255)  la calculette, j'arrive  un Result de 259,65 donc je dpasse l'tendue du Byte d'o le noir, qui d'ailleurs n'en est pas un ; si j'avais regard au ColorPicker, j'aurais vu 4 4 4 ! Et on retrouve ce que j'ai lu par ci par l aujourd'hui, certaines formules peuvent renvoyer des valeurs en dehors de l'tendue du Byte et donc, remplacer la dernire ligne par 

```

```

fait revenir le blanc en 1re colonne, mais la bande  sa droite est bien claire quand on compare avec les autres images...


EDIT2 : Un autre essai avec ce joli dgrad sens avoir des couleurs de mme intensit lumineuse (je ne sais plus comment appeler a,  force  ::mouarf:: )



```

```


Allez, c'est tout pour ce soir.

----------


## wiwaxia

Bonjour,  ::D: 

Je vois que tu as fait un effort, alors je rpond rapidement avant de boucler les bagages (et le portable).
La fin de mon prcdent message tait rigoureusement exacte, mais  la limite de la cuistrerie dans le contexte du forum; l'irritation (lgitime) conscutive au dchiffrement de ton instruction en train de marchandise


```
Result:= ... (passons)
```

a t bien prs de me faire cder  ma grossiret naturelle  ::aie::  - j'avais des circonstances largement attnuantes.

1) *Un programme source est fait pour tre lu et compris par son auteur* (6 mois aprs, c'est moins vident ...)* et par tous les intresss* (ayant  priori une formation approprie);  ce titre, ce que tu as crit tait franchement irrecevable, indpendamment de l'algorithme sous-jacent, en raison de l'accumulation extravagante des parenthses. 
Un code compact, dont on ne peut reprer les tapes au premier coup d'oeuil, est  rejeter d'office.
Le bloc d'instructions propos en remplacement constituait un minimum d'urgence, le dcoupage mental auquel tait astreint le lecteur pour comprendre le contenu de la ligne.

2) Il y a d'autre part l'*utilisation des fonctions*, qui doit se conformer  la syntaxe (aux rgles de grammaire) du langage, et se prsenter sous la forme:


```
Variable:= FonctionA(x, y, z)
```

Des expressions du type


```
s:= 0.478* Fonction1(x) + 4.52 * Fonction2(y) ...
```

sont malheureusement courantes, et motives par un dsir mal compris de concision et de rapidit.
Mais c'est s'en remettre  la tolrance du logiciel, prendre le risque de bogues invisibles et compliquer singulirement la recherche des causes de plantage ou de dysfonctionnement.

Et puisqu'un produit scalaire en dimension (n) a t pompeusement voqu, de quoi s'agit-il ? Du produit terme  terme, suivi d'une sommation, sur deux listes comportant (n) lments, et que l'on peut considrer formellement comme des "vecteurs".
Ta nouvelle version, tout  fait claire:


```

```

s'insre facilement dans un ensemble un peu plus vaste, o l'on peut facilement modifier des donnes numriques:


```

```

Tu rectifieras les ventuelles erreurs de dtail, le temps me manque pour les filtrer.

----------


## tbc92

Pour l'histoire du calcul qui donne 259.65... et donc un nombre suprieur  255...
Je vois circuler plein de formules qui se ressemblent plus ou moins :

D'abord : Gray = (0.2126Red^2.2 + 0.7152Green^2.2 + 0.0722Blue^2.2)^(1/2.2)
Et maintenant : Result := round( power (0.2127*power(Ri ,2.2) + 0.7151*power(Gi, 2.2) + 0.114*power(Bi, 2.2), (1 / 2.2) ));

Les 2 premiers coefficients sont quasiment les mmes, et le 3me passe de 0.0722  0.114.
Dans ces formules, Blue Red Green sont des nombres qui varient entre 0 et 255   ou bien entre 0 et 1 ... a simplifie le calcul.
Si Blue = Red = Green = la valeur maxi, la base pour que la formule soit valide, c'est que le rsultat soit 0 ( ou 255 si on a une chelle de 0  255). 
Et donc la contrainte n1, c'est que la somme des 3 coeffs soit 1.
0.2126 + 0.7152+0.0722 = 1 --> Ok
0.2127+0.7151+0114 > 1   --> pas Ok  : Cette formule ne peut pas donner des rsultats sains.

----------


## Jipt

Bonjour,

Ah, c'est bien qu'il y en ait qui suivent et regardent a avec l'esprit repos et dtendu, 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 mme plus s'il existe un paysage...

Un grand, norme merci  toi, tbc92 !
Le nouveau rsultat en bas  droite, et mme plus besoin du test de dpassement car a ne dpasse plus  ::ccool:: 



J'en profite pour souhaiter de bonnes vacances ou bon sminaire 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,  ::mrgreen::  !

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 contrastes !
Allez, j'y retourne...  ::coucou::

----------


## wiwaxia

1) Merci pour tes souhaits. Simple sjour  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 contrastes !


 trouver la limite de part et d'autre de laquelle le blanc (ou le noir) prsente le meilleur contraste sur la couleur de fond considre.

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

Dj 80 rponses !  *sevyc64* doit se sentir submerg.







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

----------


## Jipt

Salut et bon sjour campagnard, alors  :8-): 



> Envoy par jipt
> 
> 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 contrastes !
> 
> 
>  trouver la limite de part et d'autre de laquelle le blanc (ou le noir) prsente le meilleur contraste sur la couleur de fond considre.


Certes, certes, c'tait la demande initiale et j'avais pondu une image anime montrant que mme 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.



> C'est d'ailleurs toi qui a eu la bonne ide 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 colors, et il y a encore un loooong chemin, je crois :


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 misre...  ::mur:: 




> Dj 80 rponses !  *sevyc64* doit se sentir submerg.


Il attend de rcolter les fruits de nos cogitations (nan, j'dcon'  ::P: )

----------


## sevyc64

> Dj 80 rponses !  *sevyc64* doit se sentir submerg.


Pas tout  fait, mais c'est vrai que je lis vos rponses rapidement, un peu en travers et forcment je ne comprends pas forcment tout.  ::mrgreen:: 




> Il attend de rcolter les fruits de nos cogitations (nan, j'dcon' )


C'est pas entirement faux  ::mouarf:: 

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, mme si on est plus tout  fait dans la demande initiale. On reste quand mme dans le mme domaine et en rponse  des potentielles questions voisine de la demande initiale.

----------


## Jipt

Bonjour,

Les choses ont bien avanc, aprs une quantit astronomique d'heures de rflexions, gamberges, etc., pour savoir comment grer l'affaire.

Dans un 1er temps, j'ai dbroussaill  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 extrmits 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 mme chose, et avec gris sur gris le contraste est trs moyen,  ::aie:: 
On l'avait dj vu avec l'ami wiwaxia et sa formule "magique".

J'ai alors eu l'ide 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 paramtrable 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 !


Restait plus (lol !) qu' transposer tout a dans le monde des couleurs, et aprs 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 systme va  proposer automatiquement une couleur oppose avec des options d'ajustages parce que tout n'est pas rose en ce bas monde et que des rglages tip-top pour principale  jaune et oppose  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 oppose, au milieu deux curseurs devenus inutiles, n'en tenez pas compte,  gauche HSL  droite TSV (2 manires car je n'ai pas encore choisi laquelle je vais garder au final) :


Tout cela n'est pas trs beau ( part les couleurs  ::P: ), 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.  :8-): 

Ah, j'allais oublier : lors de mes prgrinations sur le web, je suis un jour tomb sur un arc-en-ciel HSL que j'ai trouv plus sympa que son frre RGB et que j'ai donc rcupr et  qui j'ai appliqu les 9 routines de transformations en niveaux de gris, et a donne a :

----------


## Jipt

Salut,

24 h plus tard :



Je rappelle le fonctionnement : en haut les 3 curseurs simulent une bote de dialogue pour permettre  l'utilisateur de choisir une couleur (le "fond"), et le programme se charge de dterminer la couleur oppose (btement, de 180 sur le cercle chromatique), l'affiche et permet  l'utilisateur de l'ajuster finement avec l aussi 3 curseurs.

Bon, j'ai vrifi les couleurs du panneau droit (TSV) avec la bote de dialogue de choix de couleurs dans The Gimp et c'est tout juste.

Que dire de plus ? Bon week-end !  ::P:

----------


## tbc92

Ca parait surprenant, surtout le 2me 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 perue. (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 trs violent :


```

```

Ca donne comme couleur oppose une des 8 couleurs Rouge Vert Bleu Blanc Noir Jaune et ? et ?

----------


## Jipt

Yop !




> Ca parait surprenant, surtout le 2me 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 dernire phrase je ne la comprends absolument pas...
Et le deuxime exemple, repris ci-dessous en HSL et TSV :





> 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 expliques au  suivant) :


Et avec le slecteur du Gimp :





> Personnellement, j'aurais t trs violent :
> 
> 
> ```
> 
> ```


Ce n'est pas  moi de choisir d'tre violent ou pas, chacun ses gots : je propose juste un truc qui permet d'obtenir une couleur oppose  une autre, et d'afficher les rglages ensuite, et pas plus car ce n'est pas totalement automatisable, il y a une part d'esthtique qui entre ne jeu.





> Ca donne comme couleur oppose 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 vrifier, 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.

----------


## wiwaxia

Bonjour,  ::): 




> ... Je rappelle le fonctionnement : en haut les 3 curseurs simulent une bote de dialogue pour permettre  l'utilisateur de choisir une couleur (le "fond"), et le *programme se charge de dterminer la couleur oppose* (btement, 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 systme de coordonnes utilises (TSL ou TSB).




> ... 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 vrifier, hop, un zip : hsltsv.zip* ...


La prsentation monolithique du texte dcourage tout effort de lecture ... et la dmonstration est toujours convaincante lorsque l'on part de couleurs affirmes, nettement claires ou sombres.
Mais que se passe-t-il dans le cas de divers gris ? Je crains un fiasco  ::mrgreen::  dans le cas de teintes situes sur l'axe chromatique, si la transformation sor la valeur ou la luminosit se rduit  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 .




> ... Personnellement, j'aurais t trs violent :
> 
> 
> ```
> 
> ```


On en revient  la fonction discontinue voque ds le dbut de cet change (#3, 4, 11), qui ne prsente 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 diffrents (Sr, Sv, Sb).




> ... Ca donne comme couleur oppose une des 8 couleurs Rouge Vert Bleu Blanc Noir Jaune et ? et ?


 ... Cyan et pourpre - qui correspondent aux 8 sommets du cube de couleurs.



> ... 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 problme ? Tu oublies simplement les deux points limites (noir et blanc) de l'axe de ces cercles ...

----------


## tbc92

Dans ton message du 10 fvrier 12h35, tu as reprsent 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 donnes RGB de la couleur d'origine, et calculer les coordonnes RGB de la couleur complmentaire.

Pour convertir des coordonnes TSL, elle ne semble pas du tout adapte.  (par exemple parce que tu as dcrit cette courbe comme une courbe de [0,255] vers [0,255], alors que pour les coordonnes TSL, la borne max n'est pas 255.)
J'ai donc suppos que tu appliquais cette courbe  des coordonnes RGB.
Et dans ce cas, quand R de la couleur d'origine est suprieur  128, Le R de la couleur d'arrive devrait tre infrieur  128. Et ce n'est pas le cas dans les valeurs numriques que tu prsentes.

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

----------


## Jipt

> Dans ton message du 10 fvrier 12h35, tu as reprsent 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 rflexions.



> Dans un 1er temps, j'ai dbroussaill  partir d'une courbe (droite !) grise (R=G=B)






> L est l'essentiel de la question: par *quelles relations* passe-t-on d'une couleur  l'autre ? Peu importe le systme de coordonnes utilises (TSL ou TSB).


Couleurs diamtralement opposes sur un cercle chromatique, comme suggr par plein de sites d'informaticiens et de graphistes/peintres/artistes/etc.





> Mais que se passe-t-il dans le cas de divers gris ?


le programme se charge de dterminer la couleur oppose, l'affiche et permet  l'utilisateur de l'ajuster finement avec 3 curseurs.
J'avoue n'avoir pas fait de tests d'introduction en entre d'une couleur grise, le programme n'ayant pas d'entres RGB. Je note a dans mon TODO  :8-):  car, si, oui, on peut amener la couleur d'entre  *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* !





> O est le problme ? 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 problme, _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 dbut dans le processus artistique de choix d'une bonne lisibilit.
Au dbut j'tais parti sur des ides 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 dcideur avec les curseurs S et L/V.





> Je rappelle le fonctionnement : en haut les 3 curseurs simulent une bote de dialogue pour permettre  l'utilisateur de choisir une couleur (le "fond"), et le programme se charge de dterminer la couleur oppose (btement, de 180 sur le cercle chromatique), l'affiche et permet  l'utilisateur de l'ajuster finement avec l aussi 3 curseurs.

----------


## tbc92

Faisons le parallle 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 considre pas uniquement les points  la surface de la terre, mais *aussi les points  l'intrieur de la terre*. On a donc la notion de profondeur, ou de rayon  grer en plus. En particulier, l'axe partant du pole sud au pole nord dcrit les 256 nuances de gris.
Avec ta mthode, tu prends comme couleur complmentaire une autre couleur sur le mme parallle, et avec la mme 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 trs loin de la couleur d'origine ( plusieurs milliers de kilomtres 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 parallles -60 et +60

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

Si tu pars d'un point qui est sur le cercle polaire nord, il faut se dbrouiller pour arriver dans l'hmisphre sud (pas forcment  la surface de la terre, tu peux parfaitement viser un point proche du centre de la terre)
Sur les points tests, on a pris un point en Sude, et on a choisi comme point oppos un point en Alaska. Pourquoi pas choisir un point en Australie ?

----------


## Jipt

> Faisons le parallle 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 !




> --snip--


Et tout le reste je le sais, et c'est pourquoi j'ai mis des curseurs d'ajustements.
De la mme manire que j'hsite sur la faon de grer noir-gris-blanc d'o HSL  gauche et TSV  droite, et les curseurs  ::P: 

Si quelqu'un a une meilleure ide et une meilleure manire de faire, qu'il montre son code...

----------


## wiwaxia

> *Envoy par wiwaxia*
> L est l'essentiel de la question: par quelles relations passe-t-on d'une couleur  l'autre ? Peu importe le systme de coordonnes utilises (TSL ou TSB).
> 
> Couleurs diamtralement opposes sur un cercle chromatique, comme suggr 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 intermdiaires.




> Envoy par wiwaxia
> Mais que se passe-t-il dans le cas de divers gris ?
> 
> le programme se charge de dterminer la couleur oppose, l'affiche et permet  l'utilisateur de l'ajuster finement avec 3 curseurs.


Autre faon de voir les choses: les composantes d'un gris sont par dfinition gales, et le point figuratif se trouve sur l'axe du cercle chromatique; l'angle caractrisant la teinte est alors indtermin.
Il intervient ncessairement une autre transformation, concernant le 3me terme (valeur ou luminosit), et qu'on ne peut voir qu' l'aide d'une perspective spatiale (cne 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 prcde) v' = F(v) ou L' = G(L), indpendamment de la transformation dfinie sur le cercle chromatique ... Sinon il faut peut tre reprendre et complter le programme.

----------


## wiwaxia

> Faisons le parallle 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 considre pas uniquement les points  la surface de la terre, mais *aussi les points  l'intrieur de la terre*. On a donc la notion de profondeur, ou de rayon  grer en plus. En particulier, l'axe partant du pole sud au pole nord dcrit les 256 nuances de gris.


Tu es en train de promouvoir l'utilisation d'un domaine de couleurs sphrique; a marche effectivement, mais les calculs sont un peu compliqus. Ce modle gographique est nanmoins trs parlant.
Je crois que dans le cadre de cette discussion, on pourrait se contenter des instructions simples:


```

```

ou de quelque chose d'quivalent pour la luminosit.

----------


## Jipt

> 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 intermdiaires.
> [...]
> 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 prcde) v' = F(v) ou L' = G(L), indpendamment de la transformation dfinie sur le cercle chromatique ... Sinon il faut peut tre reprendre et complter le programme.


C'est bien ce que j'ai dit au dbut de la reprise de cette discussion, il y a deux jours.

Ce passage brutal c'est ce que j'ai matrialis 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...  ::mrgreen:: 

Je vous invite  relire le dbut de mon post :



> Dans un 1er temps, j'ai dbroussaill  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 extrmits 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 mme chose, et avec *gris sur gris* le *contraste est trs moyen*, 
> On l'avait dj vu avec l'ami wiwaxia et sa formule "magique".
> 
> J'ai alors eu l'ide 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 paramtrable 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 !
> 
> 
> ...

----------


## wiwaxia

Le graphe couleur cyan ne reprsente 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 dfinie par les instructions:


```

```

Voir le graphe vert.

----------


## Jipt

> Or il faut ici une fonction *discontinue*, par exemple dfinie par les instructions:
> 
> 
> ```
> 
> ```
> 
> Voir le graphe vert.


Pas mal du tout !
Tu sais quoi ? Je n'y avais pas du tout pens...  ::oops:: 

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  dcaler le point de dpart.
C'est comme a.
J'avais vu qu'il fallait dcaler le point de croisement, et c'est tout.

Bref, voil ce que donne ta formule :


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

En Pascal j'ai fait comme a :


```

```

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 Inverse.

----------


## Jipt

Bonjour,

Je reviens deux minutes sur cette nouvelle formule magique de l'ami wiwaxia, car je l'ai teste avec des couleurs, et force est de constater que c'est comme ce que je dis depuis le dbut : 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 mlange des 3 curseurs, notez le curseur vert qui ne varie que d'un point (126-->127) et le rsultat sur le gris du texte (sans tenir compte du texte lui-mme, 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]) :


Je me suis content d'appliquer la formule aux 3 curseurs pour gnrer une couleur "inverse".
Il est bien ncessaire d'avoir des curseurs d'adaptation pour les rglages fins, on dirait.


Autre chose :
pour ceux qui auraient tlcharg le zip d'il y a qq jours, j'avais not une chose qui m'ennuyait : pour avoir un affichage correct et symtrique entre les diffrents 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) :


```

```


Du coup je peux maintenant grer l'affichage comme pour les autres conversions, 


```

```


mais attention car cette modif a un effet de bord qui se traduit par une correction lourde d'une autre procdure 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 rsultats faux ! Je la remplace par une nouvelle, trouve dans un ensemble de composants magiques :


```

```


On attend maintenant que l'ami sevyc64  ::coucou::  nous poste ses remarques et commentaires  :8-):

----------


## sevyc64

Tu me met la pression l  ::mouarf:: 

Il va falloir que je trouve un moment pour tester tout a, oui, mme si ce n'est pour le moment qu' titre perso. Mais dj le travail est magnifique.

----------


## wiwaxia

> ... Comparez ces deux images, dans lesquelles le fond rose du rectangle correspond au mlange des 3 curseurs, notez le curseur vert qui ne varie que d'un point (126-->127) et le rsultat sur le gris du texte ...
> Il est bien ncessaire d'avoir des curseurs d'adaptation pour les rglages fins, on dirait.


Pas du tout  ::D:  . La spcificit d'une fonction discontinue est prcisment d'introduire un changement brutal du rsultat pour deux teintes trs proches, et apparemment indiscernables - ici (255, *126*, 255) et (255, *127*, 255).

Le seul point de discussion concerne l'opportunit du seuil choisi, qui ne se situe pas obligatoirement  127; la preuve: le contraste obtenu est moins affirm dans le premier cas (gris clair sur fond rose).

Et d'ailleurs (question perverse  ::mrgreen:: ) quel seront les consignes  mettre en oeuvre dans de cas d'une *couleur quelconque*, par exemple: (200, 50, 140) ? En procdant de la sorte, tu t'engages dans une nasse dont tu ne peux t'chapper que par des bricolages - ils sont pratiques, les curseurs !  ::aie:: 
Tu avais pourtant produit auparavant des tests convaincants (#19, #21, #24) ...

La fonction discontinue voque plus haut concerne la *variable unique par laquelle on caractrise* la "clart" de la couleur considre: soit le niveau de gris, soit la luminance relative.
La solution la plus simple (on ne ricane pas   ::whistle::   ::furax::   ::salo::  ) reste  cet gard l'expression approche du niveau de gris:
Gray = (0.2126Redn + 0.7152Greenn + 0.0722Bluen)1/n avec n = 2.2
propose sur *le site* suggr par *anapurna* (#42 - 27/01/2017, 18h57).

----------


## tbc92

Je pense savoir pourquoi ton exprience marche aussi mal. C'est parce que tu fais une grosse erreur.

Tu travailles avec les couleurs TSV. Ok TSV = Teinte/Saturation/Valeur.
La Teinte, c'est en gros vert par opposition  rouge/ bleu ... es 6 couleurs du cercle chromatique.
La saturation, c'est en gros l'opposition entre gris d'une part, et ces  couleurs d'autre part.  Gris = saturation minimale , Rouge ou vert ou cyan ou ... = saturation maximale.
Et la Valeur c'est un 3me axe, qui va du sombre au clair.

Pour trouver des couleurs complmentaires, on peut dire : je prends ma couleur d'origine, je prends sa teinte, et je prends une autre couleur avec une teinte trs diffrente. Ca marchera souvent, maisa donnera des rsultats trs moyens quand on a des couleurs comme le blanc, le gris ou le noir. 
On peut aussi prendre lacouleur d'origine, et prendre une couleur avec une saturation trs diffrente (en laissant les 2 autres paramtres inchangs) : A partir d'un rouge fonc, on va donc arriver  un gris fonc,  partir d'un rouge clair, on arrivera  un gris clair, et  partir d'un gris clair, on arrivera ...  une couleur claire de son choix.
On peut aussi laisser la teinte inchange et la saturation inchange , et changer uniquement la valeur. Et si on applique la formule de Wiwaxia, a va dire : 
  -  partir d'un rouge trs fonc, trs proche du noir, on va choisir un rose.
  -  partir d'un rouge fonc, on va choisir un rose trs clair, quasiment un blanc.
  -  partir d'un rouge 'normal', onva choisir au choix un noir ou un blanc.
  -  artir d'un rose moyen, on va choisir un rouge trs fonc, quasiment noir
  -  partir d'un rose trs clair, limite blanc, on va choisir un rouge fonc.

On peut aussi combiner ces 3 fonctions. Tout a marchera plus ou moins bien. Et en combinant ces 3 types de changement, a marchera dans tous les cas de figure.

Mais ce que tu fais est encore autre chose. Tu prends la teinte de la couleur d'origine.  tu arrives  un nombre N1 entre 0 et 1. Avec la formule de Wiwaxia, tu calcules un nombre N2 ,trs diffrent de N1. Ok.
Et ce nombre N2, ce sera la VALEUR de la couleur d'arriver.  En entre de ton traitement, tu as une TEINTE, et en sortie , tu as une VALEUR.

*C'est un peu comme si tu avais des individus dfinis chacun par leur ge, leur poids, et leur salaire. Et pour choisir un individu I2 trs diffrent de I1, tu te fixais comme rgle :
      le poids de I1 est de 75kg , il suffit de prendre un individu dont l'ge sera loin de 75 ans.*

----------


## Jipt

Bonjour  tous,





> Le seul point de discussion concerne l'opportunit du seuil choisi, qui ne se situe *pas obligatoirement*  127;


D'o les curseurs.




> ils sont pratiques, les curseurs !


Ben oui, on fait dans l'artistique (voir + loin) et pas dans le lancement de fuses Ariane !
As-tu (avez-vous) remarqu que quand tu travailles sur un texte, si tu choisis une police en corps 16 pour un titre et que tu estimes que c'est trop petit, le ComboBox va te proposer 18 ensuite : 17 il ne connait pas !
H bien dans la zone de texte du Combobox tu slectionnes ton 16 et tu peux taper 17, a fonctionne. Et si 17 est encore trop petit, tu peux essayer 17,2 ou d'autres valeurs, jusqu' trouver ton bonheur. Tu vois le truc ? Ben l c'est pareil.




> La solution la plus simple (on ne ricane pas     ) reste  cet gard l'expression approche du niveau de gris:


Est-ce que les gens me lisent bien ? J'ai dit que je ne voulais plus entendre parler du gris, sauf si c'est rclam  haute voix par la personne en charge du graphisme et aux manettes des... curseurs !
Et elle n'aura qu' baisser la saturation de la couleur propose par l'outil.





> Je pense savoir pourquoi ton exprience marche aussi mal. C'est parce que tu fais une grosse erreur.
> --snip--
> *Et pour choisir un individu I2 trs diffrent de I1, tu te fixais comme rgle :
>       le poids de I1 est de 75kg , il suffit de prendre un individu dont l'ge sera loin de 75 ans.*


Je ne sais pas o tu as vu a ! Dans le code il y a des choses genre if H (ou T pour TSV) < 180 then H := H + 180 else H := H - 180; pour avoir la couleur oppose et c'est tout !

Et il y a des raison trs simples :
pour la luminosit/luminance, 



> La diffrence perue entre deux objets de luminances relatives 10 % et 15 % est bien plus grande qu'entre deux objets de luminances relatives 80 % et 85 %.
> Quand on multiplie par deux la luminance d'un rayonnement, la vision amortit cette variation en ne percevant qu'une augmentation d'environ un quart


Deux lignes extraites de la page 45 de _La gestion des couleurs_ par Jean Delmas, avec un croquis trs explicite.
Cette valeur est donc impossible  automatiser  moins d'aller se prendre la tte (se la taper contre les murs, oui !) pour corriger les arrondis d'une courbe non linaire...pour la saturation, en imaginant une couleur source trs sature, l'inversion aurait gnr une couleur quasiment pas sature, donc toute grise et donc aucun intrt artistique, puisqu'on veut de la couleur.

Encore une fois (j'espre la dernire), cet outil n'est pas destin  sortir des rsultats dfinitifs pour les 16 millions de couleurs possibles, mais *juste une direction* que les gens avec un regard trs artistique adapteront  leurs desiderata.


Exemple (avec en plus une jolie concidence) : il y a quelques mois de a j'ai aid une amie  travailler sur un prospectus qui devait tre orn d'une photo en haut de sa page A4, photo qui ressemblait  a :

et sur laquelle elle voulait mettre un texte.

Bon, on a pas mal misr avec The Gimp  grands coups d'essais/corrections jusqu' arriver  quelque chose qui la satisfasse.
Et tout--l'heure j'ai repris son image, j'ai mis mon ColorPicker sur son ciel bleu et que croyez-vous que l'outil propost ? Presque le mme RGB (255 98 0) que la copine avait choisi (255 128 0) il y a quelques mois !
 

Ce qui valide mon systme, et hop !  ::ccool:: 
Bien oblig de reconnatre que c'est quand mme bien plus cool de pouvoir tester et voir en direct (grce aux curseurs, h h h) les changements sur les couleurs, plutt que les essais/modifs/et_recommence qu'on subit avec les botes de dialogues des logiciels.


Mais ce systme a failli partir "en prod'" avec un joli bug (le dernier, I hope !) dcouvert par hasard, mais le hasard est notre ami  tous, c'est bien connu, tout a pour dire que lorsque j'ai fait le test avec l'image de la copine, je n'avais pas le mme rsultat de couleur oppose selon que je regardais le panneau HSL ou le panneau TSV !
Oui, il y avait encore un souci avec la conversion TSVtoColor, malgr la correction d'hier (recorrig il y a 15 minutes)...

Heureusement, j'ai dcouvert entre-temps la *solution magique*, je veux parler du paquet *mbColorLib* dont je bnis l'auteur et lui baise les pieds, si si !, car grce  ses routines j'ai enfin russi  faire fonctionner mes premiers essais  base de CIE L*a*b* (un enfer !), puis, de fil en aiguille, j'ai corrig cette TSV2Color, ouf !

Les infos sont ici et le tlchargement l, c'est crit en Pascal orient Lazarus mais a devrait pouvoir s'adapter sans problmes.
Grand merci  toi, man !

C'est tout pour aujourd'hui,  ::coucou::

----------


## anapurna

salut 

si tu dcaler simplement  la luminance 1/3 cela ne suffirais t'il pas ? 

genre une fonction permettant de dfinir la valeur de la luminance "Oppos (en faites le terme est impropre)" 
en entrant en paramtre la luminance actuel 



```

```

----------


## wiwaxia

L'quation dcrite dans le prcdent message
Gray = (0.2126Redn + 0.7152Greenn + 0.0722Bluen)1/n avec n = 2.2
prsente, en plus de la simplicit numrique, un second intrt: celui de conduire rapidement  l'bauche d'un algorithme pour le trac des courbes isophotes, c.--d. d'gale luminosit, ce qui implique le calcul d'un indice de couleur en fonction des deux autres, ainsi que de la luminance relative de l'ensemble - ou, ce qui revient au mme, de son niveau de gris.

Les surfaces isophotes, d'quation L(r, v, b) = L1 (Cte) ou g = G(r, v, b) = g1 (autre Cte)
prsentent, dans le repre (r, v, b) associ aux couleurs, la forme d'une portion (1/8) de ballon de rugby un peu dform, allong sur l'axe des bleus et nettement aplati sur celui des verts. Ce contour s'observe dans les sections planes contenant l'origine.

L'expression d'un indice de couleur, qui requiert 3 sortes de fonctions: r = Fr(g, v, b) , v = Fv(g, r, b) , b = Fb(g, r, v) ,
exclut tout bricolage numrique, si l'on veut des instructions claires, vrifiables et concises; un codage correct permet en outre de s'affranchir des donnes numriques, de sorte qu'un modification s'obtient par une correction mineure du texte source.
Ces indices (improprement nomms) sont dfinis et manis comme des variables relles, afin d'viter toute drive calculatoire; le passage au format _Byte_ n'intervient qu'au stade de la dfinition d'un pixel.



```

```

----------


## wiwaxia

J'ai d reprendre la cration des images, parce que je m'tais gour dans le codage des couleurs des courbes, parfois difficiles  voir. 
On pourrait sur ce point apporter des amliorations, mais l'essentiel n'est pas l.

J'ai repris les sections diagonales du cube des couleurs, en sparant les caractres noirs et blancs afin mieux faire apparatre les limites d'un bon contraste sur le fond continument variable.
Les points limites de l'axe chromatique, toujours prsent, correspondent aux valeurs extrmes de la luminance relative (L) et du niveau de gris (g): d'une part l'origine (L0 = 0 , g0 = 0), d'autre part le point blanc (Lmax = 1 , gmax = 255).
Cet axe recoupe les cinq isophotes reprsentes, correspondant aux luminances relatives:
L = ( 0.1 , 0.3 , 0.5 , 0.7 , 0.9 )
et aux niveaux de gris:
g = 255 * L(1/2.2) = ( 89.5 , 147.5 , 186.1 , 216.8 , 243.1 ) .
Remarquer que cette squence, contrairement  la prcdente, s'loigne beaucoup d'une suite arithmtique.

 

 

 

Comme il fallait s'y attendre, on observe une transition graduelle dans l'aspect local des diverses parties de chaque image; mais les isophotes suivent nanmoins le contour des rgions de trs fort ou trs faible contraste, ce qui confirme la pertinence du critre utilis.

Il ressort de plus de l'examen de ces images que le contraste s'estompe:
a) dans le cas des caractres blancs sur fond plus sombre, au-del de la seconde courbe (L = 0.3), compte  partir de l'origine;
b) dans le cas des caractres noirs sur fond plus clairs, en-de de la premire courbe (L = 0.1).

La frontire correspond donc  une luminance relative L ~ 0.2 , et  un niveau de gris g ~ 255*(0.21/2.2) = 123 .
Rponse apporte  * sevyc64* 36 jours aprs qu'il ait pos la question. Comme quoi il ne faut jamais dsesprer.  ::D: 

PS: le choix de la limite est laiss  l'apprciation de chacun: si l'on estime que (Llim) est compris entre 0.15 et 0.25, alors le niveau de gris correspondant se situe dans l'intervalle [108 ; 136].

----------


## Jipt

Salut salut,



> salut 
> 
> si tu dcalais simplement  la luminance d'1/3, cela ne suffirait-il pas ?


Je ne sais pas, je ne peux pas mettre en uvre ta proposition :




> ```
> 
> ```


Au final cette ligne va donner RG := OT; parce que (OT DIV LUMAX)*LUMAX ==> les 2 LUMAX s'annulent et il te reste OT...




> ```
> 
> ```


Et l, indpendamment du fait que LUMAX-RG+OT = LUMAX tout btement suite  la ligne prcdente, il y a deux MOD, je *suppose* que le premier est en trop mais j'ai *horreur de supposer* quand il s'agit de corriger le code de quelqu'un d'autre car je ne suis pas dans sa tte pour savoir  quoi il pensait...


Quant  la proposition de l'ami wiwaxia, elle demande une looooongue rflexion  ::mrgreen::

----------


## anapurna

salut 

arf non le DIV te donne la parti entire donc si infrieur a 100 = 0, suprieur a 100 te donne 1 (tu ne dpassera jamais les 199)



```

```

pour la derniere ligne tu as raison 
il faut lire 


```
 LO = (LUMAX-RG+OT) MOD LUMAX;
```

j'avais test la fonction sous Excel mais les formule ne sont pas les mme  :;):

----------


## Jipt

Bonsoir,



> salut 
> 
> arf non le DIV te donne la partie entire donc si infrieur  100 = 0, suprieur  100 te donne 1 (tu ne dpasseras jamais les 199)
> 
> 
> 
> ```
> 
> ```


Admettons.

Mais du coup,  cause de la ligne qui prcde ce DIV, OT := LUMAX - VT;, OT sera toujours infrieur  100 et donc le rsultat de la division sera toujours  0  ::aie:: 

EDIT : Tiens, que donnerait ta mcanique Excel avec L  20, puis L  50 et enfin L  90, avec le pas toujours  33 ?
Je comprendrai mieux avec les rponses  a, et on gagnera du temps.
Merci,
/EDIT

----------


## anapurna

salut 

pour les diffrente valeurs voila ce que nous devrions obtenir 




> 20 => 53
> 50 => 83
> 90 => 23


par contre tu as raison il y a des lments qui ne servent  rien, juste  vrifier que je ne tourne pas en rond  :;):  
reprenons juste ce que nous avons besoin 
sous Excel :  



> PAS     =  QUOTIENT(LUMAX;3)
> LTMP   = LUACTU+PAS
> LNEW  = MOD(LTMP;LUMAX)


cela devais suffire pour dfinir le nouvelle indice 
ce qui donne en pascal 


```

```

le reste tait effectivement un moyen de vrifier que je ne me trompe pas.
en partant de la diffrence entre le nouvelle indice et le max 
encore toute mes excuse pour avoir compliqu la chose

----------


## Jipt

> encore toutes mes excuses pour avoir compliqu la chose


Pas grave, je m'en suis sorti d'une manire redoutable  ::P: 




> pour les diffrentes valeurs voil ce que nous devrions obtenir 
> 
> 
> ```
> 
> ```


Et donc, j'obtiens (je travaille sur l'chelle 0..1 en Float), sur des couleurs prises au hasard mais approchant les nombres source que tu donnais :


```

```

juste avec 


```

```

  :8-): 

Le problme (car il y en a un, a serait trop simple, sinon), c'est que comme je le dis depuis presque le dbut, il y a des couples qui ne passent pas...
L j'ai conserv S inchang, et j'ai cliqu sur la 1re cellule de l'avant-dernire colonne (et les deux  sa droite c'est pas jojo non plus  ::aie:: )


Tout en haut  gauche les valeurs de la cellule clique, et utilises pour le mmo  droite : H Direct (le fond) puis H Oppos (de 180 , pour le texte), S D puis S O (ou pas, lire ligne ci-dessous), L D puis L O avec la formule donne ci-dessus.

mais il m'est arriv de faire if S < 0.5 then S := S + 0.5 else S := S - 0.5; pour inverser la saturation, et ce sont d'autres couples qui morflent...


@wiwaxia : 
Merci pour ta formule, mais j'ai un gros souci avec... 
J'ai intgr les sous-routines dedans, je la considre donc comme une sorte de bote noire  qui je vais passer des paramtres, mais je ne sais pas ce qu'elle est sense faire...
Init_3_MatIm a peut se traduire par "Initialisation de 3 matrices pour image" ? Admettons, mais qu'est-ce que je fais avec 3 matrices pour une image ?
Et ces choses qu'il faut que je lui passe, elles viennent d'o ? IndiceC: Byte; La, Ha: Z_32; VAR Ma: Tab_Pix; Elles reprsentent quoi ?

Merci de tes prcisions car l, je suis en plein brouillard...

----------


## wiwaxia

Bonsoir,  ::D: 




> ... @wiwaxia : 
> Merci pour ta formule, mais j'ai un gros souci avec... 
> Init_3_MatIm a peut se traduire par "Initialisation de 3 matrices pour image" ? Admettons, mais qu'est-ce que je fais avec 3 matrices pour une image ?
> Et ces choses qu'il faut que je lui passe, elles viennent d'o ? IndiceC: Byte; La, Ha: Z_32; VAR Ma: Tab_Pix; Elles reprsentent quoi ?
> 
> Merci de tes prcisions car l, je suis en plein brouillard...


Rien de chang, pour l'essentiel, depuis que nous changeons sur des images Bitmap: la variable _Matr_Image_ est *LE* tableau de pixels qui contient toujours le corps de l'image;



```

```

Les entiers _Larg_Image_ et _Haut_Image_, de format _LongInt_, reprsentent les dimensions de l'image en pixels.

L'initialisation de cette matrice est effectue en trois tapes successives:
1) Dfinition de la couleur du fond continu (_Init_1_MatIm_);
2) Trac des caractres (*O*) tous identiques (_Init_2_MatIm_);
3) Trac des courbes isophotes par-dessus tout ce qui prcde (_Init_3_MatIm_) - c'est le sujet des changes actuels.
Cette dernire procdure forme un tout indissociable avec les 4 fonctions qui lui sont associes.

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 suprieur gauche (Csg); il dtermine l'appel de l'une des 3 fonctions qui suivent:


```

```

lesquelles se rfrent toutes  la quatrime:


```

```

La particularit de cette dernire est d'avoir toujours un argument inutile (il suffit de bien lire l'algorithme): celui dont elle renvoie la valeur, et qu'en entre on initialise  zro.



```

```

Il se peut que ce procd amne des contestations.  ::weird:: 

Bon courage et bonne lecture.

PS: il faut reprendre la dtermination des couleurs des courbes, parfois peu visibles; j'aurais d tenir compte de la couleur du dessin (noir ou blanc) pour obtenir un meilleur contraste.

----------


## tbc92

Voici ce que je viens d'obtenir par des formules relativement simples :
Dans mon outil, Teinte est un nombre entre 0 et 360, alors que Saturation et Luminosit sont entre 0 et 100


```

```

Dans chaque case, j'cris les codes RGB de la couleur de fond, et de la couleur du texte.
Comme on joue beaucoup sur la luminosit (luminosit du texte toujours en dehors de l'intervalle ]25,75[ ), les textes se retrouvent dans des couleurs toujours proches du blanc ou du noir.
Globalement, les rsultats sont lisibles.

----------


## Jipt

Bonsoir,



> Voici ce que je viens d'obtenir par des formules relativement simples :
> Dans mon outil, Teinte est un nombre entre 0 et 360, alors que Saturation et Luminosit sont entre 0 et 100
> Globalement, les rsultats sont lisibles.


En premire approche je dis "pas mal !"
Cependant, une petite remarque :



> Dans chaque case, j'cris les codes RGB de la couleur de fond, et de la couleur du texte.


Les codes RGB en hexa c'est passablement imbuvable  ::mouarf:: 
Et impossible d'apprhender les 3 valeurs diffrentes d'un simple coup d'il,  ::aie:: 
Tu pourrais pas refaire la mme image en crivant plutt les valeurs TSL ? a serait plus parlant.

Pi aussi, vite de trop compresser l'image de sortie, a fait monter les artefacts de compression jipgue, et du coup le ColorPicker sur le texte ne s'y retrouve pas :


La seule chose que je trouve dommage, 



> Comme on joue beaucoup sur la luminosit (luminosit du texte toujours en dehors de l'intervalle ]25,75[ ), les textes se retrouvent dans des couleurs toujours proches du blanc ou du noir.


c'est que les graphistes veulent parfois (souvent) du texte en... couleur !


@wiwaxia : merci pour ton retour, je regarde tout a la semaine prochaine, l je suis sur un autre truc (toujours en rapport, mais n'anticipons pas).

----------


## tbc92

Voici une nouvelle version, prenant en compte tes remarques.
Les couleurs sont affiches sous la forme (T,S,L).
Je triche un peu, j'ai pass les textes en gras, a amliore la lisibilit.
Paradoxalement, en inversant la teinte, a donne des rsultats peu lisibles (magenta sur vert par exemple). Alors qu'on obtient des rsultats beaucoup plus lisibles, avec du vert clair sur vert fonc (c'est mon sentiment aprs avoir fait ces tests, je ne sais pas du tout ce que disent les spcialistes).
Le code :


```

```

Sans les 4 dernires lignes, le rsultat est lisible. Elles servent juste  remplacer les couleurs trop proches du blanc ou du noir par des couleurs plus "colores".
Un exemple de rsultat :


Je ne montre que des couleurs avec une luminosit 'moyenne'. Pour les luminosits extrmes, c'est plus facile.

----------


## Jipt

Salut,

OMG que c'est bien les codes en clair  :+1: 

Allez, je me suis livr  un petit montage de comparaison, en partant du bleu ciel qu'on trouve sur la dernire ligne 2e colonne (puisque c'tait la seule demande que j'avais traite rcemment et donc sous le coude, et je trouvais que ton bleu ciel  211 80 79 s'approchait de celui de la copine).

Voil ce que a donne (en haut ta manire et en bas la mienne), avec une police 32 en gras :


Je me rends compte aprs coup que le texte n'est pas trs parlant, j'aurais d mettre "tbc92" en haut et "jipt" en bas, mais aprs, comment comparer ?

Bref, je laisse les "artistiques" dcider du mieux *en fonction du but recherch*, tant entendu qu'en grands corps il aurait fallu aussi jouer sur l'interlettrage, chose qui n'est pas propose par les botes de dialogue d'options des polices, alors bon, on ne va pas se lancer en plus dans l'ajustement du positionnement des caractres  coups de "TextOut" et autres machins compliqus.

Bye et bon dimanche,

PS : je trouve "mon" orange un peu trop vif, artistiquement parlant, et je l'aurais bien pass (avec les curseurs !  ::coucou::  wiwaxia), en RGB, de 255 132 0  250 125 0 (TSL 30 100 49) :


Sortez les ColorPickers  ::mouarf::

----------


## wiwaxia

Bonjour,  ::D: 

@ *tbc92*: La lecture de tes deux derniers messages (#113, #115) suscite les remarques suivantes.




> Voici ce que je viens d'obtenir par des formules relativement simples :
> Dans mon outil, Teinte est un nombre entre 0 et 360, alors que Saturation et Luminosit sont entre 0 et 100
> 
> 
> ```
> 
> ```
> 
> ... Comme on joue beaucoup sur la luminosit (luminosit du texte toujours en dehors de l'intervalle ]25,75[ ), les textes se retrouvent dans des couleurs toujours proches du blanc ou du noir.
> Globalement, les rsultats sont lisibles.


Les contrastes obtenus sont gnralement satisfaisants,  quelques exceptions prs - la case (6, 4) par exemple.
Cela vient du systme de couleurs lui-mme (TSL), simple mais trs rudimentaire, et qui ignore les carts de luminosit intrinsques des couleurs fondamentales; celles-ci sont en effet dans les rapports (3:10:1).
Ta dmarche est par ailleurs contradictoire: en recherchant les couleurs prsentant le plus fort contraste, tu en viens  te limiter (comme tu en conviens toi-mme)  des noirs ou des gris clairs peu colors.




> Voici une nouvelle version, prenant en compte tes remarques ...
> Paradoxalement, en inversant la teinte, a donne des rsultats peu lisibles (magenta sur vert par exemple). Alors qu'on obtient des rsultats beaucoup plus lisibles, avec du vert clair sur vert fonc (c'est mon sentiment aprs avoir fait ces tests, je ne sais pas du tout ce que disent les spcialistes).
> Le code :
> 
> 
> ```
> 
> ```
> 
> ...


Le dbut est, si j'ai bien compris:


```

```

d'o la discontinuit centrale impose  la saturation (en s0 = 50) et  la luminosit (en l0 = 47), et conduisant  une chute brutale de (100)  (0).
Les corrections de luminosit qui suivent m'ont paru plus discutables dans la mesure o:
a) elles prsentent deux discontinuits injustifies aux seuil (30) et (84): 
# L2 = 30 - 0 : L2' = *30* ; _ _ # L2 = 84 - 0 : L2' = *80*
# L2 = 30 + 0 : L2' = *35* ; _ _ # L2 = 84 + 0 : L2' = *84*
b) elles n'aboutissent pas aux valeurs extrmes (0) et (100): l'20 = 15 ; l'2100 = 92 ,
ce qui contribue  rendre les rsultats dcevants.

Je te suggre ici, puisque tu tiens  viter le noir et le blanc, deux instructions beaucoup plus simples (mais non linaires):


```

```

Je crois, d'une manire plus gnrale, qu'il est vain de rechercher le meilleur contraste en travaillant dans le systme (TSL), parce que ses variables sont des fonctions des 3 composantes (r, v, b); si les transformations appliques  la teinte (T' = T + 180) et  la luminosit (L' = L + 50 ou L - 50) sont envisageables (quoique dj pas forcment optimales, quant  l'effet produit), celle envisage pour la saturation (S' = 100 - S) ne donne strictement rien: deux couleurs fortement contrastes prsenteront souvent de faibles saturations.

On en revient aux composantes fondamentales, et  leur luminance propre; il est inutile et contre-productif de tenter d'chapper aux calculs peu sympathiques qui ne manquent pas d'apparatre 
_Couvrez ce sein, que je ne saurais voir. Par de pareils objets les mes sont blesses_  :8O: 
en changeant de coordonnes, et en bricolant des fonctions linaires par morceaux.

Le plus fort est que la solution a t entrevue ds le dbut de ces changes (# 3, #4), et qu'il suffisait de reprendre les relations proposes pour chacun des indices de couleur:


```

```

Mieux encore: si un lecteur se sent d'attaque, qu'il applique la mme relation  la luminance correspondante:


```

```

----------


## Jipt

Yop !




> Le plus fort est que la solution a t entrevue ds le dbut de ces changes (# 3, #4), et qu'il suffisait de reprendre les relations proposes pour chacun des indices de couleur:


C'est ce que je fais depuis le dbut...




> Mieux encore: si un lecteur se sent d'attaque, qu'il applique la mme relation  la luminance correspondante:


Je travaille en mode HSL, et j'ai conserv l'inversion de H : if H < 0.5 then H := H + 0.5 else H := H - 0.5; avant de modifier L avec ta formule : pas glop  ::calim2:: 



Mme souci en inversant la saturation... La semaine prochaine je m'attaque  ta grosse formule d'il y a qq jours.

----------


## tbc92

On va lever un peu la tte du guidon, et regarder ce qui se fait.
Sur ce site www.developpez.net, on a des fonds bleus, avec diffrentes varits de bleus, et on a des textes en polices bleues, avec diffrentes varits de bleus.

Et ce n'est pas spcifique  ce site. A peu prs tous les sites 'consistants' utilisent du ton sur ton, mais pas du 'couleur oppose'

Je pense que a rpond  la question de la copine de  Jipt.

@wiwaxia : il y a effectivement discontinuit pour l= 50. Par contre pas de discontinuit pour l2 = 30 ou 40 ... juste un angle. 
Ceci dit, la formule que tu proposes est plus lgante, et comme souvent, une formule plus lgante, a donne un rsultat meilleur.

----------


## Jipt

> On va lever un peu la tte du guidon, et regarder ce qui se fait.
> Sur ce site www.developpez.net, on a des fonds bleus, avec diffrentes varits de bleus, et on a des textes en polices bleues, avec diffrentes varits de bleus.
> 
> Et ce n'est pas spcifique  ce site. A peu prs tous les sites 'consistants' utilisent du ton sur ton, mais pas du 'couleur oppose'
> 
> Je pense que a rpond  la question de la copine de  Jipt.


Oui, enfin, la copine de Jipt a fait 40 ans qu'elle barbouille des toiles avec force pinceaux et tubes de gouaches, alors bon...

Quant aux sites et  ce qui se fait ailleurs, j'ai pu lire a :
_la palette monochrome reprsente lagencement le plus sobre et le plus reposant._ (source)

On est bien d'accord : _le plus sobre et le plus reposant_, mais la copine elle voulait une *accroche* pour son document A4, alors
_Peignez un petit rond noir dans le coin dune grande feuille blanche, ou un bouquet de coquelicot sur une verte prairie. Aussitt, les regards se dirigent vers le rond ou vers les fleurs. Pourquoi ? Parce que ces zones sont contrasts, ce qui pour lil signifie quil se passe quelque chose dintressant par l_ (source)

et plus bas :
_il sera plus judicieux de jouer sur le contraste entre une couleur dominante  qui occupe de grandes surfaces   et une couleur tonique  qui occupe peu de surface, mais qui ressortira dautant plus fortement par rapport  la dominante._
(c'est moi qui mets en gras)

_Lharmonie complmentaire ou contraste se produit lorsquon slectionne 2 couleurs diamtralement opposes sur la roue chromatique. rouge/vert, bleu/orange, jaune/violet
Ainsi sont associes une couleur chaude avec une couleur froide pour attirer lattention_ (source)

_Le contraste ou des couleurs opposes doivent tre utiliss avec soin. C'est utile d'avoir des couleurs opposes ou un contraste lev pour attirer l'attention sur un ou deux lments [...]_ (source)

En gros, on va utiliser des agencements en fonction de ce qu'on veut faire passer comme message (un peu comme je choisis une police en fonction du texte qu'elle affichera).

'fin bon, on va attendre de lire ce que sevyc64 en pense...

----------


## Jipt

Bonjour,

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




> 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 suprieur gauche (Csg); il dtermine l'appel de l'une des 3 fonctions qui suivent:


Quid si l'on a un jaune parfait, 255 255 0 ?

----------


## wiwaxia

> 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 suprieur gauche (Csg); il dtermine l'appel de l'une des 3 fonctions qui suivent:_
> 
> Quid si l'on a un jaune parfait, 255 255 0 ?


Le jaune, complmentaire du *bleu*, se trouve  l'autre extrmit du grand ct 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 disposes dans l'espace.
Ce schma nglig fait tache dans un dbat o l'on vient d'voquer l'exigence imprieuse concernant la qualit professionnelle des graphiques, mais je n'ai pas les moyens de faire autrement  ::D:  .

----------


## Jipt

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 bote noire : l'ide aurait t un truc qui renvoie une couleur oppose (ou pas, pour faire plaisir  tbc92 qui n'a pas compltement tort : en prod' deux boutons radio -couleur oppose -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 trs trs trs 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,  ::D:

----------


## sevyc64

Bon week-end  toi, c'est quand mme 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 dsormais pas faite du tout) car je suis maintenant en pravis. Je vais m'en aller martyriser quelques autres codes.

Par contre, je regarderais dans quelques temps, pour intgrer cela dans une petite bibliothque perso de snippets car a peut toujours servir.

----------


## wiwaxia

Salut,  ::D: 




> ... Au final je n'arrive  rien car je ne sais pas trop comment "causer" avec ta bote noire ...


Pas trs grave, c'est un ensemble d'instructions insparables, donc pas difficile  manier ... il faut simplement adapter les donnes introduites au contexte.
Si cela peut te remonter le moral, je viens de perdre un aprs-midi sur une erreur stupide (elles le sont toutes) de programmation  ::arf:: ; il a fallu passer  autre chose, et une nuit rparatrice a permis de tout remettre en ordre en quelques minutes.




> ... 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 rponse est dans les fonctions discontinues rappeles il y a peu (#117), et qui portent au choix sur l'indice de couleur ou sa luminance:


```

```

Exemple d'application du premier critre (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 situe *hors de l'axe chromatique*, mais trs proches des prcdents, 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 imprvisible et l'on a l'impression que le code adopte un comportement erratique.

Bon week-end.

----------


## wiwaxia

Bonjour,  ::D: 

Il existe un type de palette bidimensionnelle, dans laquelle les couleurs varient continment entre celles dfinies aux quatre coins de la figure (rectangle ou carr, la forme est indiffrente).
Les 3 composantes locales (r, v, b) dpendent des coordonnes relatives (x, y) par un polynme quadratique de la forme:


```
 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 donnes extrmes:


```

```

La courbure de la surface obtenue disparat lorsque concident les moyennes des valeurs aux sommets opposs;


```
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 relle du contour (carr, rectangle ou paralllogramme).

Le libre choix des quatre couleurs initiales permet une bonne exploration (bien que restreinte  une surface) des diverses rgions du domaine.
La particularit de la quadrique utilise est de contenir deux faisceaux de droites, les lignes d'quation (x = Cte) ou (y = Cte), de sorte qu'aucune valeur intermdiaire ne sort du domaine dfini par les donnes: [Min(Z00, Z10, Z01, Z11) ; Max(Z00, Z10, Z01, Z11)] .



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

----------


## wiwaxia

Pour rpondre avec plus de prcision  la question du choix de la couleur prsentant le plus grand contraste sur un fond donn, il faut considrer deux paramtres, relatifs  la fonction discontinue ncessairement prsente au coeur du programme, et qu'on supposera pour simplifier linaire par morceaux.

1) *Le seuil de discontinuit*: le choix se porte spontanment sur Lim1 = 255/2 = 127.5 ;
mais il se peut que la limite correspondant  une luminosit relative de 50% se rvle plus pertinente, soit: Lim2 = 255/(21/n) = 186 (pour n = 2.2) ou 191 (pour n = 2.4);
enfin rien n'empche, par prcaution, d"envisager une valeur intermdiaire, par exemple: Lim3 = 160 .

2) *La pente du graphe* de part et d'autre de la discontinuit: on a propos d'emble un dcalage 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] ;


```

```

cependant une pente plus rduite (par exemple 0.5) permet d'amliorer le contraste sur des fonds relativement sombres,  ce que ralise le code suivant:


```

```

le cas limite d'une pente nulle est le plus simple, la nouvelle couleur obtenue se rduisant  l'une des 8 couleurs fondamentales;


```

```

# La question des gris intermdiaires (souleve par *Jipt*) trouve ici sa rponse, car les rsultats ne dpendent 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 imprvisible


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 :

  

La limite mdiane parat donner le meilleur contraste ... mais chacun reste libre de son jugement.

# Voici pour le mme 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
 
■ p = 1/2
 
■ p = 0
 

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

----------


## Jipt

Bonjour,

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

Certainement que quelque chose de trs intressant doit se cacher dessous, permettant d'affiner aux petits oignons la formule magique qui permettra de trouver la meilleure couleur en matire de contraste et autres critres, mais je suis largu pour mettre a "en prod".

Alors j'ai suivi mon petit bonhomme de chemin, et j'en suis l :


en haut  gauche la couleur de fond pour laquelle on cherche la couleur au meilleur contraste,
dessous  gauche un panneau de rglages HSL et  droite son frre TSV, pour l'instant la couleur oppose choisie automatiquement puis ajuste ventuellement ici n'est pas encore rpercute 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 systme de capture (pour quand la copine vient avec une photo sur cl uzbe) qui recopiera la zone slectionne dans le grand rectangle, et enfin une petite image de la grande plus un choix de diffrents 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 prs avec les... curseurs !

Ce que j'ai fait pour gnrer 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 dtermine par l'outil comme oppose  l'orange.

Voili voilou,

PS : ne pas tenir compte du dcalage entre le curseur T  droite  210 et l'indicateur en bas  213, tout n'est pas fini (un ColorPicker confirme les chiffres des StatusBars).

----------


## Jipt

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 :


wiwaxia tu vas tre content : j'ai utilis ta formule pour la "cassure" du gris, je l'ai applique  la saturation en mode "ton sur ton" (mais bon, a surprend,  l'utilisation  ::mrgreen:: )

----------


## wiwaxia

Bonjour,  ::D: 




> ... j'ai utilis ta formule pour la "cassure" du gris, je l'ai applique  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 rsultats intressants. En rappel, et  toutes fins utiles, les fragments de code dtaills 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] ;
> 
> 
> ```
> 
> ```
> 
> # pente plus rduite (par exemple 0.5) 
> 
> ...


... ainsi que les graphes illustrant les discontinuits, et que je n'ai pas donn par ngligence - d'autant que j'ai quelque peu abus des grandes images, et de la patience des modrateurs  ::mrgreen::  


# Pour en revenir  l'une de tes prcdentes remarques, 



> ... 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'insrer du texte dans une image avec toute la libert souhaite; 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 vrifies sur 716 = 112 cases  coloration alatoire, je l'obtiens au niveau des 2020 = 400 petits cercles, et sur une variation progressive de la couleur du fond:



On y dcle ainsi facilement les variations du contraste, et les zones o il apparat insuffisant.

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

----------


## Jipt

Bonjour,

j'ai trente secondes...




> On y dcle ainsi facilement les variations du contraste, et les zones o il apparat insuffisant.


Certes, certes, cependant on ne m'tera pas de l'ide 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 approprie, 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


```

```

----------


## wiwaxia

Bonjour,  ::D: 

Je rponds rapidement  ton message, trouv  l'instant.




> ... cependant on ne m'tera pas de l'ide 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 approprie, 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
> 
> 
> ...


*C'est prcisment ce que fait chacune des 3 fonctions proposes* au message #127  ::mrgreen::  ; 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 procdure analogue existe dans l'arsenal de Delphi ou Lazarus: aprs tout, pourquoi pas ? 
Cependant quelqu'un nous l'aurait probablement indiqu depuis le dbut 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'insrer  tout prix la fonction d'un rpertoire donn (X) ou (Y)


```
Pochette_Surprise(c: Type_Pixel): Type_Pixel;
```

 dont on ne connat pas exactement le comportement.
Une fois cette tape franchie, le code suit naturellement.

De plus, les images proposes 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 ralise  sa faon. 
Et leur examen a permis, malgr leurs imperfections, d'apporter *deux rponses concernant le contraste optimal de couleur*: 
Lim = 160 pour la frontire de discontinuit, et Lum = 25% pour le basculement du noir au blanc (je reviendrai sur ce dernier point).

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

PS: Je viens de dcouvrir une srie d'articles tout rcemment parus sur le blog de *Gilles Vasseur* et qui pourraient t'intresser indirectement:

Rotation d'une image - bibliothque 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/

----------


## wiwaxia

Bonjour,  ::D: 

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.




> ... Deux exemples tout simples, et *dont les noms sont parlants* :
> 
> 
> ```
> 
> ```


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 rsultats:


```

```

dans l'emballage que tu souhaites:



> ... Il nous faudrait un truc du genre
> 
> 
> ```
> 
> ```


Pourrait-on envisager ceci ?


```

```

Il est sans doute possible d'amliorer 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 rponse rapide.

----------


## Jipt

Bonjour,

C'est rigolo ta rponse, c'est exactement ce  quoi je pensais ce matin  ::D: 




> Pourrait-on envisager ceci ?


Mais tout  fait !

Je dirai mme plus, dans la mesure o "Max" doit tre un _mot rserv_, qu'on va le remplacer par "Maxi", on peut mme dplacer "Lim" en second paramtre de la fonction et donc accessible de l'extrieur (curseur, zone de saisie, etc.), et j'accepte l'abrviation, ce qui donne :


```

```





> Il est sans doute possible d'amliorer ces instructions pachydermiques;


Meuh non, sont trs bien tes instructions, lisibles et tout ; malheureusement, je n'ai pas trop le temps de tester ce matin, mais je promets un retour rapide.

----------


## Jipt

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 rglages s'impose au graphiste soucieux d'un rsultat sympathique...

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

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 dernire image est un gif qui reprend les 5 :
 
 
 

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 (dj 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,  ::mouarf::

----------


## wiwaxia

Bonjour,  ::D: 

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 tt (#132, 02/03/2017, 17h27).
J'ai repris le test sur quelques fonds dgrads,  teintes arbitraires, en y ajoutant le trac de l'isophote limite, d'quation L = 0.25 .

 _  _  _ 

Le calcul de la luminance relative a t effectu  partir de son expression standard, dont le codage ne prsente pas de complication particulire, compte tenu de ce que la correction aux faibles clairements n'intervient pas. 



```

```


On a accord beaucoup trop d'importance (moi le premier)  des simplifications anecdotiques dont l'intrt apparat finalement contestable,  part soulager le lecteur ttanis par les mathmatiques  ::mrgreen::  .
Une approximation (cite nulle part) est  ce sujet envisageable, mais ce n'est pas le lieu de la dvelopper ici.

Le trac des graphes d'quiluminance pourrait tre amlior; il rsulte ici du balayage systmatique des colonnes, et de la dtection du changement de signe de l'cart: 
Elum = L(x, y) - 0.25 .

Voil donc la longue et laborieuse rponse apporte  la question de *sevyc64*.

# Il faut que je signale ici une rectification qui n'a pas t faite dans les dlais (#126 - 26/02/2017), afin d'viter une perte de temps  qui voudrait reprendre le calcul des dgrads:



> Les 3 composantes locales (r, v, b) dpendent des coordonnes relatives (x, y) par un polynme quadratique de la forme:
> 
> 
> ```
>  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 donnes extrmes:
> 
> ...

----------


## Jipt

Bonjour bonjour,



> [...] On a accord beaucoup trop d'importance (moi le premier)  des simplifications anecdotiques dont l'intrt apparat finalement contestable,  part soulager le *lecteur ttanis* par les mathmatiques  .


Ah, je me reconnais, l,  ::ptdr:: 

Bon, j'avais dit que je me pencherais sur CIE L*a*b* et son complment "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 bte 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 :


Il reste des cafouillages, notamment en col 5 ligne 2, col 6 ligne 7 et dernire col ligne 5, je crois que c'est invitable, mais dans l'ensemble c'est pas mal du tout.
Ceux qui veulent pinailler/affiner se rajouteront un curseur pour contrler la BlackBox et hop !  ::ccool::

----------


## wiwaxia

Bonjour,  ::D: 




> *Envoy par wiwaxia*
> [...] _On a accord beaucoup trop d'importance (moi le premier)  des simplifications anecdotiques dont l'intrt apparat finalement contestable,  part soulager le lecteur ttanis par les mathmatiques_ .
> Ah, je me reconnais, l,


Tu n'est pas le seul, et cela ne t'empche pas de mettre au point de belles palettes.




> ... Il reste des cafouillages, notamment ... , je crois que c'est invitable, mais dans l'ensemble c'est pas mal du tout ...


Il y a toujours des cas dcevants, prs de la frontire, que rien n'interdit de dplacer un peu (L = 24 ou 26 %); tu es par ailleurs dsavantag par la finesse des caractres affichs, qui ne facilite pas leur perception: essaie, si tu peux, le passage aux caractres gras.

# C'est seulement aprs coup, faute d'un bonne vue, que j'ai peru l'*aspect fortement dgrad du trac des graphes d'gal clairement L(x, y) = Cte*; cette altration ne relevait ni de la prsence des pixels, ni de la compression.

La cause a t vite repre: le balayage comportait le calcul de 5 points par pixel, afin de maintenir la continuit du graphe et d'viter l'apparition des pointills; et la dtermination de la luminance locale L(x, y) passait par celle du pixel virtuel correspondant, *triplet d'entiers* obtenus par arrondi:


```
TYPE Pixel = ARRAY[1..3] OF Byte;
```

Tout est rentr dans l'ordre aprs son remplacement par un vecteur de (R3), *triplet de rels* qui dispense d'utiliser la fonction _Round(.)_:


```
TYPE Lst3R = ARRAY[1..3] OF Extended;
```

Ainsi la seconde image, dont les dessins ont t soustraits:

* # Avant correction:*  * # Aprs:*  

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

* # Avant correction:* * # Aprs:*  

D'o la ncessit 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  ::aie::  _Fates ce que je dis, ne fates pas ce que je fais !_

----------


## Jipt

Bonjour,

je reviens sur ce sujet 9 mois tout ronds plus tard ( 3 jours prs, on va pas chipoter), juste le temps de faire un beau bb,  ::mouarf:: 

Ayant dtect des accrocs dans la premire version (


> Il reste des cafouillages, notamment en col 5 ligne 2, col 6 ligne 7 et dernire 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.  :8-): 

Pour vous montrer, j'ai ralis ce petit .gif avec des couleurs de fonds de cellule alatoires, et les couleurs du texte  la recherche du contraste perdu (on dirait du Proust,  ::ptdr:: ).
Il y a 3 images qui s'enchanent, les diffrences de rendu sont pilotes par une variable "seuil" qui oscille entre 16 et 20 par pas de 2, rpercute sur la variable L du triplet LCh.


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

Ma fonction de cration de couleur inverse devient donc (seuil = variable globale positionne par un curseur) :


```

```


Passez de bonnes ftes avec tout a,  ::P:

----------


## sevyc64

::king::

----------

