Created
April 29, 2016 10:02
-
-
Save BriSeven/38177848fbbc340a313ab833cbef18dc to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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