写真の物理学 ㉔ 色空間の数学

Share
📐
写真の物理学シリーズ ㉔
このシリーズでは、写真にまつわる現象を物理学の言葉で記述する。「なんとなくそうなる」を「なぜそうなるか」に変換することが目的である。

同じRGB値でも、sRGBとAdobe RGBでは指し示す物理的な色が異なる。色が「正しい」かどうかは色空間という座標系の選択に依存する。色空間はCIE XYZを基底として原色と白色点で定義され、その三角形が表現可能な色域を決定する。本稿では、主要RGB色空間の変換行列の導出からガンマ補正の数学、Lab色空間の非線形変換までを体系的に扱う。

人間の色覚と三刺激値

色は物理量ではない。色とは何かで定式化したとおり、光はスペクトルという連続的な関数で記述されるが、人間の目はそれを三つの数値に圧縮して知覚する。網膜にあるL錐体(長波長感受性)、M錐体(中波長感受性)、S錐体(短波長感受性)が、入射光のスペクトルをそれぞれの分光感度曲線で重み付け積分し、三つの神経信号を生成する。

この三次元性が、色を三つの座標で表現できる根拠である。スペクトルは無限次元の関数空間に属するが、人間の色覚は三次元の部分空間への射影として動作する。異なるスペクトルが同一の三刺激値を生じさせうる現象、すなわち条件等色(メタメリズム) は、この次元縮約の直接的な帰結であり、演色性とメタメリズムではこの現象を等色関数の零空間として厳密に定式化している。あなたには何も見えていないで論じたように、知覚とは世界の忠実な写しではなく、生物学的な制約のもとでの圧縮表現にすぎない。

CIE XYZ色空間の数学的構造

等色関数の定義

1931年、国際照明委員会(CIE)はW.D.ライトとJ.ギルドの等色実験の結果を統合し、標準観測者の等色関数を定義した。等色実験とは、単色光と三原色光の混合とが同じ色に見えるよう被験者に調整させ、その混合比を記録する手続きである。

最初に定義されたのはCIE RGB等色関数 $\bar{r}(\lambda)$, $\bar{g}(\lambda)$, $\bar{b}(\lambda)$ であったが、これらには負の値を取る領域が存在した。物理的な原色では単色光のすべてを再現できないため、「原色を被写体側に加える」という操作(減法的マッチング)を行わなければならず、それが負の係数として記録されたのである。

計算上の利便性を確保するため、CIEはRGB等色関数を線形変換して、すべての値が非負となるXYZ等色関数 $\bar{x}(\lambda)$, $\bar{y}(\lambda)$, $\bar{z}(\lambda)$ を構成した。この変換には物理的に実在しない「想像上の原刺激」X, Y, Zが対応するが、数学的には何の問題もない。色空間は座標系の選択にすぎず、座標軸が実在の光に対応する必要はないからだ。

三刺激値の積分定義

任意の分光分布 $S(\lambda)$ に対する三刺激値は、等色関数との積分で与えられる。

$$ X = \int_{380}^{780} S(\lambda)\,\bar{x}(\lambda)\,d\lambda $$

$$ Y = \int_{380}^{780} S(\lambda)\,\bar{y}(\lambda)\,d\lambda $$

$$ Z = \int_{380}^{780} S(\lambda)\,\bar{z}(\lambda)\,d\lambda $$

積分範囲は可視光領域(おおむね380 nmから780 nm)である。 $\bar{x}(\lambda)$, $\bar{y}(\lambda)$, $\bar{z}(\lambda)$ は非負であるから、 $S(\lambda) \geq 0$ である任意の物理的光源に対して $X \geq 0$, $Y \geq 0$, $Z \geq 0$ が保証される。これが「すべての色を正の座標で表せる」理由だ。

CIE XYZの設計にはもう一つ重要な特徴がある。 $\bar{y}(\lambda)$ はCIE標準比視感度曲線 $V(\lambda)$ に一致するように選ばれている。これにより、三刺激値 $Y$ は色の明るさ(測光量としての輝度)に直接対応する。 $X$ と $Z$ は色度情報を担い、色空間全体が「輝度 + 色度」という直交的な構造を持つ。

色度図 -- 色空間の二次元投影

色度座標の定義

