Implémentation de CIEDE2000 en bc
| Nombre de visites | 810 |
|---|---|
| Nombre de fichiers consultés | 318 + 607 |
Cette page prĂ©sente une implĂ©mentation de rĂ©fĂ©rence de la formule de diffĂ©rence de couleur CIEDE2000, Ă©crite en langage de programmation bc. Si vous souhaitez assurer une compatibilitĂ© parfaite (Ă la dixiĂšme dĂ©cimale) avec certaines implĂ©mentations tierces, vous devrez peut-ĂȘtre modifier les commentaires dans le code source. Pour vous faciliter la tĂąche, le lien suivant automatise cette opĂ©ration.
La fonction ΔE2000 en bc
Considérons la plus courante et académique (Sharma, 2005) des deux formulations.
/* Cette fonction écrite en bc est placée dans le domaine public et
nâest pas affiliĂ©e Ă la CIE (Commission Internationale de lâĂclairage). */
m_pi = 0.0
/* LâimplĂ©mentation CIEDE2000 classique qui accepte deux couleurs L*a*b* et renvoie leur diffĂ©rence.
La composante "L" varie de 0 à 100. "a" et "b", non bornées, sont souvent projetées entre -128 et 127. */
define ciede_2000(l_1, a_1, b_1, l_2, a_2, b_2) {
/* Traite la formule de différence de couleurs CIEDE2000 en Basic Calculator.
k_l, k_c et k_h sont des facteurs paramĂ©triques quâon ajuste
selon des recommandations propres au secteur industriel. */
k_l = 1.0
k_c = 1.0
k_h = 1.0
if (m_pi == 0.0) {
/* Calcul de Ï âŠ 3,141592653589793238462643383279502884197169399375105820974945
avec une précision arbitraire en utilisant la formule de Machin proposée en 1706. */
m_pi = 16.0 * a(0.2) - 4.0 * a(1.0 / 239.0)
}
n = (sqrt(a_1 * a_1 + b_1 * b_1) + sqrt(a_2 * a_2 + b_2 * b_2)) * 0.5
n = n * n * n * n * n * n * n
/* Un facteur impliquant la chroma moyenne Ă la puissance 7,
conçu pour modéliser plus précisément son influence. */
n = 1.0 + 0.5 * (1.0 - sqrt(n / (n + 6103515625.0)))
/* Application du facteur de correction de la chroma pour compenser sa non-linéarité. */
c_1 = sqrt(a_1 * a_1 * n * n + b_1 * b_1)
c_2 = sqrt(a_2 * a_2 * n * n + b_2 * b_2)
/* Utilisation de 14 lignes pour simuler atan2, car bc nâa pas cette fonction. */
if (0.0 < a_1) {
h_1 = a(b_1 / (a_1 * n)) + (b_1 < 0.0) * 2.0 * m_pi
} else if (a_1 < 0.0) {
h_1 = a(b_1 / (a_1 * n)) + m_pi
} else {
h_1 = m_pi + ((b_1 < 0.0) - (0.0 < b_1)) * 0.5 * m_pi
}
if (0.0 < a_2) {
h_2 = a(b_2 / (a_2 * n)) + (b_2 < 0.0) * 2.0 * m_pi
} else if (a_2 < 0.0) {
h_2 = a(b_2 / (a_2 * n)) + m_pi
} else {
h_2 = m_pi + ((b_2 < 0.0) - (0.0 < b_2)) * 0.5 * m_pi
}
/* Le calcul avec atan2 adapté à CIEDE2000 est terminé. */
if (h_2 < h_1) { n = h_1 - h_2; } else { n = h_2 - h_1; }
/* Prévient le branchement de dépendre du RoundingMode du langage de programmation. */
if (m_pi - 0.00000000000001 < n && n < m_pi + 0.00000000000001) { n = m_pi; }
/* Lorsque les angles de teinte sont dans différents quadrants,
la moyenne arithmétique simple peut donner un angle incorrect,
les lignes suivantes prennent en compte cette correction angulaire. */
h_m = (h_1 + h_2) * 0.5
h_d = (h_2 - h_1) * 0.5
if (m_pi < n) {
h_d = h_d + m_pi
/* đ La formulation de Sharma nâutilise pas la ligne suivante, mais plutĂŽt celle dâaprĂšs.
Note : ces deux variantes ne diffÚrent que de ±0,0003 sur la différence de couleur finale. */
h_m = h_m + m_pi
/* h_m = h_m + ((h_m < m_pi) - (m_pi <= h_m)) * m_pi */
}
p = 36.0 * h_m - 55.0 * m_pi
n = (c_1 + c_2) * 0.5
n = n * n * n * n * n * n * n
/* Le terme de correction de la rotation de teinte ajuste le comportement
de lâalgorithme, dâautant plus si la comparaison porte sur des teintes bleues. */
r_t = -2.0 * sqrt(n / (n + 6103515625.0)) \
* s(m_pi / 3.0 * e(p * p / (-25.0 * m_pi * m_pi)))
n = (l_1 + l_2) * 0.5
n = (n - 50.0) * (n - 50.0)
/* Luminosité. */
l = (l_2 - l_1) / (k_l * (1.0 + 0.015 * n / sqrt(20.0 + n)))
/* Ces coefficients modulent lâinfluence des composantes
harmoniques dans le calcul de la différence de teinte. */
t = 1.0 + 0.24 * s(2.0 * h_m + m_pi / 2.0) \
+ 0.32 * s(3.0 * h_m + 8.0 * m_pi / 15.0) \
- 0.17 * s(h_m + m_pi / 3.0) \
- 0.20 * s(4.0 * h_m + 3.0 * m_pi / 20.0)
n = c_1 + c_2
/* Teinte. */
h = 2.0 * sqrt(c_1 * c_2) * s(h_d) / (k_h * (1.0 + 0.0075 * n * t))
/* Chroma. */
c = (c_2 - c_1) / (k_c * (1.0 + 0.0225 * n))
/* Retourner la racine carrée assure que dE00 représente une distance
gĂ©omĂ©trique (comprise entre 0 et environ 185) dans lâespace CIELAB. */
return sqrt(l * l + h * h + c * c + c * h * r_t)
}
/*
Projet GitHub : https://github.com/michel-leonard/ciede2000-color-matching
Tests en ligne : https://michel-leonard.github.io/ciede2000-color-matching
L1 = 30.8 a1 = 22.0 b1 = -4.4
L2 = 28.1 a2 = 16.4 b2 = 4.3
CIE ÎE00 = 7.0779305175 (Bruce Lindbloom, Netflixâs VMAF, ...)
CIE ÎE00 = 7.0779164917 (Gaurav Sharma, OpenJDK, ...)
Ăcart entre les implĂ©mentations â 1.4e-5
Voir les commentaires du code source pour passer dâune de ces variantes dâimplĂ©mentation de ÎE*00 Ă lâautre.
*/ParamĂštres k_l, k_c et k_h
Les paramĂštres k_l, k_c et k_h de la formule CIEDE2000 sont des facteurs de pondĂ©ration appliquĂ©s respectivement aux composantes de luminositĂ© (ÎL*), de chroma (ÎC*) et de teinte (ÎH*). Dans le code source, ils sont dĂ©finis comme des constantes dont la valeur par dĂ©faut est 1, ce qui correspond aux conditions dâobservation standard prĂ©vues par la Commission internationale de lâĂ©clairage (CIE). En pratique, il peut ĂȘtre nĂ©cessaire dâajuster ces coefficients en fonction de conditions spĂ©cifiques : par exemple, k_l = 2 est parfois utilisĂ© pour donner plus de poids aux diffĂ©rences de luminositĂ© (cas frĂ©quent dans lâindustrie textile), tandis que k_c ou k_h peuvent ĂȘtre rĂ©duits pour augmenter la tolĂ©rance aux variations de saturation ou de teinte. En rĂ©sumĂ©, ces coefficients varient gĂ©nĂ©ralement entre 0,5 et 2, la valeur la plus courante Ă©tant 1.
Précision et fiabilité du code source
La diffĂ©rence entre la formulation acadĂ©mique de Sharma et la formulation simplifiĂ©e de Lindbloom ne dĂ©passe pas ±0,0003 sur le ÎE2000 final. LâimplĂ©mentation prĂ©sentĂ©e ici est en 64 bits et garantit de plus de 10 dĂ©cimales correctes ; le choix dâune formulation plutĂŽt quâune autre relĂšve donc dâun dĂ©tail technique. En haut de la page, vous pouvez choisir entre les deux formulations ; celle qui sâaffiche actuellement est la formulation simplifiĂ©e.
Comment déterminer si une implémentation donnée de CIEDE2000 est de type académique ou simplifié ?
- Ăvaluez
ciede_2000(56.6, 43.6, 41.1, 68.4, 9.4, -8.6) - Si le résultat est
30.0001, il sâagit du type acadĂ©mique (comme Sharma, OpenJDK, etc.) - Si le rĂ©sultat est
29.9999, il sâagit du type simplifiĂ© (comme Lindbloom, Netflix VMAF, etc.)
Comment convertir les couleurs RGB en L*a*b* ?
Rendez-vous sur la page AWK, C, Dart, Java, JavaScript, Kotlin, Lua, PHP, Python, Ruby ou Rust oĂč un tel convertisseur (utilisant lâilluminant D65) est dĂ©jĂ implĂ©mentĂ© en plus de la fonction de comparaison de couleurs.
Plages de valeurs dans CIELAB et interprĂ©tation du ÎE2000
Dans lâespace colorimĂ©trique CIELAB, la composante L* reprĂ©sente la luminositĂ© et varie de 0 (noir) Ă 100 (blanc). Les composantes a* et b* dĂ©crivent les axes de couleur : a* sâĂ©tend du vert au rouge, tandis que b* va du bleu au jaune. Dans la pratique, les valeurs de a* et b* sont presque toujours comprises entre -128 et +127, bien que la norme ne fixe pas de limite officielle pour ces deux composantes.
| Couleur 1 | Couleur 2 | Valeur de ÎE2000 |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 |
| Couleur 1 | Couleur 2 | Valeur de ÎE2000 |
|---|---|---|
| 5 | ||
| 10 | ||
| 15 |
Le ÎE2000 (CIEDE2000) quantifie la différence perceptuelle entre deux couleurs : 0 signifie deux couleurs identiques, et des valeurs plus élevées (jusqu’à 185 et plus) indiquent une différence plus marquée. Par exemple, une valeur ΔE2000 autour de 5 correspond à des couleurs proches, tandis qu’une valeur autour de 15 correspond à des couleurs clairement distinctes. Lorsque la valeur ΔE2000 dépasse 40, les couleurs comparées n’ont pratiquement plus rien en commun, et nous ne pouvons plus en tirer d’informations précises.
Exemple d’utilisation en bc
echo 'scale=50;ciede_2000(13.1, 11.9, 3.8, 13.0, 17.6, -4.9)' | bc -l ciede-2000.bc
# Outputs: 7.37458016458016885544127036110301868134320454640263
# As explained in the comments, compliance with Gaurav Sharma would display ...
# ........ 7.37456659946646273510289154231355556542867583609039Résultats des tests
Cette fonction bc a été testée avec le pilote multiprécision Julia conçu à cette fin. Ces tests assurent que vos calculs sâeffectueront sans erreur, mĂȘme dans des cas limites critiques, par exemple lorsque la fonction arc tangente renvoie une valeur mathĂ©matiquement indĂ©finie.
CIEDE2000 Verification Summary :
First Verified Line : 27,-123,101,44,42.0000098,-99,70.204734814936909810694644954670527048474482887
Duration : 18644.34 s
Successes : 10000000
Errors : 0
Average Delta E : 62.9618
Average Deviation : 4.0e-38
Maximum Deviation : 2.2e-35Fichiers à télécharger
Un fichier ci-dessous prend en charge les calculs en prĂ©cision arbitraire en bc (utile si vous traitez ÎE2000 en mĂ©trologie). Utilisez librement ces fichiers mis Ă disposition par Michel, mĂȘme Ă des fins commerciales.
| Fichier | Taille | Nombre de clics |
|---|---|---|
| ciede-2000.bc | 4 KB | 143 |
| test-bc-arbitrary.yml | 7 KB | 100 |
| test-bc-standard.yml | 5 KB | 75 |
| reference-dataset.txt | 4 KB | 607 |
| Cliquez sur bc.zip pour télécharger tous ces fichiers dans une archive. | ||
Communauté
Que pensez-vous de ce code source ou de CIEDE2000 ? Votre avis nous intĂ©resse ! Ce site web spĂ©cialisĂ© comporte un livre dâor qui inclut dĂ©jĂ 9 messages dont 1 en français. Faites-y un tour et partagez votre avis.