32 構造化光3次元イメージング
ステレオビジョン(チャプター 31 )の最大の弱点は「対応点の探索」である:左右2つの画像を物理的に同一点で対応付ける必要があり、その対応付けは表面のテクスチャに依存する。しかし工業現場にはテクスチャに乏しい物体が数多く存在する——研磨された金属面、射出成形品の均一な塗装面、白いセラミックなどである。これらの物体上ではすべての画素が同じように見えるため、対応付けアルゴリズムは手がかりを得られず、視差図は広大な空洞だらけになってしまう。被測定物自体にテクスチャがないのであれば、能動的に投影して与えればよい。構造化光(structured light)の核心的な考え方はまさにこれである:プロジェクタを用いて既知で制御可能な明暗パターンを物体表面に照射し、それを「人工的なテクスチャ」として機能させるのである。パターンが起伏のある表面に投影されると、高さに応じて変形する。カメラがこの変形を撮影し、それを逆に解くことで各点の高さを復元する。符号化可能なすべてのパターンの中で、正弦縞 + 位相シフトは工業用3次元計測の主力手法である——これは高さ情報を縞の位相に符号化し、位相を用いることでサブピクセルで画素ごとの密な再構成を実現できるためである。図 32.1 は本章全体を通して用いる4ステップ位相シフト縞のセットである。
なぜ2値グレイコードではなく正弦縞を用いるのか?グレイコードは各画素を「黒/白」でしか符号化しないため、分解能は縞の最小線幅に制限される。一方、正弦波の位相は連続量であり、位相シフトと組み合わせることで画素内部の小数位相を分解でき、精度を1~2桁向上させることができる。代償として、位相には \(2\pi\) 周期の曖昧さが生じるため、アンラッピング(位相接続)を行う必要がある——これがまさに本章 セクション 32.2 で解決すべき問題である。
32.1 位相シフト法の原理
プロジェクタが空間的な正弦縞を投影するとき、カメラが画素 \((x,y)\) でサンプリングする濃度は次のように書ける。
\[ I_k(x,y) = A(x,y) + B(x,y)\cos\!\big(\varphi(x,y) + k\,\tfrac{\pi}{2}\big), \qquad k=0,1,2,3. \]
ここで \(A\) は背景光(直流成分、DC component)、\(B\) は縞の変調度(modulation)すなわち正弦波の振幅、\(\varphi\) は我々が真に求める位相(phase)であり、これが当該点の高さを符号化している。連続して4枚の縞画像を投影し、それぞれで初期位相を全体的に \(\pi/2\) ずつシフトさせる(これが「4ステップ位相シフト、four-step phase shifting」である)。すると同一画素について4つの方程式が得られ、未知数はちょうど \(A\)、\(B\)、\(\varphi\) の3つとなる。4つの式をペアで減算すると:
\[ I_3 - I_1 = 2B\sin\varphi, \qquad I_0 - I_2 = 2B\cos\varphi. \]
これらを除算してアークタンジェントをとると、\(A\) と \(B\) が同時に消去され、位相だけが残る。
\[ \varphi(x,y) = \operatorname{atan2}\big(I_3 - I_1,\; I_0 - I_2\big). \]
この式が位相シフト法のすべての精髄である。繰り返し味わう価値があるのは、そのロバスト性の源泉である:\(\varphi\) は4つの強度の差と比だけに依存し、背景光 \(A\) や縞の輝度 \(B\) とは無関係である。言い換えれば、カメラのゲインドリフト、環境光の変動、被測定面のアルベドの高低は、いずれも復元される位相を変化させない——それらは \(A\) と \(B\) だけを変化させるが、これらはすでに消去されているのである。これは チャプター 17 の「勾配方向は照明ゲインによって変化しない」と同じ工学的な英知である:情報をゲインに不変な量に符号化することで、計測は安定する。強度そのものは脆弱であるが、位相は信頼できる。
\(\operatorname{atan2}\) の値域は \([-\pi,\pi)\) であるため、復元される位相はラップド位相(wrapped phase)となる——真の位相が \(2\pi\) を超えるたびにこの区間に折り畳まれ、鋸歯状の波形となる。図 32.2 はこの様子を示している:連続的に起伏する高さ場が、ラップド位相画像では等位相帯の列に変わり、帯と帯の間には \(+\pi\) から \(-\pi\) へ急降下する「断崖」が生じる。これらの断崖は真の不連続ではなく、\(\operatorname{atan2}\) の周期性による人為的なものであり、次節でこれを平滑化する。
32.2 位相アンラッピング(位相接続)
ラップド位相 \(\varphi\in[-\pi,\pi)\) を連続的な絶対位相(absolute phase)\(\Phi = \varphi + 2\pi n\) に復元するには、画素ごとに整数の縞次数(fringe order)\(n\) を決定する必要がある。最も素朴な手法は空間アンラッピング(spatial unwrapping)である:画像に沿って走査し、隣接画素間の位相差が突然 \(\pi\) を超えて跳んだ場合にラップ断崖を越えたと判定し、以降の画素に \(2\pi\) を加算する。この手法は滑らかで連続な表面には有効であるが、非常に脆弱である——ノイズによる擬似的な跳びや、物体上の真の高さの不連続(本章の段差など)に遭遇すると、積分がある点から全体的に1つまたは複数の \(2\pi\) 分だけずれてしまい、その誤りが走査方向に沿って伝播し続け、自己修復することができない。
工業的によりロバストなのは2周波数/多周波数階層法(dual-/multi-frequency unwrapping)である。この手法では周期の異なる2組の縞を用いる:1組は低周波の縞で、周期が十分に大きいため視野全体での位相変化が \(2\pi\) 未満となり、本来的に曖昧さがなく「おおよそ何番目の縞にいるか」を直接決定できる。もう1組は高周波の縞で、周期が小さく位相の傾きが急なため、最終的な計測精度を提供する。図 32.3 は本章で用いる低周波セットである(\(P=128\) pxで、高周波の \(P=32\) の4倍である)。具体的には、まず低周波のラップド位相に1回の空間アンラッピングを施して低周波絶対位相 \(\Phi_{\text{lo}}\) を得る(低周波場は滑らかで、段差による位相の跳びは約 \(0.6\) rad と \(\pi\) よりはるかに小さいため、空間アンラッピングは誤りなく行える)。次に周波数比 \(P_{\text{lo}}/P_{\text{hi}}=4\) を用いてこれを拡大し、高周波絶対位相を予測し、画素ごとに丸めて次数を確定する:
\[ \Phi_{\text{hi}} = \varphi_{\text{hi}} + 2\pi\,\operatorname{round}\!\Big(\frac{\Phi_{\text{lo}}\cdot(P_{\text{lo}}/P_{\text{hi}}) - \varphi_{\text{hi}}}{2\pi}\Big). \]
重要な点は、次数 \(n\) が画素ごとに独立して算出され、近傍の積分に依存しないことである。そのため1つの画素の誤りが隣接画素に伝染することは決してなく、段差の真の不連続は「平滑化」されることなく忠実に保存される。これが2周波数法が空間法を凌駕する根本的な理由である。図 32.4 はアンラッピング後の絶対位相であり、滑らかで単調で、球冠のドームと段差のブロックが明瞭に識別できる。
アンラッピングにはもう1つの技術的ルートがある:時間位相アンラッピング(temporal unwrapping)である。これは空間近傍で断崖を探すのではなく、同一画素に対して時間的に周波数を増加させた複数組の縞を投影し、前の周波数の絶対位相を用いて次の周波数の次数を決定する。2周波数法はこの最も単純化された2段階の特殊ケースである。時間法の利点は点ごとに独立し不連続に強いことである;欠点は投影フレーム数が倍増するため、高速な運動を伴うシーンには適さないことである——速度とロバスト性の古典的なトレードオフである。
32.3 高度再構成と精度
絶対位相から高さへの最後の転換は、三角測量の較正関係である。本章の撮像モデルにおいて、投影機座標は \(u = x + c\cdot h\) であり、\(h\) は高さ、\(c\) は投影機とカメラの幾何配置によって決まる三角測量定数(triangulation constant)である(本例では \(c=4\) px/mm、すなわち高さ 1 mm あたり縞が横方向に 4 px 移動する)。絶対位相と投影機座標の関係は \(\Phi = 2\pi u / P_{\text{hi}}\) であり、これらを連立させて逆解すると次式が得られる。
\[ h(x,y) = \frac{1}{c}\Big(\frac{\Phi_{\text{hi}}\,P_{\text{hi}}}{2\pi} - x\Big). \]
実測された精度は満足のいくものである。\(A=120\)、\(B=80\)、ノイズ \(\sigma=3\) の条件下で、球冠の頂点は 5.994 mm に再構成され、真値は 5.994 mm であった。また段差の高さは 2.999 mm、真値は 3.000 mm であり、いずれも真値に一致した。図 32.5 は最終的な高さマップである。平坦な底面上の RMS ノイズフロアは 0.0338 mm であり、これが本設定における高さの再現精度である。
このノイズフロアはどこから生まれ、何によって決まるのだろうか。答えは構造化光の生命線である変調度 \(B\) である。4 ステップ位相シフト法を用いて誤差伝搬を行うと、位相の標準偏差は次式を満たす。
\[ \sigma_\varphi \approx \frac{\sigma}{B}, \]
すなわち位相ノイズは縞の振幅に反比例する。\(B\) を 80 から 15 に減少させると(約 \(5.3\) 倍)、理論上は位相と高さのノイズも同じ倍率で増幅されるはずである。実験結果は次の通り:\(B=15\) のとき底面の RMS は 0.1823 mm に上昇し、これは \(B=80\) のときの 0.0338 mm のちょうど 5.4 倍であり、理論予測の 5.3 倍とほぼ完全に一致した。この \(\sigma_\varphi\propto\sigma/B\) の法則により、抽象的な画質指標(縞の鮮明度)が直接高さ精度に翻訳される。構造化光の精度は、本質的に変調度によって決まる。暗い表面、低コントラスト投影、焦点ぼけ、動きぼけなど、\(B\) を低下させる要因はすべて 3 次元精度を比例的に劣化させる。
\(\sigma_\varphi\approx\sigma/B\) は、工業用構造化光システムがなぜ可能な限り高コントラストの縞を投影しようとするのかも説明する。投影機の輝度、レンズの絞り、カメラの露出は、最終的にすべて「飽和させない範囲で \(B\) を最大にする」という 1 つの目標に奉仕している。ただし「飽和させない」という前提は極めて重要である。次節で見るように、一度この線を越えると、別の形で災厄が訪れる。
32.4 変調度、飽和、および表面
\(B\) が精度を決める以上、自然な工学的対応策として変調度マスク(modulation mask)を用いて \(B\) が過度に低い画素を除外することが挙げられる。4 ステップ位相シフト法では \(B=\tfrac12\sqrt{(I_3-I_1)^2+(I_0-I_2)^2}\) を副次的に算出できるため、これに閾値処理を施せばよい。本章の「実写」実験では、底面の左下隅にアルベドがわずか 0.18 の暗領域を埋め込み、黒色塗装や低反射表面を模擬した。結果は見事であった:\(B<20\) を閾値としたところ、暗領域の画素の 99.7% が標識され、清浄な底面では誤警報がゼロとなり、マスクは信頼できない領域を正確に抽出した。図 32.6 の左側が変調度マップ、右側が 2 値マスクである。
しかし変調度マスクには致命的な盲点が 1 つ存在する:飽和を防ぐことができない点である。本実験では球冠の頂部に鏡面ハイライト(1.7 倍ゲイン後に 255 でクリップ)を重ね、金属表面の反射を模擬した。直感的には飽和は正弦波を崩し変調度を低下させるため、マスクがそれを検出できるはずであるが、実測では飽和領域が標識された割合は 0% であった。その理由は次の通り:位相シフトされた 4 枚の画像はいずれも等しく 255 にクリップされるため、クリップ後も差分 \(I_3-I_1\) および \(I_0-I_2\) は相当な振幅を保持しているため、算出された \(B\) は閾値を下回らない。そのためマスクはこの領域の「変調度は良好で、データは信頼できる」と判断するが、実際には位相はクリッピングによって歪められている。その結果、球冠の頂点は 5.994 mm から 5.928 mm にシフトし、飽和円盤内のRMSは0.1087 mm(クリーン領域の約3.2倍)に上昇し、暗部のRMSは0.1911 mmとなる。マスクは機能せず、誤差マップのみが真相を暴くことができる——図 32.7 は再構成誤差をプロットしており、誤差はちょうど2つのクラスタ、すなわち暗部とその飽和ハイライト円盤に集中しており、マスクが見逃した位置と正確に一致している。
これにより、異なる表面と構造化光の「適合性」が明らかになる。暗い・低アルベドの表面は\(B\)を抑制しノイズを増幅するが、マスクによって除外できる。飽和ハイライトはマスクの目の前で静かに系統誤差を注入するため、露光制御(限界を超えないようにすること。チャプター 4 の照明設計と呼応する)によって根源から予防しなければならない。半透明性とサブサーフェス散乱は縞を「滲ませ」、位相を歪める。また、構造化光が根本的に処理できない表面の種類も存在する——鏡面である:光は鏡面によって反射されてしまい、表面に投影された縞はカメラに到達しない。この場合はデフレクトメトリ(チャプター 35)に切り替える必要があり、この手法は縞の位置ではなく、表面法線によるパターンの偏折を測定する。単一の3D手法がすべての表面に対して機能することはない。構造化光の限界は、まさにその手法の仮定の限界である(チャプター 30)。
32.5 SciVision 実装
本章では当初、SDK の位相計測モジュール SCIMV::SciSvPhaseMeasure の流用を計画していたが、実際に動作を確認したところコアのエントリポイントが使用不能であったため、ここにその実態を記録する。四歩位相シフト復号を行う DecodePatterns は、試行した全 16 通りの呼び出しバリエーション——8U と 32F の入力、事前の InitPMD の有無、UNDEF と全画像矩形 ROI、Y 方向縞の追加の有無——において、いずれも rc=0 を返しながら一切の出力を生成しなかった:位相マップ、グレースケールマップ、変調度マップはいずれも \(0\times0\) の空オブジェクトであり、DLL は stderr に「Directory does not exist.」と出力した(実行時リソースディレクトリが欠落していると推測される)。その出力に依存する空間アンラッピング CalUnPhase も同様に使用不能となった。そのため、パイプライン全体をすべて手書きで実装した。コアのコードは 2 つのスニペットだけだが、これらが本章のアルゴリズムの全容である。
// 1. 四歩位相シフトによるラップされた位相 + 変調度(A、B は差分で相殺され、位相のみが残る)
for (size_t i = 0; i < (size_t)W * H; ++i) {
double s = (double)im[3][i] - im[1][i]; // = 2B*sin(phi)
double c = (double)im[0][i] - im[2][i]; // = 2B*cos(phi)
phi[i] = std::atan2(s, c); // ラップされた位相 [-pi, pi)
mod[i] = 0.5 * std::sqrt(s * s + c * c); // 変調度 ~ B
}
// 2. 2 周波数階層アンラッピング:低周波数絶対位相 *4 で高周波数の次数を予測し、画素ごとに丸める(近傍積分は不使用)
const double ratio = P_LO / P_HI; // 128/32 = 4
for (size_t i = 0; i < abs.size(); ++i)
abs[i] = wHi[i] + TWO_PI * std::round((uLo[i] * ratio - wHi[i]) / TWO_PI);最初のスニペットは セクション 32.1 のアークタンジェント公式を直接実装している:im[k] は \(k\) 番目の位相シフト画像、s と c はそれぞれ \(\sin\varphi\) と \(\cos\varphi\) に比例し、atan2 はラップされた位相を返し、両者の大きさから変調度が副次的に得られる。2 番目のスニペットは セクション 32.2 の階層法である:uLo は空間的にアンラップされた低周波数絶対位相であり、周波数比 4 を乗じて高周波数絶対位相を予測し、std::round は各画素を独立して最も近い \(2\pi\) の整数倍に割り当てる。完全な実行可能プロジェクトは code/structured_light/ にあり、縞の合成、低変調度での再実行、実撮影トラップ実験を含む。
産業事例:SPI における半田の反射と黒インク
PCB の半田ペースト印刷検査(SPI、Solder Paste Inspection)は構造化光 3D の代表的な適用領域である——半田ペーストの塊ごとの体積を点ごとに計測する必要があり、その結果は半田付けの歩留まりに直接影響する。その難点はまさに本章のジレンマが 1 フレーム内に併存することである:印刷直後の半田ペーストは金属光沢があり、鏡面反射と飽和を起こしやすい;隣接する黒色ソルダーレジストインクはアルベドが極めて低く、光をほぼ吸収してしまう。半田ペーストに合わせて露光を調整すると、黒インク領域の位相はノイズに埋もれる;黒インクに合わせて露光を調整すると、半田ペーストのハイライトが飽和し、系統的な高さバイアスが生じる——そして飽和は変調度マスクを欺くため、このバイアスは静かに浸透していく。
実務的な対策はHDR 多重露光合成縞である(チャプター 12 を参照):各位相シフト段階ごとに複数の露光レベルを投影し、画素ごとに飽和しておらず最も変調度が高いレベルを選んで合成することで、半田ペーストと黒インクのそれぞれに適した条件を実現する。その教訓は素朴ながら深い:構造化光の視野全体の精度は、視野内で最も劣悪な変調度によって決まる——最適化は平均的な表面ではなく、最弱の表面を対象としなければならない。
32.6 まとめ
- テクスチャがなければ能動的に投影する。 ステレオビジョンは対応点を見つけるために表面テクスチャに依存するが、滑らかな物体ではそれが不能となる;構造化光は制御可能な「人工的なテクスチャ」を投影し、高さを縞の位相に符号化することで稠密な 3D 再構成を実現する。
- 位相は強度よりもロバストである。 四歩位相シフト \(\varphi=\operatorname{atan2}(I_3-I_1,\,I_0-I_2)\) は背景光 \(A\) と縞の振幅 \(B\) の両方を相殺し、位相をゲイン、環境光、アルベドに対して非感受性にする——これが安定した計測の基盤である。
- ラッピングは必ず解消する必要があり、2周波が最も安定している。\(\operatorname{atan2}\) の \(2\pi\) の曖昧さは、位相接続によって除去されなければならない。空間法は点ごとに積分を行うため不連続部で崩壊するのに対し、2周波/多周波階層法は画素ごとに次数を割り当てて不連続部に耐性があり、業界標準となっている。
- 変調度が命脈である。高さノイズ \(\sigma_\varphi\propto\sigma/B\) であり、実測では \(B\) が5.3倍低下すると誤差が5.4倍上昇した。\(B\) を低下させるすべての要因は、精度を比例的に悪化させる。
- マスクでは飽和を防げない。変調度マスクは暗領域を(99.7%、誤警報ゼロで)正確に除外できるが、飽和には(0%の標識で)無力である——飽和は変調度を低下させないが位相を歪め、誤差マップでのみ露呈する。飽和を防ぐには事後的なマスクではなく、露光制御とHDRに依存する必要がある。
構造化光の符号化パターンの体系的な分類については、Salvi らのサーベイ (Salvi ほか 2010) を参照されたい。縞投影プロフィロメトリの発展の経緯と重要な問題については Gorthi と Rastogi の解説 (Gorthi と Rastogi 2010) があり、Geng のチュートリアル (Geng 2011) は構造化光による3次元イメージングの各種手法を体系的かつ読みやすく整理している。相移プロフィロメトリと多周波位相接続の産業界での実装の詳細については、Steger らの著作 (Steger, Ulrich, と Wiedemann 2018) をさらに参照できる。






