# 从RGB到Lab色彩空间的转换

[X,Y,Z] = [M] * [R,G,B]

[M] = [0.4125, 0.3576, 0.1805;
0.2126, 0.7152, 0.0722;
0.0193, 0.1192, 0.9505]，

RGB是经过Gamma校正的色彩分量：R=g(r)，G=g(g)，B=g(b)。

g是Gamma校正函数：

rgb以及RGB的取值范围则均为[0,1)。计算完成后，XYZ的取值范围则有所变化，分别是：[0, 0.9506)，[0, 1)，[0, 1.0890)。

L = 116 * f(Y1) - 16
a = 500 * (f(X1) - f(Y1))
b = 200 * (f(Y1) - f(Z1))

X1、Y1、Z1分别是线性归一化之后的XYZ值，也就是说，它们的取值范围都是[0, 1)。此外，函数f的值域也和自变量一样都是[0, 1)。

[M1] = [0.4339, 0.3762 0.1899;
0.2126, 0.7152, 0.0722;
0.0177, 0.1095, 0.8728]

L = Y1 = 0.2126 * R + 0.7152 * G + 0.0722 * B
a = Fa * (X1 - Y1) + Da
b = Fb * (Y1 - Z1) + Db

L = Y1 = 0.2126 * R + 0.7152 * G + 0.0722 * B
a = 1.4749 * (0.2213 * R - 0.3390 * G + 0.1177 * B) + 128
b = 0.6245 * (0.1949 * R + 0.6057 * G - 0.8006 * B) + 128

L = Y1 = (13933 * R + 46871 * G + 4732 * B) div 2^16
a = 377 * (14503 * R - 22218 * G + 7714 * B) div 2^24 + 128
b = 160 * (12773 * R + 39695 * G - 52468 * B) div 2^24 + 128

R = L1 + (a1 * 100922 + b1 * 17790) div 2^23
G = L1 - (a1 * 30176 + b1 * 1481) div 2^23
B = L1 + (a1 * 1740 - b1 * 37719) div 2^23

///////////////////////////////////////////////////////////////////////////////////////////
//L = Y1 = (13933 * R + 46871 * G + 4732 * B) div 2^16
//a = 377 * (14503 * R - 22218 * G + 7714 * B) div 2^24 + 128
//b = 160 * (12773 * R + 39695 * G - 52468 * B) div 2^24 + 128
void RGB2Lab2(double R, double G, double B, double &L, double &a, double &b)
{
L = 0.2126007 * R + 0.7151947 * G + 0.0722046 * B;
a = 0.3258962 * R - 0.4992596 * G + 0.1733409 * B + 128;
b = 0.1218128 * R + 0.3785610 * G - 0.5003738 * B + 128;
}

//R = L1 + (a1 * 100922 + b1 * 17790) div 2^23
//G = L1 - (a1 * 30176 + b1 * 1481) div 2^23
//B = L1 + (a1 * 1740 - b1 * 37719) div 2^23
void Lab2RGB2(double L, double a, double b, double &R, double &G, double &B)
{
R = L + 0.0120308 * a + 0.0021207 * b;
G = L - 0.0035973 * a - 0.0001765 * b;
B = L + 0.0002074 * a - 0.0044965 * b;
}
///////////////////////////////////////////////////////////////////////////////////////////