三刺激値 $(X, Y, Z)$ は三次元空間の点を定める。ここから輝度情報を除去して色度(chromaticity)のみを取り出すために、正規化された座標を定義する。

$$ x = \frac{X}{X + Y + Z}, \quad y = \frac{Y}{X + Y + Z}, \quad z = \frac{Z}{X + Y + Z} $$

定義から $x + y + z = 1$ であるため、 $z$ は $x$ と $y$ から一意に定まる。したがって色度は二次元の座標 $(x, y)$ で完全に記述できる。これをCIE 1931色度図に描画すると、馬蹄形の領域が現れる。

色度図の構造

色度図の外周はスペクトル軌跡(spectral locus)と呼ばれ、各波長の単色光の色度座標を連ねたものである。スペクトル軌跡の両端(短波長側の紫と長波長側の赤)を直線で結んだ底辺は純紫線(line of purples)であり、単色光では実現できない紫色の系列がここに位置する。

色度図上の任意の二色を直線で結ぶと、その線分上の点はすべて、二色の加法混色で実現可能な色度を表す。これは三刺激値が線形に加算されるという加法性の直接的な帰結であり、色空間の数学的基盤を形成する重要な性質だ。三色の加法混色は三角形の内部に限定される。この三角形がRGB色空間の色域(gamut)を定める。

光の連続スペクトラムに「赤」と「緑」の境界はない。波長は滑らかに変化し、どこにも段差はない。線はどこにもなかったのだとすれば、色度図上に引かれる色域の三角形もまた、人間が選んだ原色によって恣意的に定められた境界線だ。

RGB色空間の定義 -- 原刺激の選択と変換行列

原色と白色点の選定

RGB色空間とは、色度図上の三つの点(原色、プライマリー)を頂点とする三角形の内部で色を表現する座標系である。任意の色の三刺激値 $(X, Y, Z)$ は、原色の三刺激値の線形結合として書ける。

$$ \begin{pmatrix} X \\ Y \\ Z \end{pmatrix} = M \begin{pmatrix} R \\ G \\ B \end{pmatrix} $$

ここで $M$ は $3 \times 3$ の変換行列であり、各列が赤・緑・青の原色の三刺激値に対応する。逆行列 $M^{-1}$ が存在すれば、XYZからRGBへの逆変換が可能になる。三原色が色度図上で一直線に並ばない限り(すなわち三角形を形成する限り)、行列は正則であり逆行列が存在する。

変換行列の導出手順

行列 $M$ は、原色の色度座標と白色点の指定から一意に決定される。手順は以下のとおりだ。

各原色の色度座標 $(x_i, y_i)$ から、 $Y = 1$ と仮定した三刺激値を構成する。

$$ X_i = \frac{x_i}{y_i}, \quad Y_i = 1, \quad Z_i = \frac{1 - x_i - y_i}{y_i} \quad (i = r, g, b) $$

これを列に並べた行列を $M_0$ とする。白色点 $(X_w, Y_w, Z_w)$(通常 $Y_w = 1$ に正規化)に対して

$$ \begin{pmatrix} S_r \\ S_g \\ S_b \end{pmatrix} = M_0^{-1} \begin{pmatrix} X_w \\ Y_w \\ Z_w \end{pmatrix} $$

を解き、得られたスケーリング係数 $S_r, S_g, S_b$ を各列に乗じて最終的な変換行列を

$$ M = M_0 \cdot \mathrm{diag}(S_r, S_g, S_b) $$

と構成する。この手順により、 $R = G = B = 1$ のとき $(X, Y, Z)$ が白色点の三刺激値に一致することが保証される。白色点の選択は「何を白と見なすか」の決定であり、色空間の性格を根本的に規定する。

sRGBの定義と物理的根拠

ITU-R BT.709の原色と白色点

sRGBは1996年にHPとMicrosoftが共同で策定した色空間であり、IEC 61966-2-1として標準化されている。原色の色度座標はITU-R BT.709(HDTVの規格)と同一であり、以下のとおりだ。

  • 赤原色: $(x, y) = (0.6400, 0.3300)$
  • 緑原色: $(x, y) = (0.3000, 0.6000)$
  • 青原色: $(x, y) = (0.1500, 0.0600)$

白色点はCIE標準イルミナントD65を採用している。

  • D65: $(x, y) = (0.3127, 0.3290)$

