1. 導入
Webアプリケーションや画像処理ツールを開発していると、色の比較や色味の自動調整が必要になる場面があります。しかし、コンピュータで一般的に扱われる「RGB」は、人間が感じる色の「差」を計算するのには適していません。そこで重要になるのが「Lab色空間」です。Labは人間が知覚する色差を定量化できるため、色の類似度判定や自動配色生成において非常に強力なツールとなります。今回は、PHPを使ってRGBからLabへ変換する技術的なTipsを解説します。
2. 基礎知識
色空間の変換において、以下の3つの概念を理解しておく必要があります。
RGB: Red, Green, Blueの光の三原色。コンピュータのディスプレイ表示に最適ですが、色空間が均等ではないため、色の距離を測るのには不向きです。
XYZ: CIE 1931 XYZ表色系。すべての色を表現するための数学的な中間色空間です。RGBからLabへ変換する際は、必ず一度このXYZを経由する必要があります。
Lab: 明度(L)と色度(a, b)で構成される均等色空間です。人間が感じる色の変化と数値が比例するため、色同士の距離(色差)を計算するのに使われます。
標準イルミナント(D50/D65): 色を定義する際の「光の基準」です。D50は印刷業界、D65はWebやディスプレイなど、利用シーンに合わせて選択します。
3. 実装/解決策
RGBから直接Labへ変換する数式は存在しないため、以下のステップで実装します。
1. RGB値を 0〜1 に正規化し、ガンマ補正をかけて線形RGBに変換する。
2. 変換行列を使用して、線形RGBをXYZ値に変換する。
3. XYZ値をLab変換式に当てはめ、最終的な色情報を得る。
この際、D50やD65といった「基準となる光」の係数(リファレンス値)を正しく設定することが、精度の高い変換の鍵となります。
4. サンプルプログラム
以下は、RGB配列を入力として、Lab配列を返す実用的な関数群です。そのままプロジェクトにコピーして利用可能です。
/
function rgb2lab(array $rgb) {
$xyz = rgb2xyz($rgb);
return xyz2lab($xyz);
}
function rgb2xyz(array $rgb) {
// 0-255を0-1に正規化
$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 = 100; $g = 100; $b = 100;
// D50変換行列の適用
$x = $r 0.4360747 + $g 0.3850649 + $b 0.1430804;
$y = $r 0.2225045 + $g 0.7168786 + $b 0.0606169;
$z = $r 0.0139322 + $g 0.0971045 + $b 0.7141733;
return [$x, $y, $z];
}
function xyz2lab(array $xyz) {
$threshold = 0.008856;
// D50 リファレンス値
$ref_x = 96.422; $ref_y = 100.000; $ref_z = 82.521;
$vx = $xyz[0] / $ref_x;
$vy = $xyz[1] / $ref_y;
$vz = $xyz[2] / $ref_z;
// 非線形変換
$f = fn($t) => ($t > $threshold) ? pow($t, 1/3) : (7.787 $t) + (16 / 116);
$l = (116 $f($vy)) – 16;
$a = 500 ($f($vx) – $f($vy));
$b = 200 ($f($vy) – $f($vz));
return [$l, $a, $b];
}
// 使用例: ビビッドな赤を変換
$rgb = [244, 46, 32];
print_r(rgb2lab($rgb));
?>
5. 応用・注意点
注意点1: 基準値の統一
変換行列やリファレンス値(D50/D65)は、プロジェクト内で必ず統一してください。Photoshopや他の画像処理ライブラリと値を比較する場合、この基準が一致していないと計算結果に大きな誤差が生じます。
応用: 色差の計算
Labに変換できれば、「デルタE(ΔE)」という手法で2色間の距離を算出できます。これは、ユーザーがアップロードした画像から「似ている色」を抽出したり、デザインのアクセントカラーを自動選定する際に非常に便利です。複雑な数式ですが、Lab変換さえできていれば、シンプルなユークリッド距離計算で直感的に色の近さを判定できます。