CIEDE2000-Implementierung in PHP
| Anzahl der Besuche | 723 |
|---|---|
| Anzahl der angesehenen Dateien | 839 + 605 |
Auf dieser Seite wird eine Referenzimplementierung der CIEDE2000 Formel fĂŒr den Farbabstand vorgestellt, die in der Programmiersprache PHP geschrieben wurde. Wenn Sie eine perfekte KompatibilitĂ€t (bis zur zehnten Dezimalstelle) mit einigen Implementierungen von Drittanbietern sicherstellen wollen, mĂŒssen Sie möglicherweise die Kommentare im Quellcode Ă€ndern. Um dies zu erleichtern, automatisiert der folgende Link diesen Vorgang.
Die Funktion ΔE2000 in PHP
Betrachten wir die gÀngigere und akademische (Sharma, 2005) der beiden Formulierungen.
// This function written in PHP 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.
function ciede_2000($l_1, $a_1, $b_1, $l_2, $a_2, $b_2) {
// Working in PHP 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 = $k_c = $k_h = 1.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);
// 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.
$h_1 = atan2($b_1, $a_1 * $n);
$h_2 = atan2($b_2, $a_2 * $n);
$h_1 += 2.0 * M_PI * ($h_1 < 0.0);
$h_2 += 2.0 * M_PI * ($h_2 < 0.0);
$n = abs($h_2 - $h_1);
// Cross-implementation consistent rounding.
if (M_PI - 1E-14 < $n && $n < M_PI + 1E-14)
$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 += 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 += M_PI;
// $h_m += $h_m < M_PI ? M_PI : -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))
* sin(M_PI / 3.0 * exp($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 * sin(2.0 * $h_m + M_PI * 0.5)
+ 0.32 * sin(3.0 * $h_m + 8.0 * M_PI / 15.0)
- 0.17 * sin($h_m + M_PI / 3.0)
- 0.20 * sin(4.0 * $h_m + 3.0 * M_PI / 20.0);
$n = $c_1 + $c_2;
// Hue.
$h = 2.0 * sqrt($c_1 * $c_2) * sin($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 = 39.9 a1 = 45.8 b1 = -2.0
// L2 = 40.7 a2 = 51.5 b2 = 2.4
// CIE ÎE00 = 2.9464564049 (Bruce Lindbloom, Netflixâs VMAF, ...)
// CIE ÎE00 = 2.9464695839 (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.Parameter k_l, k_c und k_h
Die Parameter k_l, k_c und k_h in der CIEDE2000-Formel sind Gewichtungsfaktoren, die jeweils auf die Komponenten Helligkeit (ÎL*), Chroma (ÎC*) und Farbton (ÎH*) angewendet werden. Im Quellcode sind sie als Konstanten definiert, deren Standardwert 1 ist; dies entspricht den von der Internationalen Beleuchtungskommission (CIE) festgelegten Standardbeobachtungsbedingungen. In der Praxis kann es erforderlich sein, diese Koeffizienten an spezifische Bedingungen anzupassen: So wird k_l = 2 manchmal verwendet, um Helligkeitsunterschiede stĂ€rker zu gewichten (hĂ€ufiges Vorkommen in der Textilindustrie), wĂ€hrend k_c oder k_h reduziert werden können, um die Toleranz gegenĂŒber Schwankungen in SĂ€ttigung oder Farbton zu erhöhen. Zusammenfassend lĂ€sst sich sagen, dass diese Koeffizienten im Allgemeinen zwischen 0,5 und 2 liegen, wobei 1 der hĂ€ufigste Wert ist.
Genauigkeit und ZuverlÀssigkeit des Quellcodes
Der Unterschied zwischen der akademischen Formulierung von Sharma und der vereinfachten Formulierung von Lindbloom betrĂ€gt nicht mehr als ±0,0003 auf dem endgĂŒltigen ÎE2000. Die hier vorgestellte Implementierung ist 64-Bit-fĂ€hig und gewĂ€hrleistet eine Genauigkeit von mehr als 10 Dezimalstellen; die Wahl der einen Formulierung gegenĂŒber der anderen ist daher ein technisches Detail. Oben auf dieser Seite können Sie zwischen den beiden Formulierungen wĂ€hlen; die derzeit angezeigte ist die vereinfachte Formulierung.
Wie lÀsst sich feststellen, ob eine bestimmte Implementierung von CIEDE2000 akademisch oder vereinfacht ist?
- Berechne
ciede_2000(56.6, 43.6, 41.1, 68.4, 9.4, -8.6) - Lautet das Ergebnis
30.0001, handelt es sich um den akademischen Typ (wie Sharma, OpenJDK) - Lautet das Ergebnis
29.9999, handelt es sich um den vereinfachten Typ (wie Lindbloom, Netflix VMAF)
Wie kann man RGB-Farben in L*a*b* umwandeln?
FĂŒr die Konvertierung mĂŒssen Sie den XYZ-Zwischenfarbraum verwenden. Falls Sie Hilfe benötigen, finden Sie den Quellcode am Ende dieser Seite (unter Verwendung des 1964 formalisierten D65-WeiĂpunkts).
Wertebereiche in CIELAB und Interpretation des ÎE2000
Im CIELAB-Farbraum steht die Komponente L* fĂŒr die Helligkeit und reicht normalerweise von 0 (schwarz) bis 100 (weiĂ). Die Komponenten a* und b* beschreiben die Farbachsen: a* verlĂ€uft von GrĂŒn nach Rot, b* von Blau nach Gelb. In der Praxis sind die Werte von a* und b* fast immer auf einen Bereich zwischen -128 und +127 beschrĂ€nkt, obwohl der Standard keine offizielle Grenze fĂŒr diese beiden Komponenten festlegt.
| Farbe 1 | Farbe 2 | Wert des ÎE2000 |
|---|---|---|
| 1 | ||
| 2 | ||
| 3 |
| Farbe 1 | Farbe 2 | Wert des ÎE2000 |
|---|---|---|
| 5 | ||
| 10 | ||
| 15 |
ÎE2000 (CIEDE2000) gibt den wahrgenommenen Unterschied zwischen zwei Farben an: 0 bedeutet identische Farben, höhere Werte (bis zu 185 und mehr) zeigen eine stärkere Abweichung. Beispielsweise entsprechen Werte um 5 eher ähnlichen Farben, während Werte um 15 deutlich unterschiedliche Farben anzeigen. Wenn der Wert ΔE2000 40 übersteigt, haben die verglichenen Farben praktisch nichts mehr gemeinsam, und wir können daraus keine genauen Informationen mehr ableiten.
Anwendungsbeispiel in PHP
// Define color 1 in L*a*b* space
$l1 = 57.0;
$a1 = 17.0;
$b1 = -3.6;
// Define color 2 in L*a*b* space
$l2 = 56.6;
$a2 = 21.0;
$b2 = 4.6;
// Calculate the ΔE*00 color difference
$deltaE = ciede_2000($l1, $a1, $b1, $l2, $a2, $b2);
echo $deltaE;
// .................................................. This shows a ΔE2000 of 5.9908949846
// As explained in the comments, compliance with Gaurav Sharma would display 5.9909105284Testergebnisse
Unser in C99 geschriebenes Testprogramm umfasst 250 prĂ€zise statische Tests. Diese Tests stellen sicher, dass Ihre Berechnungen auch in kritischen GrenzfĂ€llen fehlerfrei durchgefĂŒhrt werden, beispielsweise wenn die Arkustangensfunktion einen mathematisch undefinierten Wert zurĂŒckgibt. Die Ergebnisse zeigen, dass diese CIEDE2000-Funktion in PHP interoperabel mit den 41 anderen Programmiersprachen ist, die wir anbieten.
CIEDE2000 Verification Summary :
First Verified Line : 34,30,-17,69.8,60,-33,36.861058302008
Duration : 48.97 s
Successes : 10000000
Errors : 0
Average Delta E : 62.9515
Average Deviation : 4.5546872117219198e-13
Maximum Deviation : 5.0590642786119133e-12Dateien zum Herunterladen
Verwenden Sie diese von Michel zur VerfĂŒgung gestellten Dateien frei, auch fĂŒr kommerzielle Zwecke.
| Datei | GröĂe | Anzahl der Klicks |
|---|---|---|
| ciede-2000.php | 4 KB | 133 |
| ciede-2000-driver.php | 5 KB | 130 |
| ciede-2000-random.php | 5 KB | 118 |
| compare-hex-colors.php | 8 KB | 136 |
| compare-rgb-colors.php | 8 KB | 119 |
| test-php.yml | 3 KB | 69 |
| vs-php-color-difference.yml | 4 KB | 65 |
| vs-php-color.yml | 4 KB | 69 |
| reference-dataset.txt | 4 KB | 605 |
| Klicken Sie auf php.zip, um alle Dateien in einem Archiv herunterzuladen. | ||
Gemeinschaft
Was halten Sie von diesem Quellcode oder von CIEDE2000? Ihre Meinung ist uns wichtig! Das GÀstebuch enthÀlt bereits 9 EintrÀge - davon 1 auf Deutsch. Schauen Sie sich dort um und teilen Sie Ihre Meinung mit.