D65は昼光を模した標準光源であり、色温度と黒体放射で導出した相関色温度は約6504 Kである。ストロボ撮影で色がずれる理由と対策で述べたように、写真用ストロボの設計色温度が5500から6000 K付近に設定されているのは、この昼光基準に近づけるためだ。色空間が白色点にD65を採用する物理的根拠は、人間が屋外で最も長時間曝される光環境の分光分布をモデル化したものだからである。

sRGBのXYZ変換行列

上述の導出手順に従うと、リニアsRGBからXYZへの変換行列は次のようになる。

$$ M_{\text{sRGB}} = \begin{pmatrix} 0.4124 & 0.3576 & 0.1805 \\ 0.2126 & 0.7152 & 0.0722 \\ 0.0193 & 0.1192 & 0.9505 \end{pmatrix} $$

第2行に注目すると、 $Y = 0.2126R + 0.7152G + 0.0722B$ である。これは輝度に対する赤・緑・青の寄与率を表しており、人間の目が緑に最も敏感で(約71.5%)、青に最も鈍感である(約7.2%)ことを反映している。写真の白黒変換で色チャンネルの重み付けが均等でない理由は、この物理的事実にある。

sRGBの伝達関数

sRGBの伝達関数は純粋なべき関数ではなく、低輝度域に線形区間を含む区分的関数である。

リニア値 $C_{\text{linear}}$( $0 \leq C_{\text{linear}} \leq 1$ )からsRGB値 $C_{\text{sRGB}}$ への変換は次のとおりだ。

$$ C_{\text{sRGB}} = \begin{cases} 12.92 \, C_{\text{linear}} & (C_{\text{linear}} \leq 0.0031308) \\ 1.055 \, C_{\text{linear}}^{1/2.4} - 0.055 & (C_{\text{linear}} > 0.0031308) \end{cases} $$

逆変換は次のようになる。

$$ C_{\text{linear}} = \begin{cases} C_{\text{sRGB}} \, / \, 12.92 & (C_{\text{sRGB}} \leq 0.04045) \\ \left(\dfrac{C_{\text{sRGB}} + 0.055}{1.055}\right)^{2.4} & (C_{\text{sRGB}} > 0.04045) \end{cases} $$

低輝度域の線形区間は、暗部でのノイズ増幅を防ぎ、関数の連続性と微分可能性を確保するために設けられている。全体としてはおおよそガンマ2.2のべき関数に近い挙動を示すが、厳密には異なる。sRGBの伝達関数を「ガンマ2.2」と呼ぶのは近似的な表現にすぎず、その知覚的な設計根拠はガンマとトーンカーブの知覚心理物理学で掘り下げる。

Adobe RGBとsRGBの色域比較

緑原色の違い

Adobe RGBは1998年にAdobe Systems社が策定した色空間であり、sRGBより広い色域を持つ。両者の原色と白色点を比較すると、赤原色と青原色の色度座標は同一であり、白色点もともにD65だ。唯一の違いは緑原色にある。

  • sRGB緑原色: $(x, y) = (0.3000, 0.6000)$
  • Adobe RGB緑原色: $(x, y) = (0.2100, 0.7100)$

Adobe RGBの緑原色はスペクトル軌跡により近い位置にあり、より彩度の高い緑を再現できる。この一点の違いにより、色度図上の三角形が緑方向に大きく広がる。

色域の定量比較

CIE 1931色度図上の面積で比較すると、sRGBは可視色全域の約35.9%、Adobe RGBは約52.1%をカバーする。Adobe RGBがsRGBより約45%広い色域を持つが、その拡張はほぼ全面的にシアンから緑にかけての領域に集中している。

印刷用インク(特にCMYKのシアン・緑領域)が表現できる色域はsRGBの色域をはみ出すことがあり、sRGBでは捉えきれない。これがAdobe RGBが印刷の物理学で扱う印刷・プリプレスの分野で標準となった技術的根拠だ。ただし、Web表示やスマートフォンの閲覧がほとんどを占める用途では、sRGBで十分であり、むしろAdobe RGBで書き出すと対応していないブラウザで彩度が過剰に表示されるリスクがある。

Adobe RGBの伝達関数はsRGBより単純で、ガンマ値 $563/256 = 2.19921875$ の純粋なべき関数として定義されている。

