Implementazione di CIEDE2000 in SQL

Versione della funzione: v1.0.0
Statistiche del sito
Numero di visite416
Numero di file visualizzati242 + 308

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

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

La funzione ΔE2000 in SQL

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

-- This function written in SQL 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.

DELIMITER //

-- Delete any function of the same name that already exists
DROP FUNCTION IF EXISTS ciede_2000 //

-- 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.
CREATE FUNCTION ciede_2000(l_1 DOUBLE, a_1 DOUBLE, b_1 DOUBLE, l_2 DOUBLE, a_2 DOUBLE, b_2 DOUBLE)
RETURNS DOUBLE
DETERMINISTIC
NO SQL
BEGIN
	-- Working in SQL/PSM 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...
	DECLARE k_l, k_c, k_h DOUBLE DEFAULT 1.0;
	DECLARE n, c_1, c_2, h_1, h_2, h_m, h_d, r_t, p, t, l, c, h DOUBLE;

	SET n = (SQRT(a_1 * a_1 + b_1 * b_1) + SQRT(a_2 * a_2 + b_2 * b_2)) * 0.5;
	SET 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.
	SET n = 1.0 + 0.5 * (1.0 - SQRT(n / (n + 6103515625.0)));
	-- Application of the chroma correction factor.
	SET c_1 = SQRT(a_1 * a_1 * n * n + b_1 * b_1);
	SET c_2 = SQRT(a_2 * a_2 * n * n + b_2 * b_2);
	-- 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.
	SET h_1 = COALESCE(ATAN2(b_1, a_1 * n), 0);
	SET h_2 = COALESCE(ATAN2(b_2, a_2 * n), 0);
	IF h_1 < 0 THEN SET h_1 = h_1 + 2 * PI(); END IF;
	IF h_2 < 0 THEN SET h_2 = h_2 + 2 * PI(); END IF;
	SET n = ABS(h_2 - h_1);
	-- Cross-implementation consistent rounding.
	IF PI() - 1E-14 < n AND n < PI() + 1E-14 THEN SET n = PI(); END IF;
	-- 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.
	SET h_m = (h_1 + h_2) * 0.5;
	SET h_d = (h_2 - h_1) * 0.5;
	IF PI() < n THEN
		SET h_d = h_d + 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.
		SET h_m = h_m + PI();
		-- SET h_m = h_m + CASE WHEN h_m < PI() THEN PI() ELSE -PI() END;
	END IF;
	SET p = 36.0 * h_m - 55.0 * PI();
	SET n = (c_1 + c_2) * 0.5;
	SET 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.
	SET r_t = -2.0 * SQRT(n / (n + 6103515625.0)) * SIN(PI() / 3.0 * EXP(p * p / (-25.0 * PI() * PI())));
	SET n = (l_1 + l_2) * 0.5;
	SET n = (n - 50.0) * (n - 50.0);
	-- Lightness.
	SET 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.
	SET t = 1.0	+ 0.24 * SIN(2.0 * h_m + PI() * 0.5)
			+ 0.32 * SIN(3.0 * h_m + 8.0 * PI() / 15.0)
			- 0.17 * SIN(h_m + PI() / 3.0)
			- 0.20 * SIN(4.0 * h_m + 3.0 * PI() / 20.0);
	SET n = c_1 + c_2;
	-- Hue.
	SET h = 2.0 * SQRT(c_1 * c_2) * SIN(h_d) / (k_h * (1.0 + 0.0075 * n * t));
	-- Chroma.
	SET 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);
END //

DELIMITER ;

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

-- L1 = 52.3   a1 = 21.9   b1 = 2.7
-- L2 = 53.8   a2 = 28.0   b2 = -3.1
-- CIE ฮ”E00 = 5.0119430211 (Bruce Lindbloom, Netflixโ€™s VMAF, ...)
-- CIE ฮ”E00 = 5.0119254601 (Gaurav Sharma, OpenJDK, ...)
-- Deviation between implementations โ‰ˆ 1.8e-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.

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

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 SQL

-- Example usage of the ΔE*00 function in SQL

-- Color 1: l1 = 94.1   a1 = 30.7   b1 = 2.9
-- Color 2: l2 = 92.2   a2 = 26.4   b2 = -2.2

SELECT ciede_2000(l1, a1, b1, l2, a2, b2) AS delta_e;

-- .................................................. This shows a ΔE2000 of 3.8819773139
-- As explained in the comments, compliance with Gaurav Sharma would display 3.8819904826

I risultati dei test

Il driver scritto in linguaggio C99, con 250 test statici precisi, ha dimostrato che questa funzione SQL รจ interoperabile con la funzione CIEDE2000 disponibile in altri linguaggi di programmazione.

CIEDE2000 Verification Summary :
  First Verified Line : 57.7,61,95.1,50.49,-53,-91.7,72.48542739412765
             Duration : 44.06 s
            Successes : 10000000
               Errors : 0
      Average Delta E : 62.9405
    Average Deviation : 4.2545206732635951e-15
    Maximum Deviation : 1.1368683772161603e-13

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.sql4 KB65
ciede-2000.pg.sql4 KB68
test-sql-mariadb.yml5 KB50
test-sql-postgresql.yml3 KB59
reference-dataset.txt4 KB308
Fai clic su sql.zip per scaricare tutti i file in un archivio.

Comunitร 

Se volete lasciare la vostra opinione su questo codice sorgente SQL 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.