【PHP実践|実務向け】PHPで実現する色空間変換:RGBからLabへの相互変換をマスターする

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配列を返す実用的な関数群です。そのままプロジェクトにコピーして利用可能です。

  • RGBからLabへ変換するメイン関数
  • @param array $rgb [r, g, b] 0-255
  • @return array [l, a, b]
  • /
    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変換さえできていれば、シンプルなユークリッド距離計算で直感的に色の近さを判定できます。

    タイトルとURLをコピーしました