$$ C_{\text{Adobe}} = C_{\text{linear}}^{256/563} $$

DCI-P3とRec. 2020 -- 映画とHDRのための広色域

DCI-P3

DCI-P3はDigital Cinema Initiatives(DCI)がデジタル映画上映用に策定した色空間である。

  • 赤原色: $(x, y) = (0.6800, 0.3200)$
  • 緑原色: $(x, y) = (0.2650, 0.6900)$
  • 青原色: $(x, y) = (0.1500, 0.0600)$
  • 白色点: $(x, y) = (0.3140, 0.3510)$ 、相関色温度約6300 K

映画館用DCI-P3の白色点はD65ではなく、キセノンアークランプの分光特性に合わせた緑寄りの白に設定されている。伝達関数は暗室環境に最適化されたガンマ2.6の純粋なべき関数である。

DCI-P3の特徴は、赤原色 $(0.6800, 0.3200)$ がsRGBやAdobe RGBよりスペクトル軌跡に近く、赤方向の色域が大きく拡張されていることだ。緑原色もsRGBよりスペクトル軌跡に近いが、Adobe RGBの緑原色 $(0.2100, 0.7100)$ ほどではない。各色空間の緑原色の主波長を比べると、Adobe RGBが534.7 nm、DCI-P3が544.2 nm、sRGBが549.1 nmであり、主波長が短いほどスペクトル軌跡の頂点寄り、すなわちより彩度の高い緑に対応する。CIE 1931色度図上で約53.6%をカバーし、sRGBの約1.5倍の色域を持つ。

AppleのDisplay P3は、DCI-P3の原色(色域)をそのまま採用しつつ、白色点をD65に、伝達関数をsRGBのそれに置き換えた派生規格である。広色域ディスプレイの普及に伴い、sRGBでは表現しきれない鮮やかな色をカバーする必要性が生じたことが背景にある。写真の現像において、DCI-P3対応ディスプレイで編集した色がsRGB環境で意図どおりに見えない場合があるのは、色域の差異に起因する。

Rec. 2020

ITU-R BT.2020はUHDTV(4K/8K放送)向けの規格であり、現行の色空間規格の中で最も広い色域を定義している。

  • 赤原色: $(x, y) = (0.7080, 0.2920)$、主波長630 nm
  • 緑原色: $(x, y) = (0.1700, 0.7970)$、主波長532 nm
  • 青原色: $(x, y) = (0.1310, 0.0460)$、主波長467 nm

Rec. 2020の原色はスペクトル軌跡上にある。すなわち、理論上は単色光そのものを原色としている。これによりCIE 1931色度図の約75.8%という広大な色域を実現するが、スペクトル軌跡上の単色光を高精度に再現できるディスプレイ技術は現時点では存在しない。Rec. 2020は将来のディスプレイ技術を見据えた「器」としての規格であり、ディスプレイの物理学で扱う現行の量子ドットディスプレイやレーザープロジェクタでも完全なカバーは達成されていない。

白色点はsRGB、Adobe RGBおよびDisplay P3と同じくD65である。主要な色空間の物理的差異は原色の選択に集約される。白色点の統一は、色空間間の変換を白色点適応なしで行える利点を提供する。

ガンマ補正の物理と知覚

CRTの非線形特性 -- 歴史的経緯

ガンマ補正(gamma correction)の起源は、ブラウン管(CRT)ディスプレイの物理特性にある。CRTでは、電子銃から射出された電子が蛍光体を励起して発光する。蛍光体の発光輝度 $L$ は、印加電圧 $V$ のべき乗に比例する。

$$ L \propto V^\gamma $$

ここで $\gamma$ はCRTの特性定数であり、典型的な値はおよそ2.2から2.5の範囲にある。この非線形性は蛍光体の物理特性に由来するものであり、設計上の意図ではない。

仮に入力信号をそのまま電圧として印加すれば、出力輝度は信号値の約2.2乗に比例し、暗部が不当に暗く圧縮された画像が表示される。これを補正するために、信号の送出側であらかじめ $1/\gamma$ 乗のべき関数を適用する。

$$ V_{\text{corrected}} = C_{\text{linear}}^{1/\gamma} $$

ディスプレイの非線形特性と組み合わされることで

