public static function rgbToLab(Space\Rgb $rgb)
{
$r = $rgb->getRed() / 255;
$g = $rgb->getGreen() / 255;
$b = $rgb->getBlue() / 255;
if ($r > 0.04045) {
$r = pow(($r + 0.055) / 1.055, 2.4);
} else {
$r = $r / 12.92;
}
if ($g > 0.04045) {
$g = pow(($g + 0.055) / 1.055, 2.4);
} else {
$g = $g / 12.92;
}
if ($b > 0.04045) {
$b = 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) / 95.047;
$y = ($r * 0.2126 + $g * 0.7151999999999999 + $b * 0.0722) / 100.0;
$z = ($r * 0.0193 + $g * 0.1192 + $b * 0.9505) / 108.883;
if ($x > 0.008855999999999999) {
$x = pow($x, 1 / 3);
} else {
$x = 7.787 * $x + 16 / 116;
}
if ($y > 0.008855999999999999) {
$y = pow($y, 1 / 3);
} else {
$y = 7.787 * $y + 16 / 116;
}
if ($z > 0.008855999999999999) {
$z = pow($z, 1 / 3);
} else {
$z = 7.787 * $z + 16 / 116;
}
$l = 116 * $y - 16;
$a = 500 * ($x - $y);
$b = 200 * ($y - $z);
return new Space\Lab($l, $a, $b);
}