Implementazione di CIEDE2000 in Wren

Versione della funzione: v1.0.0
Statistiche del sito
Numero di visite303
Numero di file visualizzati221 + 398

Questa pagina presenta unโ€™implementazione di riferimento della formula della differenza di colore CIEDE2000 in Wren. 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.

Diagramma della formula CIEDE2000 in forma completa con i componenti L*a*b* e le regolazioni

La funzione ΔE2000 in Wren

Consideriamo la piรน comune e accademica (Sharma, 2005) delle due formulazioni.

// This function written in Wren 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.
var ciede_2000 = Fn.new { |l_1, a_1, b_1, l_2, a_2, b_2|
	// Working in Wren 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...
	var k_l = 1.0
	var k_c = 1.0
	var k_h = 1.0
	var n = ((a_1 * a_1 + b_1 * b_1).sqrt + (a_2 * a_2 + b_2 * b_2).sqrt) * 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 - (n / (n + 6103515625.0)).sqrt)
	// Application of the chroma correction factor.
	var c_1 = (a_1 * a_1 * n * n + b_1 * b_1).sqrt
	var c_2 = (a_2 * a_2 * n * n + b_2 * b_2).sqrt
	// 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.
	var h_1 = b_1.atan(a_1 * n)
	var h_2 = b_2.atan(a_2 * n)
	if (h_1 < 0.0) h_1 = h_1 + 2.0 * Num.pi
	if (h_2 < 0.0) h_2 = h_2 + 2.0 * Num.pi
	n = (h_2 - h_1).abs
	// Cross-implementation consistent rounding.
	if (Num.pi - 1E-14 < n && n < Num.pi + 1E-14) n = Num.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.
	var h_m = (h_1 + h_2) * 0.5
	var h_d = (h_2 - h_1) * 0.5
	if (Num.pi < n) {
		h_d = h_d + Num.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 + Num.pi
		// h_m = h_m + (h_m < Math.PI ? Math.PI : -Math.PI)
	}
	var p = 36.0 * h_m - 55.0 * Num.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.
	var r_t = -2.0 * (n / (n + 6103515625.0)).sqrt * (Num.pi / 3.0 *
		2.71828182845904523536.pow(p * p / (-25.0 * Num.pi * Num.pi))).sin
	n = (l_1 + l_2) * 0.5
	n = (n - 50.0) * (n - 50.0)
	// Lightness.
	var l = (l_2 - l_1) / (k_l * (1.0 + 0.015 * n / (20.0 + n).sqrt))
	// These coefficients adjust the impact of different harmonic
	// components on the hue difference calculation.
	var t = 1.0 +	0.24 * (2.0 * h_m + Num.pi * 0.5).sin +
			0.32 * (3.0 * h_m + 8.0 * Num.pi / 15.0).sin -
			0.17 * (h_m + Num.pi / 3.0).sin -
			0.20 * (4.0 * h_m + 3.0 * Num.pi / 20.0).sin
	n = c_1 + c_2
	// Hue.
	var h = 2.0 * (c_1 * c_2).sqrt * h_d.sin / (k_h * (1.0 + 0.0075 * n * t))
	// Chroma.
	var 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 (l * l + h * h + c * c + c * h * r_t).sqrt
}

// GitHub Project : https://github.com/michel-leonard/ciede2000-color-matching
//   Online Tests : https://michel-leonard.github.io/ciede2000-color-matching

// L1 = 35.0   a1 = 57.0   b1 = -3.3
// L2 = 35.5   a2 = 62.4   b2 = 3.7
// CIE ฮ”E00 = 3.5439355959 (Bruce Lindbloom, Netflixโ€™s VMAF, ...)
// CIE ฮ”E00 = 3.5439486703 (Gaurav Sharma, OpenJDK, ...)
// Deviation between implementations โ‰ˆ 1.3e-5

// See the source code comments for easy switching between these two widely used ฮ”E*00 implementation variants.

Parametri k_l, k_c e k_h

I parametri k_l, k_c e k_h 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, k_l = 2 viene talvolta utilizzato per dare maggior peso alle differenze di luminositร  (un caso comune nellโ€™industria tessile), mentre k_c o k_h 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?

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.

Esempio di due colori che presentano una differenza appena percettibile (JND) secondo CIEDE2000
Colore 1Colore 2Valore di ฮ”E2000
1
2
3
Esempi di valori CIEDE2000 calcolati tra due colori diversi
Colore 1Colore 2Valore 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 Wren

// Example usage of the ΔE*00 function in Wren

var l1 = 91.0, a1 = 40.7, b1 = 4.0
var l2 = 93.0, a2 = 34.5, b2 = -2.2

var delta_e = ciede_2000(l1, a1, b1, l2, a2, b2)
System.print(delta_e)

// .................................................. This shows a ΔE2000 of 4.3724700322
// As explained in the comments, compliance with Gaurav Sharma would display 4.3724840146

I risultati dei test

Il nostro programma di test, scritto in C99, comprende 250 test statici accurati. I risultati dimostrano che questa funzione di CIEDE2000 in Wren รจ interoperabile con gli altri 41 linguaggi di programmazione.

CIEDE2000 Verification Summary :
  First Verified Line : 52.11,32.4,35,37,116,55,26.287015265926
             Duration : 72.22 s
            Successes : 10000000
               Errors : 0
      Average Delta E : 62.9356
    Average Deviation : 4.5509643875618626e-13
    Maximum Deviation : 5.0590642786119133e-12

File da scaricare

Sentitevi liberi di utilizzare questi file messi a disposizione da Michel, anche per scopi commerciali.

Statistiche del sito : download di file
FileDimensioneNumero di clic
ciede-2000.wren4 KB65
ciede-2000-driver.wren5 KB58
ciede-2000-random.wren6 KB69
test-wren.yml4 KB29
reference-dataset.txt4 KB398
Fai clic su wren.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.