See this Observable notebook for a demonstration.
$ npm install d3-color-difference
# d3.differenceEuclideanRGB(a, b) <>
Computes the Euclidean distance between the colors a and b in the RGB color space.
# d3.differenceEuclideanLab(a, b) <>
Computes the Euclidean distance between the colors a and b in the Lab color space.
# d3.differenceEuclideanHcl(a, b) <>
Computes the Euclidean distance between the colors a and b in the HCL color space.
# d3.differenceEuclideanHsl(a, b) <>
Computes the Euclidean distance between the colors a and b in the HSL color space.
# d3.differenceEuclideanCubehelix(a, b) <>
Computes the Euclidean distance between the colors a and b in the Cubehelix color space.
Computes the CIE76 ΔE*ab color difference between the colors a and b. The computation is done in the Lab color space and it is analogous to differenceEuclideanLab.
Computes the CIE94 ΔE*94 color difference between the colors a and b. The computation is done in the Lab color space, with the default weights kL = 1, K1 = 0.045, and K2 = 0.015.
# d3.differenceCie94Weighted(kL, K1, K2) <>
Returns a CIE94 difference function with custom weighting parameters.
# d3.differenceCiede2000(a, b) <>
Computes the CIEDE2000 ΔE*00 color difference between the colors a and b as implemented by G. Sharma. The computation is done in the Lab color space, with the default weights kL = kC = kH = 1.
# d3.differenceCiede2000Weighted(kL, kC, kH) <>
Returns a CIEDE2000 difference function with custom weighting parameters.
Computes the CMC l:c (1984) ΔE*CMC color difference between the colors a and b. The computation is done in the Lab color space with the default weights l = c = 1.
Note: ΔE*CMC is not considered a metric since it's not symmetrical, i.e. the distance from a to b is not always equal to the distance from b to a.
# d3.differenceCmcWeighted(l, c) <>
Returns a CMC l:c (1984) difference function with custom weighting parameters.
# d3.differenceDin99o(a, b) <>
Computes the DIN99o ΔE*99o color difference between the colors a and b. The computation is done in the DIN99o color space with the default weights kCH = kE = 1.
# d3.differenceDin99oWeighted(kCH, kE) <>
Returns a DIN99o difference function with custom weighting parameters.
# d3.differenceWithOpacity(differenceFunction, a, b) <>
The difference functions don't take the colors' alpha channel into account when computing distances. This method allows you to factor the colors' opacities into the distance.