$$ L \propto (C_{\text{linear}}^{1/\gamma})^\gamma = C_{\text{linear}} $$

となり、入力に対して線形な輝度出力が得られる。

知覚的合理性 -- 偶然の一致

CRTの非線形特性は偶然にも、人間の明るさ知覚の非線形性と相補的な関係にあった。人間の視覚系は視覚の知覚心理物理学で体系化したスティーブンスのべき法則に従い、物理的な輝度の変化に対してべき乗的に応答する。暗い領域のわずかな輝度差は敏感に知覚されるが、明るい領域では大きな輝度差がなければ違いを認識できない。

ガンマ符号化された信号は、暗部により多くのコード値を、明部にはより少ないコード値を割り当てる。これは人間の知覚感度に整合しており、与えられたビット深度を知覚的に均等に配分する効果を持つ。ダイナミックレンジとビット深度で論じたように、8ビット(256段階)のリニア符号化では暗部の階調が不足してバンディング(トーンジャンプ)が生じやすいが、ガンマ符号化はこの問題を大幅に緩和する。

CRTは現在ほぼ姿を消したが、ガンマ符号化の知覚的合理性は引き続き有効であるため、sRGBの伝達関数としてそのまま引き継がれている。

リニアRGBとガンマRGBの変換

物理演算はリニアで行うべき理由

光の物理はリニアだ。照度は光源ごとの寄与を線形に加算して求められる。二つの光源が同じ面を照らすとき、合計の照度は各光源の照度の和である。色の加法混色も同様で、二つのスペクトルを加算すれば合成スペクトルが得られる。

ガンマ符号化された値は、この線形性を持たない。ガンマRGBの値0.5は、リニアRGBの $0.5^{2.2} \approx 0.218$(sRGBの近似)に対応する。物理輝度の半分ではなく、約22%にすぎない。したがって、ガンマRGBの値を直接算術平均すると、物理的に正しくない結果が得られる。

RAW現像の信号処理のパイプラインが示すように、画像のリサイズ、ブラー、アルファブレンディング、ライティング計算など、ピクセル値の加減乗除を含むあらゆる操作は、リニアRGB空間で行わなければ物理的に正しい結果が得られない。操作の手順は次のとおりだ。

  1. ガンマRGB(sRGB)をリニアRGBに逆変換する(上述のsRGB逆伝達関数を適用)
  2. リニアRGB空間で物理演算を行う
  3. 結果をガンマRGB(sRGB)に再符号化する

この手順を省略してガンマ空間で直接演算を行うと、結果は微妙に、あるいは明らかに不正確になる。画像のリサイズにおいて暗部が不自然に暗くなったり、エッジ部分に暗い縁取りが生じたりする原因は、この非線形性の無視にある。

色空間変換の数学

RGB間の変換 -- XYZを経由する3x3行列

異なるRGB色空間間での変換は、XYZ色空間を仲介として行う。sRGBの色 $(R_s, G_s, B_s)$ をAdobe RGBの色 $(R_a, G_a, B_a)$ に変換する手順は次のとおりだ。

  1. sRGBの伝達関数を逆変換し、リニアsRGBを得る
  2. sRGBのXYZ変換行列 $M_{\text{sRGB}}$ を用いてXYZに変換する
  3. Adobe RGBのXYZ変換行列 $M_{\text{aRGB}}$ の逆行列を用いて、XYZからリニアAdobe RGBに変換する
  4. Adobe RGBの伝達関数を適用する

数式で書けば、リニア空間での変換は次の一行に集約される。

$$\begin{pmatrix} R_a \\ G_a \\ B_a \end{pmatrix}_{\!\text{linear}} = M_{\text{aRGB}}^{-1} \cdot M_{\text{sRGB}} \cdot \begin{pmatrix} R_s \\ G_s \\ B_s \end{pmatrix}_{\!\text{linear}}$$

二つの行列の積 $M_{\text{aRGB}}^{-1} \cdot M_{\text{sRGB}}$ は定数行列であるから、あらかじめ計算しておくことで変換は一度の $3 \times 3$ 行列積で完了する。計算量は1ピクセルあたり9回の乗算と6回の加算にすぎない。

色域外色の処理

広い色空間から狭い色空間への変換では、変換先の色域に収まらない色が発生する。たとえばAdobe RGBで表現された彩度の高い緑をsRGBに変換すると、RGB値が0未満または1超になることがある。

このような色域外(out-of-gamut)の色を処理する方法は主に三つある。

クリッピングは、0未満の値を0に、1超の値を1に切り詰める最も単純な方法だ。計算が高速だが、色相や明度が意図しない方向にシフトする場合がある。

相対的色域圧縮(relative colorimetric intent)は、白色点を合わせたうえで、色域内の色はそのまま保持し、色域外の色のみを最も近い色域境界上の色に置き換える方法だ。ICCプロファイルにおける標準的なレンダリングインテントの一つである。

知覚的色域圧縮(perceptual intent)は、色域全体を均等に圧縮して、色域外の色を含むすべての色の相対的な関係性を保つ方法だ。彩度は全体的に低下するが、階調の連続性が維持される。

写真の現像においてどの方法を選ぶかは、用途と出力先に依存する。広色域で撮影した画像をsRGBのWebに書き出す場合、相対的色域圧縮が一般的な選択となる。

Lab色空間 -- 知覚的均等性を目指した非線形変換

CIE XYZの限界

CIE XYZ色空間は数学的に厳密だが、知覚的に均等ではない。すなわち、XYZ空間上での等距離の移動が、知覚上の等しい色差に対応しない。色度図上の緑の領域では大きな座標変化がわずかな色の違いにしか見えず、青紫の領域では小さな座標変化が大きな色の違いとして知覚される。

この不均等性は、色の品質管理や色差の定量評価において深刻な問題となる。「二つの色がどれだけ違うか」を一つの数値で表現するためには、距離と知覚が比例する色空間が必要だ。

CIELAB色空間の定義

1976年、CIEはこの問題を緩和するためにCIELAB( $L^*a^*b^*$ )色空間を定義した。CIELABはXYZ三刺激値に非線形変換を施すことで、知覚的均等性に近づけた空間である。

白色点の三刺激値を $(X_n, Y_n, Z_n)$ として、変換式は以下のとおり定義される。

$$ L^* = 116\,f\!\left(\frac{Y}{Y_n}\right) - 16 $$

$$ a^* = 500\left[f\!\left(\frac{X}{X_n}\right) - f\!\left(\frac{Y}{Y_n}\right)\right] $$

$$ b^* = 200\left[f\!\left(\frac{Y}{Y_n}\right) - f\!\left(\frac{Z}{Z_n}\right)\right] $$

ここで関数 $f(t)$ は次のように定義される。

$$ f(t) = \begin{cases} t^{1/3} & \left(t > \delta^3\right) \\[6pt] \dfrac{t}{3\delta^2} + \dfrac{4}{29} & \left(t \leq \delta^3\right) \end{cases} $$

ただし $\delta = 6/29$ であり、 $\delta^3 \approx 0.008856$ である。低輝度域で $t^{1/3}$ の代わりに線形近似を用いるのは、 $t \to 0$ で $t^{1/3}$ の微分が発散することを防ぎ、関数の連続性と微分可能性を保証するためだ。sRGBの伝達関数における低輝度域の線形区間と同じ設計思想である。

各座標の物理的意味

$L^*$ は明度(Lightness)を表し、0(完全な黒)から100(白色点の白)の範囲を取る。 $a^*$ は赤方向(正)と緑方向(負)の軸であり、 $b^*$ は黄方向(正)と青方向(負)の軸である。この赤-緑と黄-青の対立軸は、人間の色覚における反対色応答(opponent color response)に基づいている。人間の眼の光学で述べた網膜の三つの錐体信号は、視覚系のより上位の段階で差分信号に変換される。 $L - M$ が赤-緑軸に、 $S - (L + M)$ が青-黄軸にそれぞれ対応する。CIELABの $a^*$ と $b^*$ は、この反対色処理を近似的に再現している。

色差の定義

CIELAB空間上の二点間のユークリッド距離が、知覚的な色差の指標となる。

$$ \Delta E^*_{ab} = \sqrt{(\Delta L^*)^2 + (\Delta a^*)^2 + (\Delta b^*)^2} $$

一般に $\Delta E^* < 1$ は訓練された観察者でもほぼ識別不能、 $\Delta E^* \approx 2$ から $3$ で注意深く比較すれば識別可能、 $\Delta E^* > 5$ で明確に異なる色として知覚される。

