Implementazione di CIEDE2000 in bc
| Numero di visite | 527 |
|---|---|
| Numero di file visualizzati | 213 + 321 |
Questa pagina presenta un’implementazione di riferimento della formula della differenza cromatica CIEDE2000 in bc. Se si desidera ottenere una corrispondenza esatta con le implementazioni di terze parti fino a 10 cifre decimali, potrebbe essere necessario apportare alcune modifiche al codice sorgente, in particolare (de)commentando alcune righe, che possono essere applicate automaticamente tramite il link sottostante.
La funzione ΔE2000 in bc
Consideriamo la più comune e accademica (Sharma, 2005) delle due formulazioni.
/* This function written in bc 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. */
m_pi = 0.0
/* 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. */
define ciede_2000(l_1, a_1, b_1, l_2, a_2, b_2) {
/* Working in Basic Calculator with the CIEDE2000 color-difference formula.
k_l, k_c, k_h are parametric factors to be adjusted according to
different viewing parameters such as textures, backgrounds... */
k_l = 1.0
k_c = 1.0
k_h = 1.0
if (m_pi == 0.0) {
/* Computing pi ... 3.141592653589793238462643383279502884197169399375105820974945
with arbitrary precision using Machin’s formula proposed in 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
/* 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. */
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)
/* Using 14 lines to simulate atan2, as bc does not have this built-in. */
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
}
/* The atan2 polyfill (customized) is complete. */
if (h_2 < h_1) { n = h_1 - h_2; } else { n = h_2 - h_1; }
/* Cross-implementation consistent rounding. */
if (m_pi - 0.00000000000001 < n && n < m_pi + 0.00000000000001) { n = m_pi; }
/* 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. */
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
/* 📜 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. */
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
/* The hue rotation correction term is designed to account for the
non-linear behavior of hue differences in the blue region. */
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)
/* Lightness. */
l = (l_2 - l_1) / (k_l * (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 * 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
/* Hue. */
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))
/* Returning the square root ensures that dE00 accurately reflects the
geometric distance in color space, which can range from 0 to around 185. */
return sqrt(l * l + h * h + c * c + c * h * r_t)
}
/*
GitHub Project : https://github.com/michel-leonard/ciede2000-color-matching
Online Tests : 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, ...)
Deviation between implementations ≈ 1.4e-5
See the source code comments for easy switching between these two widely used ΔE*00 implementation variants.
*/Precisione e affidabilità del codice sorgente
La differenza tra le formulazioni di Sharma e Lindbloom non supera mai ±0,0003 sul ΔE2000 finale, il che corrisponde alla differenza abituale misurata tra due implementazioni a 32 bit ed è impercettibile a occhio umano. Le nostre implementazioni a 64 bit, tutte coerenti tra loro, garantiscono almeno 10 cifre decimali corrette, quindi la scelta di una formulazione rispetto a un’altra dipende principalmente dall’interoperabilità desiderata. La formulazione che appare di default in questa pagina è la più comunemente utilizzata (il suo micro-vantaggio è che si basa sulla comunità ed è più leggera del suo analogo quando viene vettorializzata).
✎ Se trovate un commento nel codice sorgente che non corrisponde a un’altra lingua, informate l’autore del sito, che studierà il vostro suggerimento e lo incorporerà nel codice sorgente.
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* si collocano solitamente tra -128 e +127, anche se possono superare leggermente questi limiti in base alle conversioni cromatiche.
| Colore 1 | Colore 2 | Valore di ΔE2000 |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 |
| Colore 1 | Colore 2 | Valore di ΔE2000 |
|---|---|---|
| 5 | ||
| 10 | ||
| 15 |
Parametri k_l, k_c e k_h
I parametri k_l, k_c e k_h sono fattori di ponderazione applicati ai termini di luminosità (ΔL*), croma (ΔC*) e tinta (ΔH*) nella formula CIEDE2000. Il loro valore predefinito è 1, che corrisponde alle condizioni di osservazione standard raccomandate dalla Commissione internazionale per l’illuminazione. In pratica, questi coefficienti vengono regolati per riflettere condizioni specifiche: ad esempio, k_l = 2 viene talvolta utilizzato per dare maggiore peso alle differenze di luminosità (comune nella stampa), mentre k_c o k_h possono essere ridotti per aumentare la tolleranza alle variazioni di saturazione o tinta a seconda delle esigenze del controllo qualità. A seconda del contesto, questi coefficienti variano tipicamente tra 0,5 e 2.
ΔE2000 (CIEDE2000) misura la differenza percepita tra due colori: 0 significa colori identici, e valori più alti (fino a circa 185 nei casi estremi) indicano una differenza più evidente. Per esempio, un ΔE2000 intorno a 5 indica colori vicini, mentre intorno a 15 indica colori chiaramente distinti.
Esempio di utilizzo in 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.37456659946646273510289154231355556542867583609039I risultati dei test
Questa funzione bc è stata testata con il driver Julia multi-precision progettato per questo scopo.
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-35File da scaricare
Un file qui sotto supporta i calcoli di precisione arbitraria in bc (utile se si ha a che fare con il ΔE2000 in metrologia). Sentitevi liberi di utilizzare questi file messi a disposizione da Michel, anche per scopi commerciali.
| File | Dimensione | Numero di clic |
|---|---|---|
| ciede-2000.bc | 4 KB | 86 |
| test-bc-arbitrary.yml | 7 KB | 70 |
| test-bc-standard.yml | 5 KB | 57 |
| reference-dataset.txt | 4 KB | 321 |
| Fai clic su bc.zip per scaricare tutti i file in un archivio. | ||
Comunità
Se volete lasciare la vostra opinione su questo codice sorgente bc o sul CIEDE2000 in generale, il libro degli ospiti contiene già 1 messaggi in italiano e 9 messaggi in totale, quindi fateci sapere cosa ne pensate.