4 光源と照明
マシンビジョン業界には古くから「視覚プロジェクトの成否は半分が照明で決まる」という言葉が伝わっている。これは誇張ではない。カメラとアルゴリズムが処理するのはグレースケール値であり、グレースケール値の差は照明と表面の相互作用の産物だからである。傷、欠け、文字列といった対象は、適切な照明の下でのみ分離可能なグレースケール値差として結像する。照明によって対象と背景の差が引き出せなければ、どれほど精巧な後段のアルゴリズムも無駄である。逆に、一度適切な照明を設定すれば、アルゴリズムを複雑なテクスチャ解析から単純な閾値処理に簡略化できることも多い。
本章では2つの問いに答える。1つ目は、新しい検査対象に直面したとき、明視野か暗視野か、正面照明かバックライト(透過照明)か、どの色を選ぶかという照明方式の選択基準である。2つ目は、照明の不均一が引き起こす影響と、その2つの対処法——ハードウェア側の平場キャリブレーション(flat-field calibration)とソフトウェア側のシェーディング補正(shading correction)——である。後半には完全な定量的実験を付す。
4.1 照明方式と選定
照明方式の核心的な変数は光の入射角とレンズの視野角の関係である。表面の正反射光が直接レンズに入射し、背景が照らされるものを明視野照明(bright-field illumination)と呼ぶ。表面の凹凸によって散乱した光のみがレンズに入射し、平坦な背景は暗いまま、凹凸部分が明るく映るものを暗視野照明(dark-field illumination)と呼ぶ。同じ傷でも、明視野では明るい背景に薄い暗い筋として映るのに対し、暗視野では黒い背景に明るい細い線として映り、コントラストは1桁程度異なることもある。光路に沿った位置で分類すると、カメラ側から光を当てる正面照明(front lighting)と、対象の背後から光を当てるバックライト(透過照明)もある。後者は対象の輪郭を鮮明な黒いシルエットとして結像させる。一般的な照明方式とその適用場面を以下にまとめる。
| 照明方式 | 原理の要点 | 適合する表面と欠陥の種類 |
|---|---|---|
| 明視野正面光 | 反射光がレンズに入射し、背景が明るい | 拡散反射平面上の印刷、文字、汚れ |
| 低角度リング光 / 暗視野(low-angle ring light) | 掠射角で光を当て、凹凸による散乱光のみがレンズに入射 | 傷、バリ、圧痕、エッジの欠け |
| バックライト(透過照明) | 輪郭が黒いシルエットとして結像 | 外形寸法、孔径、ピン間隔の測定 |
| 同軸光(coaxial light) | ハーフミラーにより光を光軸に沿って射出 | 高反射平面:ガラス、ウェハ、研磨金属 |
| 拡散ドーム(diffuse dome) | 全角度拡散光によりハイライトを消去 | 曲面と凹凸のある金属:缶の底、はんだボール |
色も設計変数の1つである。モノクロ検査では補色でコントラストを強調することがよく行われる。赤色の印刷は緑色光の下ではほぼ黒に見えるが、赤色光の下ではほとんど見えなくなる。工場現場で赤色LEDが好まれるのは、素子が成熟して安価であるだけでなく、狭帯域フィルタと組み合わせることで環境光を効果的に除去できるからである。工場の天井灯や天窓からの日光はすべてフィルタリングされ、結像は制御された光源のみによって決まる。ちなみに、暗視野の「照明方向で表面の凹凸を際立たせる」という思想を極限まで推し進めたのが、複数方向の光源から表面法線を逆算する照度差ステレオ技術である(チャプター 34)。
照明実験法:アルゴリズムを選ぶ前に、まずサンプルで試し撮りを行う。新しいワークを入手したら、まず代表的な光源(リング光、バー光、同軸光、バックライト)をいくつか持ち寄り、サンプルで1つずつ試し撮りを行う。欠陥のコントラストが最も高く、背景が最も鮮明な組み合わせを選んでから、アルゴリズムの検討に入る。照明段階での1時間の実験が、アルゴリズム段階での1ヶ月の苦労を省くことが多い。
4.2 不均一照明の害
照明方式を正しく選んでも、照明の空間的均一性に問題が生じることがある。不均一には2つの主な原因がある。1つは口径食(vignetting)である。レンズの自然な光量低下は\(\cos^4\theta\)則に従い——照度は軸外し角の余弦の4乗(\(\cos^4\theta\))で減衰する——さらに鏡筒の機械的な遮蔽も加わり、画面の四隅は中心よりも暗くなる。もう1つは光源の幾何学的配置である。光源から表面までの距離の不均一、片側からの照明、LED素子の不均一な経年劣化などが、横方向の輝度勾配として重畳される。その結果、同じ種類の表面が画像内の位置によって異なるグレースケール値となり、ほとんどのアルゴリズムの暗黙の前提が崩れてしまう。
このことを合成実験で定量化する。理想的なシーンは\(480\times360\)画素であり、グレースケール値160の均一な背景上に、5行の文字状の暗いバンド、3つの欠陥スポット、2本の幅2pxの細い傷が分布し、対象のグレースケール値はすべて60である。これに合成した不均一照明場を重畳する。角部は\(1-0.45(r/r_{\max})^2\)の放射状減衰(四隅で45%の光量低下)とし、さらに\(0.9\)から\(1.1\)の水平勾配を乗じて片側光源のバイアスを模擬する。2つの画像を@fig-il-scenes に示す。
図 4.1 (b) は人間の目には大きな問題に見えない——対象は依然として鮮明に識別できる。しかしアルゴリズムは人間の目ではない。背景が160、対象が60の場合、中間値\(T=110\)を固定閾値として(\(T\)より暗い画素を対象と判定する)と、理想画像での誤分類画素数は0であるのに対し、口径食のある画像では誤分類画素数は16327に達し——全画素172800の約9.4%に相当する。結果を@fig-il-thresh-fail に示す。
この失効の仕方は詳しく見る価値がある。左側の2つの隅はゲイン場によって約88に押し下げられ、右側の2つの隅は約106となり、いずれも閾値110を下回って「対象」と判定されてしまう。同時に隅にある真のマーカーはこの誤判定領域に飲み込まれ、もはや分離できなくなる。これは「精度が数パーセント低下する」という漸進的な劣化ではなく、全体的な失効である——「同じ種類の表面はどこでも同じグレースケール値を持つ」という大域閾値の前提が、照明によって根本的に破壊されるのである。対処法は2つある。アルゴリズム側で局所適応型の閾値を用いる方法(チャプター 7 参照)と、照明側で不均一そのものを解消する方法である。本章では後者の道を進む。
4.3 平場キャリブレーションとソフトウェア補正
不均一照明を解消するには、「参照あり」と「参照なし」の2つの状況に対応する2つの道筋がある。
道筋1:平場キャリブレーション(flat-field calibration)。生産ラインに均一な白板(または拡散反射標準板)を置き、1枚撮像する。板自体はどこでも同じグレースケール値なので、撮像された明暗の変動は純粋に照明とレンズのゲイン場となる。本実験では、グレースケール値200の空白ターゲットに同じゲイン場を適用し、得られた平場参照画像を@fig-il-flat に示す。
平場参照画像\(F\)が得られれば、補正は画素ごとの除算で行われる。
\[ g_{\text{corr}}[n,m] = \frac{g[n,m]}{F[n,m]}\,\bar F, \]
ここで\(\bar F\)は\(F\)の平均値であり、これを乗じ戻すのは補正後の画像の全体的な輝度レベルを元の水準に保つためである。ゲイン場が除去されれば、照明の不均一は根源から消滅する。平場キャリブレーションは生産ラインの第一選択肢であり、物理的に厳密で計算コストも低い。その代償として参照画像が必要である——レンズ交換、絞り変更、光源の経年劣化後には再キャリブレーションが必要であり、また(オンラインで連続移動する、視野が広大な)一部の工程では白板を設置できない場合もある。
より厳密な平場キャリブレーションでは暗視野フレーム(dark frame)も減算する。レンズキャップを付けたまま1枚撮像し、センサーの固定バイアスを得る:\(g_{\text{corr}} = (g-D)/(F-D)\cdot\overline{(F-D)}\)。産業用8ビットカメラではバイアスは微小であり省略されることが多いが、科学用カメラや長時間露光の場合は省略できない。
道筋2:背景を自己推定するソフトウェアシェーディング補正(shading correction)。参照画像がない場合、処理対象の画像自身から照明分布を推定できる。照明の変動は大スケール(画面全体にわたる緩やかな変化)であるのに対し、対象構造は小スケール(十数画素の文字、数画素の傷)であり、両者は空間スケールで分離可能である。十分に大きなスケールでローパスフィルタを適用し(チャプター 6 を参照、ただしここでは低周波成分を保持すべき信号ではなく除去すべき「照明層」として扱う)、小さな対象を平滑化して消去すると、残るのが背景照明の推定値となる。次に元の画像をこの背景で正規化すれば補正が完了する。前提条件も明らかになる:対象は照明変動のスケールよりも明らかに小さくなければならない——欠陥自体が大きな漸進的な変化(広範囲の色差など)である場合、それが照明とともに消去されてしまう。
SciVision SDKのシェーディング補正(パラメータの詳細は@sec-il-scivision 参照)を用いて@fig-il-scenes-b を処理する。これはまさに背景自己推定の実装であり、平場参照画像を必要としない。結果を@fig-il-corrected に示す。
四隅と中心の各\(20\times20\)の背景小領域の平均グレースケール値を定量的に比較する。
| 画像 | 左上 | 右上 | 左下 | 右下 | 中心 | 極差 |
|---|---|---|---|---|---|---|
| 理想照明 | 160.0 | 160.0 | 160.0 | 160.0 | 160.0 | 0 |
| 口径食画像 | 87.6 | 105.9 | 87.6 | 105.9 | 159.9 | 72.3 |
| 補正後 | 125.4 | 125.2 | 125.4 | 124.5 | 129.0 | 4.5 |
背景の極差は72段階から4.5段階に収束する。補正後のレベルが元の160ではなく約125であることに注意されたい——ソフトウェア補正が保証するのは「平坦さ」であって「元の値への復元」ではない。閾値処理にとっては、平坦であれば十分である。同じ閾値\(T=110\)の下で、誤分類画素数は16327から0に減少する——理想照明でのセグメンテーション結果と画素ごとに完全に一致する。
本実験の初期版では「補正後に最外周1pxに221個の誤判定が残留する」と報告し、SDKが最外周の行と列を処理しないためと誤って帰属していた。後の検証で、根本原因は呼び出し側にあることが判明した。SciROI::GenRect1の右下隅は排他端点であり、当時渡していた\((W-1,H-1)\)は最後の行と列をROIから除外していた。\((W,H)\)を渡して画面全体をカバーするように修正したところ、残留誤判定は0に消滅した。
4.4 SciVision実装
シェーディング補正はSCIMV::SciSvShadingCorrectionクラスによって提供される。本章の実験で用いた呼び出しは、付属のプロジェクトのコードと完全に一致する。
SCIMV::SciSvShadingCorrection sc;
SciImage dst;
long rc = sc.CorrectShading(src, roi,
2, // lightOrDark=2:明暗両方の対象を保持(背景のみを平坦化)
1.0, // gain:ゲイン1倍、コントラストを追加増幅しない
15, // extractSize:抽出サイズ、対象ブロックの高さ(文字ブロックの高さ12px)よりわずかに大きい
2, // correctionMethod=2:シェーディング補正
0, // filterValue:妨害グレースケール値を除外しない
0, // direction=0:XY両方向
5, // filterkernelSize:背景推定用フィルタカーネル
&dst);各パラメータの意味と選定根拠は以下の通りである。
lightOrDark:背景より明るい対象、暗い対象、または両方のいずれを保持するかを指定する。2は明暗両方の対象を保持し、補正は背景にのみ作用することを意味する。gain:補正後のコントラストゲイン。1.0は追加の伸張を行わないことを意味する。対象自体のコントラストが弱い場合には適切に大きくすることができる。extractSize:背景推定時に「前景」として除外される構造のスケール。15は文字ブロックの高さ12pxよりわずかに大きく、フィルタと組み合わせれば十分である。小さすぎると対象が背景と誤認されて消去されてしまう。correctionMethod:必ず2(シェーディング補正)に設定しなければならない。調整実験で観察されたところによる(そのスイープは付属プロジェクトには収録されていない)、0(中央値)または1(平均値)は大域的なレベル正規化しか行わない——画面全体が1つの共通の平均値にシフトされるだけで、四隅は暗いままで空間的な不均一はまったく解消されない。filterValue:指定されたグレースケール値の妨害画素を除外する。0は除外しないことを意味する。direction:背景勾配の方向。調整実験で観察されたところによる、1(Xのみ)または2(Yのみ)でも数値上は平坦化できるが、一方向の背景推定は他方向の対象バンドを背景に折り込み、文字帯に目に見える縞状のアーチファクトを残す。0(XY両方向)が最も鮮明である。filterkernelSize:背景推定の平滑化カーネル。小さなカーネル(5)を両方向と組み合わせれば十分である。カーネルが大きいほど背景は平滑になるが、大きな対象付近の背景推定のバイアスも大きくなる。
本章のすべての画像と統計値を生成する完全なプロジェクトはcode/illumination/に配置されている。ゲイン場の強度と各パラメータを変更して、上記のパラメータスイープの結論を再現できる。
産業事例:ガラス傷検査における照明の失敗
あるカバーガラス検査プロジェクトでは、初期に明視野正面照明を採用していた。ガラス表面は光を均一にレンズに反射し、傷は約5グレースケール値の変動しか引き起こさなかったため、検出率は3割に満たず、チームは一時期複雑なテクスチャ強調アルゴリズムで無理やり対処しようとしていた。その後、低角度暗視野リング光に変更したところ、平坦なガラス面はレンズに向けて光を散乱せず背景はほぼ黒になり、傷は明るい線として散乱されるようになった。コントラストは80段階以上に向上し、アルゴリズムは単純な閾値処理に簡略化された。しかし暗視野にも新たな問題が生じた——掠射角では照度が距離と角度に極めて敏感であり、視野端の背景が明らかに灰色がかり、固定閾値は端部領域で頻繁に誤報を出すようになった。本章のソフトウェアシェーディング補正を重畳して背景を平坦化して初めて、システムは真に安定した。教訓は2つある。照明とアルゴリズムは1つのシステムであり、一体で設計しなければならない。照明でコントラストを倍にするごとに、削減できるアルゴリズムの複雑さは10倍に達する。
4.5 まとめ
- 照明がグレースケール値差を決定し、グレースケール値差がアルゴリズムの上限を決定する。選定の要訣:拡散反射表面は明視野、傷やバリは暗視野(低角度)、輪郭や寸法はバックライト(透過照明)、高反射平面は同軸光、曲面の高光沢面はドーム。まずサンプルで試し撮りを行い、次にアルゴリズムを決定する。
- 不均一照明(口径食 + 横方向勾配)は大域閾値を全体的に失効させる——漸進的な劣化ではない。本章の実験では、固定閾値の誤分類が0から16327画素に急増し、四隅の背景が全体的に反転した。
- 平場キャリブレーションは白板の参照画像を用いて画素ごとにゲイン場を除去する(\(g/F\cdot\bar F\))。物理的に厳密で計算コストも低く、参照板を設置できる場合の第一選択肢である。レンズ交換、絞り変更、光源の経年劣化後には再キャリブレーションが必要である。
- ソフトウェアシェーディング補正は画像自身から大スケールローパスフィルタで背景を推定し、次に正規化する。参照画像は不要である。前提条件は、対象のスケールが照明変動のスケールよりはるかに小さいことである。本章の実験では、背景の極差が72段階から4.5段階に圧縮され、誤分類は16327 → 0となった(
GenRect1の右下隅は排他端点であり、全画面ROIは\((W,H)\)を渡さなければならないことに注意)。 - パラメータは神秘ではない:
correctionMethodは必ずシェーディング補正に設定しなければならない(0/1は大域的な正規化しか行わない)。directionを一方向にすると縞状のアーチファクトが残る。extractSizeは最大の対象よりわずかに大きくしなければならない——これらはすべて再現可能な実測に基づく結論である。
照明工学と放射キャリブレーション(radiometric calibration)の体系的な解説については、Stegerらの著作(Steger, Ulrich, と Wiedemann 2018)を参照されたい。本章の平場キャリブレーションとシェーディング補正は空間的な不均一を扱っているのに対し、グレースケール値とシーンの放射照度の間の非線形応答——カメラ応答関数——は別途キャリブレーションする必要がある。MitsunagaとNayar(Mitsunaga と Nayar 1999)は、標準放射光源を必要とせず、複数の露光時間の画像のみから応答曲線を復元する放射自己キャリブレーション法を提案した。これは高精度測光とHDR撮像の基礎となる。逆に、制御された照明を能動的に利用して情報を取得する場合、Woodham(Woodham 1980)の照度差ステレオ法は、同一視点で既知の複数の光源方向から撮像した画像を用いて画素ごとに表面法線を求解するものであり、「能動的な照明による測定」の古典的なパラダイムである。