ただし、CIELABは「完全に」知覚均等ではない。特に彩度の高い領域と低彩度の領域とで均等性のずれが残る。この限界を改善するために、CIEDE2000( $\Delta E_{00}$ )などのより精緻な色差式が後年提案されている。CIEDE2000は明度・彩度・色相の各成分に独立した重み付けと回転項を導入することで、CIELABの弱点を補正した。

非線形変換の数学的意味

$f(t) = t^{1/3}$ という立方根関数は、人間の明るさ知覚がおおむね物理輝度の立方根に比例するという心理物理学的知見に基づいている。 $L^* = 116(Y/Y_n)^{1/3} - 16$ は、輝度比 $Y/Y_n$ に立方根を取ることで、知覚的に等間隔な明度スケールを構成する試みだ。

色度軸 $a^*$ と $b^*$ はそれぞれ、 $X/X_n$ と $Y/Y_n$ 、 $Y/Y_n$ と $Z/Z_n$ の立方根の差分として定義される。XYZ空間での線形な差分ではなく、非線形変換後の差分を取ることで、色度方向の知覚的均等性も改善されている。

緑がずっと緑である保証はないで論じたように、「緑」という色のカテゴリ自体が人間の知覚と言語に依存した構成物である。Lab色空間は、その構成物を数学的に近似しようとする試みだと言える。知覚を物理に還元するのではなく、知覚の構造そのものを座標系に埋め込む。色空間とは、光の物理と人間の知覚が交差する数学的な界面にほかならない。

まとめ

CIE XYZは、等色実験から得られた三つの等色関数を基底とする色空間であり、すべての物理的な色を非負の座標で表現できるように設計された。色度座標 $(x, y)$ はXYZからの正規化によって定義され、色度図上の三角形がRGB色空間の色域を形成する。

sRGB、Adobe RGB、DCI-P3、Rec. 2020はいずれも、原色の色度座標と白色点と伝達関数によって定義されるRGB色空間であり、物理的な差異は原色の選択に集約される。より広い色域はスペクトル軌跡に近い原色の選択によって実現されるが、ディスプレイ技術がそれを再現できるかどうかは別の問題だ。

ガンマ補正はCRTの非線形応答に由来するが、人間の知覚の非線形性と偶然に整合したことで、CRT消滅後もなお有効な符号化手法として機能している。物理演算はリニア空間で行わなければならず、ガンマ空間での直接演算は物理的に不正確な結果をもたらす。

Lab色空間は、XYZに非線形変換を施すことで知覚的均等性を近似した空間であり、色差の定量評価を可能にする。色空間の数学が最終的に目指しているのは、光という物理現象と色という知覚現象の間を、なるべく歪みなく翻訳することだ。完全な翻訳は原理的に不可能だが、その不完全さの構造を定量的に把握することが、カラーマネジメントの本質的な課題である。

Read more

Dependabotの対応が面倒なのでRenovateを導入する

Dependabotくんはある程度の依存関係の更新を通知してくれるが、山のようにprojectを抱えているとなんとも痒いところに手が届かない。 ということで、Renovateを使ってみる。 Build software better, togetherGitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.GitHub ここからGitHub Appを入れる。 あとは、指示に従ってポチポチするだけで、超かんたんだった。 感想 自動化最高。

By Sakashita Yasunobu

nodejsのバグを見つけたのでPRを投げてみた

概要 要するに、node --testで特定のバイナリを標準出力に書くと、テストランナーが固まったり、異常終了したりするバグです。 バグ自体は既知のものだったようで、修正がされていました。 test_runner: infinite loop in FileTest#drainRawBuffer when child stdout contains FF 0F followed by large size bytes · Issue #62693 · nodejs/nodeVersion v25.9.0 (also reproduced on v24.14.1 LTS, v22.21.0 LTS, v23.4.0) Platform Darwin 25.

By Sakashita Yasunobu
青空文庫のParser

青空文庫のParser

青空文庫のParserを作ってます。 GitHub - P4suta/aozora: Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks.Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks. - P4suta/aozoraGitHubP4suta Rustで作ってますが、配布物はcargoのほかにnpm/pypiでも入手できます Documentation * Playground — try it in

By Sakashita Yasunobu