Skip to content

Instantly share code, notes, and snippets.

@BriSeven
Created April 29, 2016 10:02
Show Gist options
  • Save BriSeven/38177848fbbc340a313ab833cbef18dc to your computer and use it in GitHub Desktop.
Save BriSeven/38177848fbbc340a313ab833cbef18dc to your computer and use it in GitHub Desktop.
define("rgbdiff", [], function () {
function rgbdiff(a, b) {
// Convert RGB to XYZ
function rgbToXyz(tuple) {
var _r = (tuple[0] / 255);
var _g = (tuple[1] / 255);
var _b = (tuple[2] / 255);
if (_r > 0.04045) {
_r = Math.pow(((_r + 0.055) / 1.055), 2.4);
} else {
_r = _r / 12.92;
}
if (_g > 0.04045) {
_g = Math.pow(((_g + 0.055) / 1.055), 2.4);
} else {
_g = _g / 12.92;
}
if (_b > 0.04045) {
_b = Math.pow(((_b + 0.055) / 1.055), 2.4);
} else {
_b = _b / 12.92;
}
_r = _r * 100;
_g = _g * 100;
_b = _b * 100;
X = _r * 0.4124 + _g * 0.3576 + _b * 0.1805;
Y = _r * 0.2126 + _g * 0.7152 + _b * 0.0722;
Z = _r * 0.0193 + _g * 0.1192 + _b * 0.9505;
return [X, Y, Z];
};
// Convert XYZ to LAB
function xyzToLab(tuple) {
var ref_X = 95.047;
var ref_Y = 100.000;
var ref_Z = 108.883;
var _X = tuple[0] / ref_X;
var _Y = tuple[1] / ref_Y;
var _Z = tuple[2] / ref_Z;
if (_X > 0.008856) {
_X = Math.pow(_X, (1 / 3));
} else {
_X = (7.787 * _X) + (16 / 116);
}
if (_Y > 0.008856) {
_Y = Math.pow(_Y, (1 / 3));
} else {
_Y = (7.787 * _Y) + (16 / 116);
}
if (_Z > 0.008856) {
_Z = Math.pow(_Z, (1 / 3));
} else {
_Z = (7.787 * _Z) + (16 / 116);
}
var CIE_L = (116 * _Y) - 16;
var CIE_a = 500 * (_X - _Y);
var CIE_b = 200 * (_Y - _Z);
return [CIE_L, CIE_a, CIE_b];
};
// Finally, use cie1994 to get delta-e using LAB
function cie1994(x, y, isTextiles) {
var x = {
l: x[0],
a: x[1],
b: x[2]
};
var y = {
l: y[0],
a: y[1],
b: y[2]
};
var k2;
var k1;
var kl;
var kh = 1;
var kc = 1;
if (isTextiles) {
k2 = 0.014;
k1 = 0.048;
kl = 2;
} else {
k2 = 0.015;
k1 = 0.045;
kl = 1;
}
var c1 = Math.sqrt(x.a * x.a + x.b * x.b);
var c2 = Math.sqrt(y.a * y.a + y.b * y.b);
var sh = 1 + k2 * c1;
var sc = 1 + k1 * c1;
var sl = 1;
var da = x.a - y.a;
var db = x.b - y.b;
var dc = c1 - c2;
var dl = x.l - y.l;
var dh = Math.sqrt(da * da + db * db - dc * dc);
return Math.pow(Math.pow((dl / (kl * sl)), 2) + Math.pow((dc / (kc * sc)), 2) + Math.pow((dh / (kh * sh)), 2), 2);
};
return cie1994(xyzToLab(rgbToXyz(a)), xyzToLab(rgbToXyz(b)))
}
function srgbdiff(a, b) {
var ref_X, ref_Y, ref_Z, ref_U, ref_V, lab_e, lab_k;
ref_X = 0.95047;
ref_Y = 1.00000;
ref_Z = 1.08883;
ref_U = (4 * ref_X) / (ref_X + (15 * ref_Y) + (3 * ref_Z));
ref_V = (9 * ref_Y) / (ref_X + (15 * ref_Y) + (3 * ref_Z));
lab_e = 0.008856;
lab_k = 903.3;
function f(t) {
if (t > lab_e) {
return Math.pow(t, 1 / 3);
} else {
return 7.787 * t + 16 / 116;
}
};
dot_product = function (a, b) {
var i, ret, _i, _ref;
ret = 0;
for (i = _i = 0, _ref = a.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
ret += a[i] * b[i];
}
return ret;
};
function srgb2xyz(tuple) {
var m, rgbl, to_linear, _B, _G, _R, _X, _Y, _Z;
_R = tuple[0], _G = tuple[1], _B = tuple[2];
to_linear = function (c) {
var a;
a = 0.055;
if (c > 0.04045) {
return Math.pow((c + a) / (1 + a), 2.4);
} else {
return c / 12.92;
}
};
m = [
[0.4124, 0.3576, 0.1805],
[0.2126, 0.7152, 0.0722],
[0.0193, 0.1192, 0.9505]
];
rgbl = [to_linear(_R), to_linear(_G), to_linear(_B)];
_X = dot_product(m[0], rgbl);
_Y = dot_product(m[1], rgbl);
_Z = dot_product(m[2], rgbl);
return [_X, _Y, _Z];
}
function xyz2lab(tuple) {
var fx, fy, fz, _L, _X, _Y, _Z, _a, _b;
_X = tuple[0], _Y = tuple[1], _Z = tuple[2];
fx = f(_X / ref_X);
fy = f(_Y / ref_Y);
fz = f(_Z / ref_Z);
_L = 116 * fy - 16;
_a = 500 * (fx - fy);
_b = 200 * (fy - fz);
return [_L, _a, _b];
}
function srgb2lab(tuple) {
return xyz2lab(srgb2xyz(tuple));
}
var alab, blab;
alab = srgb2lab(a);
blab = srgb2lab(b);
return Math.sqrt(Math.pow((alab[0] - blab[0]), 2) + Math.pow(alab[1] - blab[1], 2) + Math.pow(alab[2] - blab[2], 2));
}
return rgbdiff;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment