Implementazione di CIEDE2000 in Wolfram Language
| Numero di visite | 771 |
|---|---|
| Numero di file visualizzati | 263 + 606 |
Questa pagina presenta unβimplementazione di riferimento della formula della differenza di colore CIEDE2000 scritta nel linguaggio di programmazione Wolfram Language. Se si vuole garantire la perfetta compatibilitΓ (con la decima cifra decimale) con alcune implementazioni di terze parti, potrebbe essere necessario modificare i commenti nel codice sorgente. Per facilitare questa operazione, il seguente link la automatizza.
La funzione ΔE2000 in Wolfram Language
Consideriamo la piΓΉ comune e accademica (Sharma, 2005) delle due formulazioni.
(* This function written in Wolfram Language is not affiliated with the CIE (International Commission on Illumination),
and is released into the public domain. It is provided "as is" without any warranty, express or implied. *)
(* The classic CIE ΞE2000 implementation, which operates on two L*a*b* colors, and returns their difference.
"l" ranges from 0 to 100, while "a" and "b" are unbounded and commonly clamped to the range of -128 to 127. *)
ciede2000[l1_Real, a1_Real, b1_Real, l2_Real, a2_Real, b2_Real] := Module[
(* Working in Mathematica with the CIEDE2000 color-difference formula.
kl, kc, kh are parametric factors to be adjusted according to
different viewing parameters such as textures, backgrounds... *)
{kl, kc, kh, n, c1, c2, h1, h2, npi, hm, p, t, h, c},
kl = 1.0;
kc = 1.0;
kh = 1.0;
npi = N[Pi];
n = (Sqrt[a1 * a1 + b1 * b1] + Sqrt[a2 * a2 + b2 * b2]) * 0.5;
n = n * n * n * n * n * n * n;
(* A factor involving chroma raised to the power of 7 designed to make
the influence of chroma on the total color difference more accurate. *)
n = 1.0 + 0.5 * (1.0 - Sqrt[n / (n + 6103515625.0)]);
(* Application of the chroma correction factor. *)
c1 = Sqrt[a1 * a1 * n * n + b1 * b1];
c2 = Sqrt[a2 * a2 * n * n + b2 * b2];
(* atan2 is preferred over atan because it accurately computes the angle of
a point (x, y) in all quadrants, handling the signs of both coordinates. *)
h1 = If[a1 == 0.0 && b1 == 0.0, 0.0, ArcTan[a1 * n, b1]];
h2 = If[a2 == 0.0 && b2 == 0.0, 0.0, ArcTan[a2 * n, b2]];
If[h1 < 0.0, h1 += 2.0 * npi];
If[h2 < 0.0, h2 += 2.0 * npi];
n = Abs[h2 - h1];
(* Cross-implementation consistent rounding. *)
If[npi - 1E-14 < n && n < npi + 1E-14, n = npi];
(* When the hue angles lie in different quadrants, the straightforward
average can produce a mean that incorrectly suggests a hue angle in
the wrong quadrant, the next lines handle this issue. *)
hm = (h1 + h2) * 0.5;
hd = (h2 - h1) * 0.5;
If[npi < n,
hd += npi;
(* π Sharmaβs formulation doesnβt use the next line, but the one after it,
and these two variants differ by Β±0.0003 on the final color differences. *)
hm += npi;
(* If[hm < npi, hm += npi, hm -= npi]; *)
];
p = 36.0 * hm - 55.0 * npi;
n = (c1 + c2) * 0.5;
n = n * n * n * n * n * n * n;
(* The hue rotation correction term is designed to account for the
non-linear behavior of hue differences in the blue region. *)
rt = -2.0 * Sqrt[n / (n + 6103515625.0)]
* Sin[npi / 3.0 * Exp[p * p / (-25.0 * npi * npi)]];
n = (l1 + l2) * 0.5;
n = (n - 50.0) * (n - 50.0);
(* Lightness. *)
l = (l2 - l1) / (kl * (1.0 + 0.015 * n / Sqrt[20.0 + n]));
(* These coefficients adjust the impact of different harmonic
components on the hue difference calculation. *)
t = 1.0 + 0.24 * Sin[2.0 * hm + npi * 0.5]
+ 0.32 * Sin[3.0 * hm + 8.0 * npi / 15.0]
- 0.17 * Sin[hm + npi / 3.0]
- 0.20 * Sin[4.0 * hm + 3.0 * npi / 20.0];
n = c1 + c2;
(* Hue. *)
h = 2.0 * Sqrt[c1 * c2] * Sin[hd] / (kh * (1.0 + 0.0075 * n * t));
(* Chroma. *)
c = (c2 - c1) / (kc * (1.0 + 0.0225 * n));
(* Returning the square root ensures that dE00 accurately reflects the
geometric distance in color space, which can range from 0 to around 185. *)
Sqrt[l * l + h * h + c * c + c * h * rt]
]
(*
GitHub Project : https://github.com/michel-leonard/ciede2000-color-matching
Online Tests : https://michel-leonard.github.io/ciede2000-color-matching
L1 = 40.5 a1 = 18.1 b1 = 4.2
L2 = 41.4 a2 = 22.9 b2 = -4.5
CIE ΞE00 = 6.4374339937 (Bruce Lindbloom, Netflixβs VMAF, ...)
CIE ΞE00 = 6.4374187569 (Gaurav Sharma, OpenJDK, ...)
Deviation between implementations β 1.5e-5
See the source code comments for easy switching between these two widely used ΞE*00 implementation variants.
*)Parametri kl, kc e kh
I parametri kl, kc e kh nella formula CIEDE2000 sono fattori di ponderazione applicati rispettivamente alle componenti di luminositΓ (ΞL*), croma (ΞC*) e tinta (ΞH*). Sono definiti come costanti nel codice sorgente. Nel codice sorgente sono definiti come costanti con un valore predefinito di 1, che corrisponde alle condizioni di osservazione standard stabilite dalla Commissione internazionale per lβilluminazione (CIE). In pratica, potrebbe essere necessario regolare questi coefficienti per riflettere condizioni specifiche: ad esempio, kl = 2 viene talvolta utilizzato per dare maggior peso alle differenze di luminositΓ (un caso comune nellβindustria tessile), mentre kc o kh possono essere ridotti per aumentare la tolleranza alle variazioni di saturazione o di tonalitΓ . In sintesi, questi coefficienti oscillano solitamente tra 0,5 e 2, dove 1 Γ¨ il valore piΓΉ comune.
Precisione e affidabilitΓ del codice sorgente
La differenza tra la formulazione accademica di Sharma e quella semplificata di Lindbloom non supera Β±0,0003 sul ΞE2000 finale. Lβimplementazione qui presentata Γ¨ a 64 bit e garantisce una precisione superiore a 10 cifre decimali; la scelta di una formulazione piuttosto che unβaltra Γ¨, quindi, un dettaglio tecnico. Nella parte superiore della pagina Γ¨ possibile scegliere tra le due formulazioni; quella attualmente visualizzata Γ¨ la formulazione semplificata.
Come si puΓ² stabilire se una determinata implementazione di CIEDE2000 Γ¨ accademica o semplificata?
- Valutate
ciede_2000(56.6, 43.6, 41.1, 68.4, 9.4, -8.6) - Se il risultato Γ¨
30.0001, si tratta del tipo accademico (come Sharma, OpenJDK, ecc.) - Se il risultato Γ¨
29.9999, si tratta del tipo semplificato (come Lindbloom, Netflix VMAF, ecc.)
Come si convertono i colori RGB in L*a*b*?
Andate alla pagina AWK, C, Dart, Java, JavaScript, Kotlin, Lua, PHP, Python, Ruby o Rust dove tale convertitore (che utilizza lβilluminante D65) Γ¨ giΓ implementato in aggiunta alla funzione di confronto dei colori.
Intervalli di valori in CIELAB e interpretazione del ΞE2000
Nello spazio colore CIELAB, la componente L* rappresenta la luminositΓ e varia tipicamente da 0 (nero) a 100 (bianco). Le componenti a* e b* definiscono gli assi cromatici: a* va dal verde al rosso, mentre b* va dal blu al giallo. In pratica, i valori di a* e b* sono quasi sempre compresi in un intervallo compreso tra -128 e +127, sebbene lo standard non specifichi un limite ufficiale per queste due componenti.
| Colore 1 | Colore 2 | Valore di ΞE2000 |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 |
| Colore 1 | Colore 2 | Valore di ΞE2000 |
|---|---|---|
| 5 | ||
| 10 | ||
| 15 |
ΞE2000 (CIEDE2000) misura la differenza percepita tra due colori: 0 significa colori identici, e valori più alti (fino a 185 e oltre) indicano una differenza più evidente. Per esempio, un ΔE2000 intorno a 5 indica colori vicini, mentre intorno a 15 indica colori chiaramente distinti. Quando il valore ΔE2000 supera 40, i colori confrontati non hanno praticamente più nulla in comune e non è più possibile ricavarne informazioni precise.
Esempio di utilizzo in Wolfram Language
(* Compute the Delta E (CIEDE2000) color difference between two L*a*b* colors in Mathematica
Color 1: l1 = 77.6 a1 = 50.3 b1 = 2.4
Color 2: l2 = 78.3 a2 = 56.0 b2 = -2.5 *)
deltaE = ciede2000[l1, a1, b1, l2, a2, b2];
Print[deltaE];
(* .................................................. This shows a ΔE2000 of 2.9599647256
As explained in the comments, compliance with Gaurav Sharma would display 2.9599515492 *)I risultati dei test
Il nostro programma di test, scritto in C99, comprende 250 test statici accurati. Questi test garantiscono che i calcoli vengano eseguiti senza errori, anche in casi limite critici, ad esempio quando la funzione arctangente restituisce un valore matematicamente indefinito. I risultati dimostrano che questa funzione CIEDE2000 in Wolfram Language Γ¨ interoperabile con gli 41 altri linguaggi di programmazione che offriamo.
CIEDE2000 Verification Summary :
First Verified Line : 95.39,17.64,40,6,-115.4,105,102.2384848229073
Duration : 19535.05 s
Successes : 100000000
Errors : 0
Average Delta E : 63.0889
Average Deviation : 1.1e-14
Maximum Deviation : 3.0e-13File da scaricare
Sentitevi liberi di utilizzare questi file messi a disposizione da Michel, anche per scopi commerciali.
| File | Dimensione | Numero di clic |
|---|---|---|
| ciede-2000.wl | 4 KB | 134 |
| ciede-2000-driver.wl | 5 KB | 129 |
| reference-dataset.txt | 4 KB | 606 |
| Fai clic su wl.zip per scaricare tutti i file in un archivio. | ||
ComunitΓ
Cosa ne pensate di questo codice sorgente o di CIEDE2000? La vostra opinione Γ¨ importante per noi! Il libro degli ospiti contiene giΓ 9 messaggi, di cui 1 in italiano. Date unβocchiata e condividete la vostra opinione.