Implémentation de CIEDE2000 en Prolog

Version de la fonction : v1.0.0
Statistiques du site
Nombre de visites580
Nombre de fichiers consultés277 + 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 Prolog. 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.

Diagramme de la formule CIEDE2000 complĂšte avec les composants L*a*b* et les ajustements.

La fonction ΔE2000 en Prolog

Considérons la plus courante et académique (Sharma, 2005) des deux formulations.

% Cette fonction écrite en Prolog est placée dans le domaine public et
% n’est pas affiliĂ©e Ă  la CIE (Commission Internationale de l’Éclairage).

% 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.
ciede_2000(L1, A1, B1, L2, A2, B2, DeltaE2000) :-
	% Traite la formule de différence de couleurs CIEDE2000 en Prolog.
	% K_L, K_C et K_H sont des facteurs paramĂ©triques qu’on ajuste
	% selon des recommandations propres au secteur industriel.
	K_L is 1.0,
	K_C is 1.0,
	K_H is 1.0,
	Pi_1 is 3.14159265358979323846,
	Pi_3 is 1.04719755119659774615,

	% 1. Calcul des chromas initiaux (norme des composantes a* et b*)
	A1_sq is A1 * A1,
	B1_sq is B1 * B1,
	C_orig_1 is sqrt(A1_sq + B1_sq),
	A2_sq is A2 * A2,
	B2_sq is B2 * B2,
	C_orig_2 is sqrt(A2_sq + B2_sq),

	% 2. Calcul du chroma moyen et du facteur de compensation G
	C_avg is 0.5 * (C_orig_1 + C_orig_2),
	C_avg_3 is C_avg * C_avg * C_avg,
	C_avg_7 is C_avg_3 * C_avg_3 * C_avg,
	G_denom is C_avg_7 + 6103515625.0,
	G_ratio is C_avg_7 / G_denom,
	G_sqrt is sqrt(G_ratio),
	G_factor is 1.0 + 0.5 * (1.0 - G_sqrt),

	% 3. Application de la correction G sur la composante a*, puis calcul des chromas corrigĂ©s C’
	A1_prime is A1 * G_factor,
	C1_prime_sq is A1_prime * A1_prime + B1 * B1,
	C1_prime is sqrt(C1_prime_sq),
	A2_prime is A2 * G_factor,
	C2_prime_sq is A2_prime * A2_prime + B2 * B2,
	C2_prime is sqrt(C2_prime_sq),

	% 4. Calcul des angles de teinte (en radians) et normalisation dans [0, 2π[
	H1_raw is atan2(B1, A1_prime),
	H2_raw is atan2(B2, A2_prime),
	(H1_raw < 0.0 -> H1_adj is H1_raw + 2.0 * Pi_1 ; H1_adj = H1_raw),
	(H2_raw < 0.0 -> H2_adj is H2_raw + 2.0 * Pi_1 ; H2_adj = H2_raw),
	Delta_h is abs(H1_adj - H2_adj),
	H_mean_raw is 0.5 * (H1_adj + H2_adj),
	H_diff_raw is 0.5 * (H2_adj - H1_adj),

	% Prise en compte du cas oĂč la moyenne de teinte traverse la discontinuitĂ© angulaire (π)
	Wrap_dist is abs(Pi_1 - Delta_h),
	(1.0e-14 < Wrap_dist, Pi_1 < Delta_h -> Hue_wrap = 1.0 ; Hue_wrap = 0),
	H_diff is H_diff_raw + Hue_wrap * Pi_1,
	% 📜 La formulation de Sharma n’utilise pas la ligne suivante, mais plutît les trois d’aprùs.
	% Note : ces deux variantes ne diffÚrent que de ±0,0003 sur la différence de couleur finale.
	H_mean is H_mean_raw + Hue_wrap * Pi_1,
	% (Hue_wrap =:= 1, H_mean_raw < Pi_1 -> H_mean_hi = Pi_1 ; H_mean_hi = 0.0),
	% (Hue_wrap =:= 1, H_mean_hi =:= 0.0 -> H_mean_lo = Pi_1 ; H_mean_lo = 0.0),
	% H_mean is H_mean_raw + H_mean_hi - H_mean_lo,

	% 5. Calcul du facteur correctif d’interaction teinte–chroma R_T
	C_bar is 0.5 * (C1_prime + C2_prime),
	C_bar_3 is C_bar * C_bar * C_bar,
	C_bar_7 is C_bar_3 * C_bar_3 * C_bar,
	Rc_denom is C_bar_7 + 6103515625.0,
	R_C is sqrt(C_bar_7 / Rc_denom),
	Theta is 36.0 * H_mean - 55.0 * Pi_1,
	Theta_denom is -25.0 * Pi_1 * Pi_1,
	Exp_argument is Theta * Theta / Theta_denom,
	Exp_term is exp(Exp_argument),
	Delta_theta is Pi_3 * Exp_term,
	Sin_term is sin(Delta_theta),

	% Terme d’interaction entre la diffĂ©rence de chroma et la diffĂ©rence de teinte
	R_T is -2.0 * R_C * Sin_term,

	% 6. Calcul du terme de luminance (canal L*)
	L_avg is 0.5 * (L1 + L2),
	L_delta_sq is (L_avg - 50.0) * (L_avg - 50.0),
	L_delta is L2 - L1,

	% Adaptation à la non-linéarité de la perception de la luminance (facteur S_L)
	S_l_num is 0.015 * L_delta_sq,
	S_l_denom is sqrt(20.0 + L_delta_sq),
	S_L is 1.0 + S_l_num / S_l_denom,
	L_term is L_delta / (K_L * S_L),

	% 7. Calcul des termes trigonométriques dépendant de la teinte moyenne et du facteur T
	Trig_1 is 0.17 * sin(H_mean + Pi_3),
	Trig_2 is 0.24 * sin(2.0 * H_mean + 0.5 * Pi_1),
	Trig_3 is 0.32 * sin(3.0 * H_mean + 1.6  * Pi_3),
	Trig_4 is  0.2 * sin(4.0 * H_mean + 0.15 * Pi_1),
	T is 1.0 - Trig_1 + Trig_2 + Trig_3 - Trig_4,
	C_sum is C1_prime + C2_prime,
	C_product is C1_prime * C2_prime,
	C_geo_mean is sqrt(C_product),

	% 8. Calcul de la diffĂ©rence de teinte et du facteur d’échelle S_H
	Sin_h_diff is sin(H_diff),
	S_H is 1.0 + 0.0075 * C_sum * T,
	H_term is 2.0 * C_geo_mean * Sin_h_diff / (K_H * S_H),

	% 9. Calcul de la diffĂ©rence de chroma et du facteur d’échelle S_C
	C_delta is C2_prime - C1_prime,
	S_C is 1.0 + 0.0225 * C_sum,
	C_term is C_delta / (K_C * S_C),

	% 10. Combinaison des termes de luminance, chroma, teinte et interaction (ΔE₀₀)
	L_part is L_term * L_term,
	C_part is C_term * C_term,
	H_part is H_term * H_term,
	Interaction is C_term * H_term * R_T,
	Delta_e_squared is L_part + C_part + H_part + Interaction,
	DeltaE2000 is sqrt(Delta_e_squared).

%    Projet GitHub : https://github.com/michel-leonard/ciede2000-color-matching
%   Tests en ligne : https://michel-leonard.github.io/ciede2000-color-matching

% L1 = 14.8   a1 = 33.5   b1 = 2.4
% L2 = 16.6   a2 = 38.1   b2 = -2.7
% CIE ΔE00 = 3.6462011992 (Bruce Lindbloom, Netflix’s VMAF, ...)
% CIE ΔE00 = 3.6461873926 (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é ?

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.

Exemple de deux couleurs présentant une différence à peine perceptible (JND) selon CIEDE2000
Couleur 1Couleur 2Valeur de ΔE2000
1
2
3
Exemples de valeurs CIEDE2000 calculées entre deux couleurs distinctes
Couleur 1Couleur 2Valeur 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 Prolog

% Compute the Delta E (CIEDE2000) color difference between two L*a*b* colors in Prolog

color_1([69.5, 43.6, -1.8]).
color_2([70.2, 37.9, 1.6]).

extract_lab([L, A, B], L, A, B).

compute_delta_e :-
	color_1(C1),
	color_2(C2),
	extract_lab(C1, L1, A1, B1),
	extract_lab(C2, L2, A2, B2),
	ciede_2000(L1, A1, B1, L2, A2, B2, DeltaE),
	format('Delta E 2000 = ~10f~n', [DeltaE]).

% .................................................. This shows a ΔE2000 of 2.8044781137
% As explained in the comments, compliance with Gaurav Sharma would display 2.8044649638

Résultats des tests

Notre programme de tests, Ă©crit en C99, comprend 250 tests statiques prĂ©cis. 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. Les rĂ©sultats montrent que cette fonction CIEDE2000 en Prolog est interopĂ©rable avec les 41 autres langages de programmation que nous proposons.

CIEDE2000 Verification Summary :
  First Verified Line : 27,-123,101,44,-30,122,29.98937281745311
             Duration : 254.09 s
            Successes : 10000000
               Errors : 0
      Average Delta E : 63.2072
    Average Deviation : 5.0e-15
    Maximum Deviation : 1.1e-13

Fichiers à télécharger

Utilisez librement ces fichiers mis Ă  disposition par Michel, mĂȘme Ă  des fins commerciales.

Statistiques du site : téléchargements
FichierTailleNombre de clics
ciede-2000.pro5 KB112
ciede-2000-driver.pro6 KB110
test-pro.yml4 KB55
reference-dataset.txt4 KB607
Cliquez sur pro.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.