34 照度差ステレオ
前章までの三次元イメージングは、レーザ三角測量(チャプター 30 )であれ位相偏向法(チャプター 35 )であれ、表面の巨視的な高さ——部品がどれだけ突出しているか、どれだけ深く凹んでいるか——を計測していた。しかし工業検査では別の事柄がしばしば問題となる:表面の各点が実際にどちらを向いているか、ということである。刻印文字の鮮明度、磨砂面のテクスチャの向き、浅い欠陥の勾配——これらは本質的にすべて表面法線(surface normal)の問題であり、法線は絶対高さには感度を持たない。照度差ステレオ(photometric stereo)はまさにこのために生まれた手法である:カメラを固定したまま、既知の方向にある複数の光源を切り替えて1枚ずつ画像を撮像する;同一点は異なる照明の下で明暗が変化するが、この明暗の変化にはその点の向きがちょうど符号化されている。複数の画像を連立させて解くことで、各画素で法線とアルベド(albedo)を同時に求めることができる。
この手法には他では代替困難な独特の利点がある:「形状欠陥」と「外観欠陥」を明確に2枚の画像に分離できることである。凹みは法線を変化させ、汚れはアルベドを変化させる——単一照明の濃淡画像ではこの2つが混ざり合うのに対し、照度差ステレオはそれらを自然に分離する。本章では合成レリーフ板を用いてすべての実験を行う:平坦な基板上に、突出した十字ロゴ、0.3 mmの浅い凹み欠陥、高さは変えずアルベドのみを変えた汚れ——検査において「分離されるべき対」——が存在している。図 34.1 は4つの照明方向(天頂角45°、方位角0°/90°/180°/270°)で撮像された入力画像である。
34.1 ランバートモデルと法線の求解
照度差ステレオはランバート反射(Lambertian reflectance)モデル(チャプター 4 の拡散反射と対応)に基づいている:理想的な拡散点の輝度は、法線 \(\mathbf n\) と入射光方向 \(\mathbf l\) のなす角の余弦にのみ依存し、観察方向には依存しない:
\[ I = \rho \,(\mathbf n \cdot \mathbf l), \qquad \mathbf n \cdot \mathbf l > 0, \]
ここで \(\rho\) はその点のアルベド(どれだけ吸収し、どれだけ反射するか)、\(\mathbf l\) は単位照明ベクトルである。未知量は2つの部分からなる:法線 \(\mathbf n\)(\(\|\mathbf n\|=1\) であるため自由度は2)とスカラー \(\rho\) であり、合計で3つの未知数となる。1枚の画像では1つの方程式しか得られず、全く足りない;しかし既知の方向にある \(K\) 個の光源のそれぞれで1枚ずつ撮像すれば、\(K\) 個の方程式が得られる。
求解の鍵となる技巧は、\(\rho\) と \(\mathbf n\) を1つのベクトル \(\mathbf g = \rho\,\mathbf n\) に統合することであり、これにより方程式は未知量について線形になる:\(k\) 番目の光源について \(I_k = \mathbf g \cdot \mathbf l_k\) が成り立つ。\(K\) 個の方程式を行列形式 \(\mathbf I = L\,\mathbf g\) に重ねる(\(L\) の各行は1つの光ベクトル)と、\(K=3\) で3つの光方向が線形独立であれば \(\mathbf g\) は一意に定まる;\(K\ge 4\) の場合は系は超過定数となり、最小二乗法で正規方程式を解く(チャプター 2 と対応):
\[ \mathbf g = (L^\top L)^{-1} L^\top \mathbf I. \]
\(\mathbf g\) を解いた後の分解は極めて明確である——大きさがアルベド、方向が法線である:
\[ \rho = \|\mathbf g\|, \qquad \mathbf n = \mathbf g / \|\mathbf g\|. \]
なぜ4光源は3光源より優れているのか?3光源では解はちょうど決定されるため、あらゆるノイズ、わずかな非ランバート性も減衰することなく結果に反映される;4光源では系は超過定数となり、最小二乗法は4つの測定値の平均をとるためノイズは部分的に相殺される。本章の実験では4光源を使用しており、画像全体の平均法線誤差は約1.9°で、\(\sigma=3\) のノイズフロアにすでに迫っている。光源が1つ増えるごとに、冗長性が1つ増えるのである。
本章ではこの小さな \(4\times 3\) の系を画素ごとに解く。法線を \(r=(n_x{+}1)/2\)、\(g=(n_y{+}1)/2\)、\(b=n_z\) としてカラーに符号化すると、図 34.2 が得られる:平坦な領域は \(\mathbf n\approx(0,0,1)\) であるため青色を呈し、ロゴの4つの側壁は向きが異なるため赤や緑の色合いを帯びる;アルベド画像 図 34.3 は向きの情報を完全に取り除き、「各点がどれだけ強く反射するか」のみを残す——ここでは汚れの円盤は明確な暗い斑点であるのに対し、凹み欠陥はほとんど視認できない。これら2つの画像は同じデータセットに由来するが、それぞれ「形状」と「外観」の情報しか持っておらず、これがまさに次節の主題となる。
34.2 形状と外観の分離
これは照度差ステレオの代表的な実験である。レリーフ板上に、性質の全く異なる2種類の欠陥を意図的に配置した:0.3 mmのガウス形状の凹み(純粋な形状変化であり、反射率は不変)と、汚れ(純粋な反射率変化であり、高さは不変)である。3か所の位置で小さな円形領域から統計値を取得した:基準となる清浄な平坦部、凹み部、汚れ部である。結果は以下の表の通りであり、図 34.4 の左右2つのチャネルにも対応している。
| 位置 | 鉛直方向からの法線のずれ | 反射率 |
|---|---|---|
| 平坦部(基準) | 0.99° | 0.901 |
| 凹み(0.3 mm) | 8.26°(基準の8.3倍) | 0.900(−0.1%、不変) |
| 汚れ | 1.92°(ノイズフロア付近) | 0.500(基準の55%) |
数値は明確に物語っている:凹みは法線チャネルでのみ現れる——基準の0.99°に対し8.26°は8倍以上の上昇であるのに対し、反射率は全く変化しない;汚れは反射率チャネルでのみ現れる——反射率は基準の55%まで低下するのに対し、法線のずれはわずか1.92°であり、ノイズフロアにほぼ埋もれている。形状欠陥と外観欠陥は、照度差ステレオによって互いに干渉しない2つのチャネルに分離される。
なぜ2Dグレースケールではこれができないのか?単一のグレースケール画像では、ある点が暗くなる原因は、反射率が低い(汚れ)場合と、法線が照明方向から傾いている(凹みの斜面)場合の2つがあり、単一のスカラー値ではこれらを区別できない。照度差ステレオは複数の照明方向を用いてこのスカラーをベクトル方程式に「拡張」することで、大きさと方向を分離する。これこそが、単一照明による検査が「汚れを凹みと誤判定する」問題に繰り返し陥る根本原因である。
このことは、欠陥検出(チャプター 26 )の判定基準の設計に直接関係する:形状型欠陥(凹み、傷、エッジの潰れ)には法線または法線から導出される曲率に閾値を設定すべきであり、外観型欠陥(汚れ、酸化、印刷汚点)には反射率に閾値を設定すべきである。2種類の欠陥には異なる判定基準が必要であり、照度差ステレオはそれらを別々に評価するための2つの原画像を好都合に提供する。
34.3 高さ積分
法線場が得られれば、それを積分して高さに戻したくなるのは当然である。法線 \(\mathbf n=(n_x,n_y,n_z)\) に対応する表面の勾配は \(p=h_x=-n_x/n_z\)、\(q=h_y=-n_y/n_z\) であり、ポアソン方程式 \(h_{xx}+h_{yy}=p_x+q_y\) を解くことで高さを復元できる(これは チャプター 11 のFrankot–Chellappaによる周波数領域での積分と同じ起源であるが、本章ではSOR反復法を用いて空間領域で求解する)。積分によって得られた高さマップを 図 34.5 に示す。実験結果は興味深いものである:
- 緩やかに変化する特徴は良好に復元される。0.3 mmのガウス形状の凹みは積分により−0.317 mmとなり、真値の−0.300 mmとの差は6%未満である——平滑で浅い欠陥はまさに積分の得意とするところである。
- 急峻な壁は大幅に過小評価される。凸状のロゴの真の高さは2.00 mmであるのに対し、積分では1.16 mmしか得られない。その理由は率直かつ本質的である:ロゴの側壁は約76°の急峻な傾斜を持つため、天頂角45°の照明下では自己遮蔽が発生し、壁面は照明と逆を向くか自身の影に覆われる。そのため、ソルバーによって法線が「平坦化」され、段差の高さがそれに伴い減衰する。これはバグではなく、急峻な形状下での照度差ステレオの真の教訓である——それは微視的な勾配には優れるが、垂直に近い段差の復元には不得手である。
- 低周波ドリフト。本来は同じ高さであるはずの平坦部の四隅が、積分後には0.094 mmの高さの幅を持つ。これはノイマン境界条件下でのポアソン積分に固有の低周波ドリフトである:積分は勾配(高さの導関数)のみを拘束するため、全体的な緩やかな傾きは導関数にほとんど痕跡を残さず、そのため固定することができない。
照度差ステレオの高さに関する能力限界を一言で覚えるなら:それは微視的な形状には優れるが、絶対高さには不得手である。勾配情報はその一次データであり、積分は事後的な再構成に過ぎない。高周波で緩やかに変化する形状(傷の深さ、オレンジピールテクスチャ)ほど精度が高く、大スケールの絶対的な段差高さや全体的な反りほど信頼性が低くなる。絶対高さが必要な場合は、レーザー三角測量法または位相偏向法に戻るべきである。
34.4 ランバーシャン違反とロバスト性
ランバーシャンモデルは解法全体の基礎であるが、現実の表面は多くの場合ランバーシャンではない。金属、釉薬、油膜は鏡面ハイライト(specular highlight)を生じ、凸部は影を投げかける。ハイライトは拡散反射をはるかに超える輝点であり、影は輝度があるべきなのにゼロである暗部である。どちらも \(I=\rho(\mathbf n\cdot\mathbf l)\) を満たさず、最小二乗法に混入すると、その画素の解全体を歪めてしまう。
レリーフ板に鏡面ハイライト領域を1つ追加し、ハイライトを含む5枚目の画像を追加撮影して、3種類の解法によるハイライト領域の法線誤差を比較する。
| 構成 | ハイライト領域の法線誤差 |
|---|---|
| 4光源(ハイライトなし) | 1.15° |
| 5光源(ハイライトあり、素朴な最小二乗法) | 11.81° |
| 5光源(ハイライトあり、ロバスト棄却) | 1.15° |
素朴な最小二乗法はハイライトの測定値を信頼できるデータとして扱うため、誤差が1°から12°近くまで急増する。ロバスト照度差ステレオ(robust photometric stereo)の手法は非常に単純でありながら効果的である。まず全測定値を用いて一度解を求め、残差が最大の項(ほとんどの場合ハイライトまたは影)を特定して棄却し、残りの測定値で再び解を求める。これにより誤差は1.15°に低下し、ハイライトが全くない場合と同程度になる。図 34.6 の中央(素朴な最小二乗法)と右側(ロバスト棄却)の誤差マップは、ハイライト領域における両者の雲泥の差を直感的に対比している。
ロバスト照度差ステレオの手法は「多光源 + 外れ値棄却」の一言に要約できる。これは チャプター 14 のHuberロバスト直線フィッティングと同じ思想に由来する。いずれも「少数の測定値は外れ値である」ことを認め、棄却または重み付け低減によってそれらを推定から除外するものである。唯一の違いは、前者の外れ値が欠陥エッジに由来するのに対し、後者の外れ値はハイライトと影に由来する点である。光源が多いほど、棄却に利用できる冗長性が大きくなり、ロバスト性は強くなる。
34.5 SciVision の実装
正直に記述すると、SciVision の照度差ステレオインターフェース SciSvPhotometricStereo::CalibratedPhotometricStereo は本機でサイレントな空出力を発生させる——クラッシュせず、戻り値は rc=0 であるが、Nx/Ny/Nz/albedo の出力はすべて 0×0 の空画像であり、stderr に “Directory does not exist.” と出力する(チャプター 35 の PhaseMeasure と全く同じ失敗パターンであり、実行時リソースディレクトリが欠落していると疑われる)。そこで本章ではサブプロセスプローブを用いてこの不具合を忠実に記録し、求解処理全体を手書きの画素単位最小二乗法に切り替える——これはまさに セクション 34.1 の数学的な本体である。コアのコード片を以下に示す。
// 画素単位で g = albedo·n を解く:min_g Σ_k (I_k − g·l_k)²
// 正規方程式は (Σ l_k l_kᵀ) g = Σ I_k l_k
double M[9] = {0}, b[3] = {0};
for (int k = 0; k < K; ++k) { // K 個の光源
double l[3] = { Lx[k], Ly[k], Lz[k] }; // 既知の光方向
for (int r = 0; r < 3; ++r) {
b[r] += I[k] * l[r]; // Σ I_k l_k
for (int c = 0; c < 3; ++c)
M[r*3 + c] += l[r] * l[c]; // Σ l_k l_kᵀ
}
}
solve3(M, b, g); // 3×3 を解いて g を求める
// ロバスト化:残差が最大の項を除外し、残りの ≥3 項で再解き(ハイライト・影を除去)
if (robust && K >= 4) {
int worst = argmax_k |I[k] − g·l_k|;
M,b を(worst をスキップして)再累積し、solve3 -> g;
}
double albedo = norm(g); // ベクトルの大きさ = アルベド
n = g / albedo; // 方向 = 法線(カメラを向く n_z≥0 とする)高さ積分はポアソン方程式の点単位 SOR 反復法で実装する:法線から勾配 \(p,q\) を計算し、その発散を求めて右辺 \(f=p_x+q_y\) とし、緩和係数 \(\omega=1.9\) で反復して \(h_{xx}+h_{yy}=f\)(ノイマン境界条件)を解く。完全な実行可能プロジェクトは code/photometric_stereo/ に置かれている。
産業事例:銘板の刻印文字と汚れ
ある金属銘板の検査ラインでは、刻印文字が鮮明かつ完全であるか(形状系)と、表面に油汚れや酸化斑が付着していないか(外観系)の2つを同時に判定する必要があった。初期の単一照明グレースケール方式では、刻印底部の影と濃い油汚れの両方が画像内で「暗部」として現れ、両者を区別することが困難であった——閾値を高く設定すると浅い刻印を見逃し、低く設定すると油汚れを文字の欠陥と誤判定するため、誤検出率が高いままであった。4光源の照度差ステレオに切り替えたところ、問題は一気に解決した:法線マップは文字の刻印深さとエッジの勾配だけを反映し、アルベドマップは油汚れと酸化による反射率の変化だけを反映する。2つのマップにそれぞれ独自の判定基準を設けることで互いに干渉することがなくなり、誤検出率は大幅に低下した。教訓は明確である:「欠陥」に形状系と外観系の両方が含まれる場合、両者を2つのチャネルに分離する照度差ステレオの能力は代替不可能であり、これはどの単一照明方式も実現できないものである。
34.6 まとめ
- 照度差ステレオは法線を測定するものであり、高さを測定するものではない。 カメラは固定し、方向が既知の光源を切り替える;ランベルトモデル \(I=\rho(\mathbf n\cdot\mathbf l)\) は輝度の変化を各点の向きに分解する;3光源で解が定まり、4以上の光源で最小二乗解となり、\(\mathbf g=\rho\mathbf n\) の大きさがアルベド、方向が法線となる。
- 形状欠陥と外観欠陥を分離できる。 本章の実験では、凹みは法線チャネルでベースラインの8倍に跳ね上がる一方でアルベドは変化せず、汚れはアルベドを55%に低下させる一方で法線は不変であった——これは単一照明グレースケールでは実現できない分離であり、欠陥の判定基準をどのチャネルに構築すべきかを直接決定する。
- 法線は高さに積分して戻せるが、限界がある。 緩やかに変化する浅い欠陥は精度よく復元され(凹み −0.317 vs −0.300 mm)、急峻な壁は自己遮蔽のため過小評価され(ロゴ 1.16 vs 2.00 mm)、低周波ドリフトはノイマン境界条件の本質的な産物である——微視的な形状には適しているが、絶対高さには適していない。
- ロバスト性 = 多光源 + 外れ値除去。 ハイライトと影はランベルトの仮定に違反するため、素朴な最小二乗法では誤差が爆発し(11.81°)、残差が最大の測定値を除外した後は誤差が1.15°に低下し、これは Huber ロバストフィッティングと同じ起源を持つ。
- SDK の照度差ステレオインターフェースは本機で使用不可能である(サイレントな空出力)。手書きの画素単位最小二乗法は、代替手段であると同時に本章の数学的な本体でもある。
照度差ステレオの基礎的な研究は、複数照明から表面の向きを決定する Woodham の手法である (Woodham 1980);ランベルトの仮定を崩すハイライトと影の問題に対し、Wu らはこの問題を低ランク行列補完と復元としてモデル化し、ロバストな照度差ステレオの凸最適化解法を提案している (Wu ほか 2011)。これは本章の外れ値除去の考え方と精神を共有するものである。産業用ビジョンにおける照度差ステレオ、形状復元、ロバスト推定の体系的な解説については、さらに Steger らの著作を参照できる (Steger, Ulrich, と Wiedemann 2018)。





