Color difference(wikipedia)で公開されているCIE94の色差計算式をJavaScriptで書いてみました
wikipediaで公開されている計算式は以下のとおりです。
(「Color difference」(5 Feb 2017, at 02:30. UTC)『ウィキペディア』より引用)
CIE76やユークリッドと比較すると複雑なものとなります。また、CIE76やユークリッド、CIE2000ではL1a1b1とL2b2a2の値が入れ替わったとしても同じ結果になるのに対して、CIE94では違う値を返すため、ちょっと扱いにくい印象があります。計算式が間違っているだけかもしれませんが…
cie94
function cie94(L1,a1,b1, L2,a2,b2, kL=1,kC=1,kH=1) {
//https://en.wikipedia.org/wiki/Color_difference#CIE94
var K1;
var K2;
if (kL == 1) {
K1 = 0.045;
K2 = 0.015;
} else {
K1 = 0.048;
K2 = 0.014;
}
var deltaL = L1 - L2;
var C1 = Math.sqrt(Math.pow(a1, 2) + Math.pow(b1, 2));
var C2 = Math.sqrt(Math.pow(a2, 2) + Math.pow(b2, 2));
var deltaCab = C1 - C2;
var deltaa = a1 - a2;
var deltab = b1 - b2;
var deltaHab = Math.sqrt(
Math.pow(deltaa, 2) +
Math.pow(deltab, 2) -
Math.pow(deltaCab, 2)
);
var SL = 1;
var SC = 1 + (K1 * C1);
var SH = 1 + (K2 * C1);
return Math.sqrt(
Math.pow((deltaL/(kL*SL)), 2) +
Math.pow((deltaCab/(kC*SC)), 2) +
Math.pow((deltaHab/(kH*SH)), 2)
);
};
CIE94はRGBではなくLabの値が必要となりますので、実際に使うにはJavaScriptでCIE76色差計算と同様にJavaScriptでRGBからLab色空間への変換を使ってRGBからLabへの変換する必要があります。以下のような感じになると思います。
var [L1, a1, b1] = rgbToLab(r1, g1, b1);
var [L2, a2, b2] = rgbToLab(r2, g2, b2);
distance = cie94(L1,a1,b1, L2,a2,b2);
または
distance = cie94.apply(this,
rgbToLab(r1,g1,b1).concat(rgbToLab(r2,g2,b2))
)