Implementacja CIEDE2000 w VBScript
| Liczba wizyt | 469 |
|---|---|
| Liczba przeglądanych plików | 125 + 376 |
Ta strona przedstawia referencyjną implementację formuły różnicy kolorów CIEDE2000 w VBScript. Jeśli chcesz zapewnić idealną kompatybilność (do dziesiątego miejsca po przecinku) z niektórymi implementacjami innych firm, może być konieczne zmodyfikowanie komentarzy w kodzie źródłowym. Aby to ułatwić, poniższy link automatyzuje tę operację.
Funkcja ΔE2000 w VBScript
Rozważmy bardziej powszechne i akademickie (Sharma, 2005) z dwóch sformułowań.
<%
' This function written in VBScript 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.
' Prevents errors due to typos or undeclared variables.
Option Explicit
' 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.
Public Function ciede_2000(l_1, a_1, b_1, l_2, a_2, b_2)
' Working in ASP Classic 3.0 (IIS 10.0) 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...
Const M_PI = 3.14159265358979323846264338328, k_l = 1.0, k_c = 1.0, k_h = 1.0
Dim n, c_1, c_2, h_1, h_2, h_m, h_d, p, r_t, l, t, h, c
n = (Sqr(a_1 * a_1 + b_1 * b_1) + Sqr(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 - Sqr(n / (n + 6103515625.0)))
' Application of the chroma correction factor.
c_1 = Sqr(a_1 * a_1 * n * n + b_1 * b_1)
c_2 = Sqr(a_2 * a_2 * n * n + b_2 * b_2)
' Using 14 lines to simulate atan2, as VBScript does not have this built-in.
If 0.0 < a_1 Then
h_1 = Atn(b_1 / (a_1 * n)) - (b_1 < 0.0) * 2.0 * M_PI
ElseIf a_1 < 0.0 Then
h_1 = Atn(b_1 / (a_1 * n)) + M_PI
Else
h_1 = M_PI + ((0.0 < b_1) - (b_1 < 0.0)) * 0.5 * M_PI
End If
If 0.0 < a_2 Then
h_2 = Atn(b_2 / (a_2 * n)) - (b_2 < 0.0) * 2.0 * M_PI
ElseIf a_2 < 0.0 Then
h_2 = Atn(b_2 / (a_2 * n)) + M_PI
Else
h_2 = M_PI + ((0.0 < b_2) - (b_2 < 0.0)) * 0.5 * M_PI
End If
' The atan2 polyfill (customized) is complete.
n = Abs(h_2 - h_1)
' Cross-implementation consistent rounding.
If M_PI - 1E-14 < n And n < M_PI + 1E-14 Then 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 Then
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
' If h_m < M_PI Then h_m = h_m + M_PI Else h_m = h_m - M_PI
End If
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 * Sqr(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 / Sqr(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.2 * Sin(4.0 * h_m + 3.0 * M_PI / 20.0)
n = c_1 + c_2
' Hue.
h = 2.0 * Sqr(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.
ciede_2000 = Sqr(l * l + h * h + c * c + c * h * r_t)
End Function
' GitHub Project : https://github.com/michel-leonard/ciede2000-color-matching
' Online Tests : https://michel-leonard.github.io/ciede2000-color-matching
' L1 = 15.8 a1 = 48.0 b1 = 2.4
' L2 = 15.2 a2 = 53.8 b2 = -2.4
' CIE ΔE00 = 2.9971560512 (Bruce Lindbloom, Netflix’s VMAF, ...)
' CIE ΔE00 = 2.9971426307 (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.
%>Parametry k_l, k_c i k_h
Parametry k_l, k_c i k_h 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 k_l = 2 jest czasami używane, aby nadać większą wagę różnicom w jasności (powszechne zjawisko w przemyśle tekstylnym), podczas gdy k_c lub k_h można zmniejszyć, aby zwiększyć tolerancję na zmiany nasycenia lub odcienia, w zależności od wymagań. W zależności od kontekstu, współczynniki te zazwyczaj mieszczą się w zakresie od 0,5 do 2.
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. Odpowiada to różnicy zwykle mierzonej między dwiema 32-bitowymi implementacjami i jest niezauważalna dla ludzkiego oka. Nasze 64-bitowe implementacje, wszystkie spójne ze sobą, gwarantują co najmniej 10 poprawnych miejsc po przecinku, więc wybór jednej formuły nad drugą jest szczegółem technicznym. Domyślna formuła na tej stronie jest tą najczęściej prezentowaną w społeczności, jest nieco łatwiejsza do wektoryzacji.
✎ Jeśli zauważycie, że komentarze w kodzie źródłowym nie pokrywają się z komentarzami w języku angielskim, prosimy o poinformowanie autora strony, aby można było to poprawić.
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* mieszczą się najczęściej w przedziale od -128 do +127, choć mogą nieznacznie go przekraczać w zależności od konwersji kolorów.
| 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 około 185 w skrajnych przypadkach) 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.
Przykład zastosowania w VBScript
' Compute the Delta E (CIEDE2000) color difference between two L*a*b* colors in ASP
' Color 1: L1 = 28.9, a1 = 47.5, b1 = 2.0
' Color 2: L2 = 28.8, a2 = 41.6, b2 = -1.7
Dim deltaE
deltaE = ciede_2000(L1, a1, b1, L2, a2, b2)
Response.Write "ΔE2000 = " & deltaE
' .................................................. This shows a ΔE2000 of 2.7749016764
' As explained in the comments, compliance with Gaurav Sharma would display 2.7749152801Wyniki testów
Sterownik napisany w języku C99, z 250 dokładnymi testami statycznymi, udowodnił, że ta funkcja VBScript jest interoperacyjna z funkcją CIEDE2000 dostępną w innych językach programowania.
CIEDE2000 Verification Summary :
First Verified Line : 27,-123,101,44,-30,122,29.9893728174531
Duration : 41.49 s
Successes : 10000000
Errors : 0
Average Delta E : 63.2072
Average Deviation : 8.8e-15
Maximum Deviation : 2.8e-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.asp | 4 KB | 80 |
| test-asp.yml | 6 KB | 45 |
| reference-dataset.txt | 4 KB | 376 |
| Kliknij asp.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ą.