専門外なので公式をPHPに書き換えただけですが、RGB値をもとに l*a*b* に変換することができます。
D50 や D65 というのは昼光色を基準として決められた標準イルミナント(標準となる光)で、
D50 は色温度 5000K を、D65 は 6500K をベースに定められています。
今回は Photoshop CS6 のカラーピッカーに近似する D50 を使い、変換を行いました。
直接 RGB から Lab には変換できないようなので、XYZ 表色系に変換してからそれを Lab にします。
<?php
function xyz2lab($xyz) {
$threshold = 0.008856;
//Chromatic Adaptation Matrices
// D50
$ref_x = 0.96422;
$ref_y = 1.0000;
$ref_z = 0.82521;
// D65
/*
$ref_x = 0.95047;
$ref_y = 1.0000;
$ref_z = 1.0883;
*/
$var_x = $xyz[0] / ($ref_x * 100);
$var_y = $xyz[1] / ($ref_y * 100);
$var_z = $xyz[2] / ($ref_z * 100);
$var_x = ($var_x > $threshold) ? $var_x = pow($var_x, 1/3 ) : (7.787 * $var_x) + (16 / 116);
$var_y = ($var_y > $threshold) ? $var_y = pow($var_y, 1/3 ) : (7.787 * $var_y) + (16 / 116);
$var_z = ($var_z > $threshold) ? $var_z = pow($var_z, 1/3 ) : (7.787 * $var_z) + (16 / 116);
$l = ( 116 * $var_y ) - 16;
$a = 500 * ( $var_x - $var_y );
$b = 200 * ( $var_y - $var_z );
$lab = array();
$lab = array($l, $a, $b);
return $lab;
}
function rgb2xyz($rgb) {
$r = $rgb[0] / 255;
$g = $rgb[1] / 255;
$b = $rgb[2] / 255;
$r = ($r > 0.04045) ? pow(($r + 0.055) / 1.055, 2.4) : $r / 12.92;
$g = ($g > 0.04045) ? pow(($g + 0.055) / 1.055, 2.4) : $g / 12.92;
$b = ($b > 0.04045) ? pow(($b + 0.055) / 1.055, 2.4) : $b / 12.92;
$r = $r * 100;
$g = $g * 100;
$b = $b * 100;
$xyz = array();
//sRGB D50
$xyz[] = $r * 0.4360747 + $g * 0.3850649 + $b * 0.1430804;
$xyz[] = $r * 0.2225045 + $g * 0.7168786 + $b * 0.0606169;
$xyz[] = $r * 0.0139322 + $g * 0.0971045 + $b * 0.7141733;
//sRGB D65
/*
$xyz[] = $r * 0.4124564 + $g * 0.3575761 + $b * 0.1804375;
$xyz[] = $r * 0.2126729 + $g * 0.7151522 + $b * 0.0721750;
$xyz[] = $r * 0.0193339 + $g * 0.1191920 + $b * 0.9503041;
*/
return $xyz;
}
function rgb2lab($rgb) {
$xyz = rgb2xyz($rgb);
$lab = xyz2lab($xyz);
return $lab;
}
//RGB値を 0~255 で指定する
$rgb = array(244,46,32);
var_dump( rgb2lab($rgb) );
参考
http://w3.kcua.ac.jp/~fujiwara/infosci/colorspace/
http://www.brucelindbloom.com/