Implementacja CIEDE2000 w Wolfram Language
| Liczba wizyt | 773 |
|---|---|
| Liczba przeglądanych plików | 263 + 607 |
Na tej stronie przedstawiono referencyjną implementację wzoru na różnicę kolorów CIEDE2000, napisaną w języku programowania Wolfram Language. Jeśli chcesz zapewnić idealną kompatybilność (do dziesiątego miejsca po przecinku) z niektórymi zewnętrznymi implementacjami, może być konieczne zmodyfikowanie komentarzy w kodzie źródłowym. Aby to ułatwić, poniższy link automatyzuje tę operację.
Funkcja ΔE2000 w Wolfram Language
Rozważmy bardziej powszechne i akademickie (Sharma, 2005) z dwóch sformułowań.
(* 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.
*)Parametry kl, kc i kh
Parametry kl, kc i kh we wzorze CIEDE2000 to współczynniki wagowe stosowane odpowiednio do składowych jasności (ΔL*), chromu (ΔC*) i odcienia (ΔH*). Są one zdefiniowane jako stałe w kodzie źródłowym. W kodzie źródłowym są one zdefiniowane jako stałe z domyślną wartością 1, która odpowiada standardowym warunkom obserwacji określonym przez Międzynarodową Komisję Oświetlenia (CIE). W praktyce może być konieczne dostosowanie tych współczynników w celu odzwierciedlenia określonych warunków: na przykład kl = 2 jest czasami używane, aby nadać większą wagę różnicom w jasności (powszechne zjawisko w przemyśle tekstylnym), podczas gdy kc lub kh można zmniejszyć, aby zwiększyć tolerancję na zmiany nasycenia lub odcienia. Podsumowując, współczynniki te wahają się zazwyczaj między 0,5 a 2, przy czym 1 jest wartością najczęściej spotykaną.
Dokładność i niezawodność kodu źródłowego
Różnica między akademickim sformułowaniem Sharmy a uproszczonym sformułowaniem Lindblooma nie przekracza ±0,0003 na końcowym ΔE2000. Przedstawiona tutaj implementacja jest 64-bitowa i zapewnia dokładność na ponad 10 miejsc po przecinku; wybór jednej z formuły zamiast drugiej jest zatem kwestią techniczną. Na górze strony można wybrać jedną z dwóch formuł; obecnie wyświetlana jest formuła uproszczona.
Jak można ustalić, czy dana implementacja CIEDE2000 jest typu akademickiego, czy uproszczonego?
- Oceń
ciede_2000(56.6, 43.6, 41.1, 68.4, 9.4, -8.6) - Jeśli wynik wynosi
30.0001, jest to typ akademicki (jak Sharma, OpenJDK itp.) - Jeśli wynik wynosi
29.9999, jest to typ uproszczony (jak Lindbloom, Netflix VMAF itp.)
Jak przekonwertować kolory RGB na L*a*b*?
Przejdź do strony AWK, C, Dart, Java, JavaScript, Kotlin, Lua, PHP, Python, Ruby lub Rust, gdzie taki konwerter (wykorzystujący iluminant D65) jest już zaimplementowany oprócz funkcji porównywania kolorów.
Zakresy wartości w CIELAB i interpretacja ΔE2000
W przestrzeni barw CIELAB składnik L* oznacza jasność i zwykle mieści się w zakresie od 0 (czarny) do 100 (biały). Składniki a* i b* opisują osie barw: a* przechodzi od zielonego do czerwonego, a b* od niebieskiego do żółtego. W praktyce wartości a* i b* prawie zawsze mieszczą się w przedziale od -128 do +127, chociaż norma nie określa oficjalnego ograniczenia dla tych dwóch składowych.
| Kolor 1 | Kolor 2 | Wartość ΔE2000 |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 |
| Kolor 1 | Kolor 2 | Wartość ΔE2000 |
|---|---|---|
| 5 | ||
| 10 | ||
| 15 |
ΔE2000 (CIEDE2000) określa percepcyjną różnicę między dwoma kolorami: 0 oznacza identyczne kolory, a wyższe wartości (do 185 i więcej) wskazują na większą różnicę. Na przykład wartość ΔE2000 około 5 oznacza kolory podobne, natomiast około 15 oznacza kolory wyraźnie różne. Gdy wartość ΔE2000 przekracza 40, porównywane kolory nie mają już praktycznie nic wspólnego i nie można z nich wyciągnąć żadnych konkretnych wniosków.
Przykład zastosowania w 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 *)Wyniki testów
Nasz program testowy, napisany w języku C99, zawiera 250 precyzyjnych testów statycznych. Testy te gwarantują, że obliczenia zostaną przeprowadzone bezbłędnie, nawet w krytycznych sytuacjach granicznych, na przykład gdy funkcja arctangens zwraca wartość matematycznie nieokreśloną. Wyniki pokazują, że ta funkcja CIEDE2000 w Wolfram Language jest interoperacyjna z 41 innymi językami programowania, które proponujemy.
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-13Pliki do pobrania
Zachęcamy do korzystania z tych plików udostępnionych przez Michela, nawet w celach komercyjnych.
| Plik | Rozmiar | Liczba kliknięć |
|---|---|---|
| ciede-2000.wl | 4 KB | 134 |
| ciede-2000-driver.wl | 5 KB | 129 |
| reference-dataset.txt | 4 KB | 607 |
| Kliknij wl.zip, aby pobrać wszystkie pliki w archiwum. | ||
Społeczność
Co sądzisz o tym kodzie źródłowym lub CIEDE2000? Twoja opinia jest dla nas ważna! Księga gości zawiera już 9 wiadomości - w tym 1 w języku polskim. Zajrzyj i podziel się swoją opinią.