42  3D検査

検査編(チャプター 26 が属する第6部)では、欠陥検出のパラダイムを一言にまとめ上げた:欠陥とは「正常」からの逸脱である——まず唯一の正常を定義し、次に多種多様な逸脱を定量化するのである。その編の舞台は2次元濃淡画像であり、正常も逸脱もすべて画素の輝度に記されていた。本章では同じパラダイムを3次元へと拡張する:検査対象はもはや濃淡画像ではなく、1枚の距離画像(range image / height map)である——各画素には輝度ではなく、その点における物体表面の真の高さ(mm)が格納されている。パラダイムに一言一句の変更はないが、次元が変わる:欠陥は3次元において初めて、2次元濃淡では到底見ることのできない高さ、体積、平面度といった次元を持つに至る。背景より25濃度階調暗いインク染みは、2次元ではコントラストに頼らなければ識別できない;しかし高さ0.99 mmの段差、高さ7 mmの円台は、3次元ではまさに0.99 mm、7 mmであり、過不足ない——次元すなわち物理量であり、これが2Dに対する3D検査の最も本質的な利点であると同時に、本章全体を貫く糸口である。

本章では実際のSmart3距離画像1枚を全実験に用いる(図 42.1、Smart3 1.9.2.2の「3Dマルチ輪郭検出サンプルレシピ」に含まれる001.srtである):被検査物は多段階の射出成形/機加工部品であり、俯瞰視野は32 mm×50 mm、横方向分解能は0.02 mm/px(1600×2500)、高さ分解能ResolutionZはわずか0.01 µm/count(量子化は極めて細かい)である。その名の通り「マルチ輪郭」であり——表面は上下2段のプラットフォーム(段差は約1 mm)に分かれており、その上に高さの大きく異なる複数の輪郭特徴が分布している:高聳な中央円台(boss、基準面より約7 mm高い)、下段プラットフォーム上の低い円台、上段プラットフォーム先端の一周する沈み込んだ長円形溝とそれに囲まれた浮き上がったプラットフォーム、さらに高い円台の天面にある数箇所の微小な凹点である。図 42.1 ではjet高さコーディングにより段階が一目でわかるようになっている:濃い青が下段プラットフォーム、薄い青が上段プラットフォーム、中央の深紅に染まった円台が高くそびえ、底部のシアン色の低い円台が中央に位置し、先端の長円形輪郭も鮮明に識別できる。特筆すべきは全画素のうち有効なのはわずか41.3%であることで:残りの58.7%は無効(生カウント値INT_MIN)とマークされており、急峻な壁、深い穴、レーザー無反射領域に対応する——これが実際の3Dデータと合成データの最大の違いであり、後述するすべての手順ではまず「この画素にデータがあるか」を問わなければならない。

図 42.1: 実際の距離画像(001.srt、1600×2500、jet高さコーディング)。被検査物は上下2段のプラットフォームに分かれている;中央の深紅の特徴は基準面より約7 mm高い円台であり、その天面に微小な凹点が見える;底部のシアン色の特徴は低い円台である;先端の長円形輪郭は沈み込んだ溝に囲まれた浮き上がったプラットフォームである。白は無効画素(急峻な壁/無反射、58.7%を占める)。横方向0.02 mm/px、視野32×50 mm。

距離画像は2.5Dデータとも呼ばれる:規則的な\(x,y\)格子上に単一値の高さ\(z(x,y)\)を格納しており、(高さを持たない)2D画像と、完全な3D点群(チャプター 37、各点が任意の\(x,y,z\)を持ち、オーバーハングや閉曲面を表現できる)の中間に位置する。レーザー三角測量(チャプター 33)、構造化照明(チャプター 32)といった装置の原生出力の大半はまさに距離画像である——本章では距離画像が既に生成されていることを前提とし、「距離画像を得た後にどのように輪郭や欠陥を判定するか」に焦点を当てる。急峻な壁や深い穴ではレーザーが反射しないため、センサーは当該画素を無効(本図ではINT_MIN)とマークするしかなく、有効画素率は被加工物の凹凸に応じて大きく変動する。

42.1 多輪郭分割:3D Blob解析

2次元のBlob解析(チャプター 23)は「閾値分割+連結成分+特徴量計測」の3段階の処理である:まず画像を二値化し、次に白色の画素の塊を個々のオブジェクトとして組織して計測を行う。3次元検査の最初のツールは、これとほぼ逐語的に対応するものであるが、分割の根拠が「輝度が閾値を超える」から「高さ偏差が閾値を超える」に置き換わっている——これがまさに「多輪郭検査」の核心である:1枚の距離画像を高さが大きく異なる輪郭領域に切り分け、それぞれを個別に計測する。

具体的には、まず参照面(reference surface)を推定する——全画像の有効高さの中央値はロバストな基準となる(実測値 \(h_\text{ref}=-1.694\) mm であり、面積が最大の上台面にちょうど位置する。中央値は少数の高い特徴を持つ画素の影響を受けない)。次に画素ごとに偏差 \(\Delta h(x,y)=h(x,y)-h_\text{ref}\) を計算する;\(\Delta h\)\(+\tau\) を超える画素を「凸部候補」、\(-\tau\) を下回る画素を「凹部候補」に分類し、それぞれについて連結成分解析を実行する(凸部と凹部を分けることで、隣接する凸領域と凹領域が境界で誤って1つの塊に統合されるのを防ぐ)。許容誤差は \(\tau=0.35\) mm、最小面積は 1500 px(0.6 mm²)として、微細な異物を除去する。

3D輪郭が2D blobに比べて持つ追加的な特徴は、まさに高さがもたらす新たな判定基準である。各輪郭には、2Dの面積、重心、外接矩形に加えて、以下の量を計算できる:符号付き高さ偏差(平均値の符号により凸部 \(\Delta h>0\) と凹部 \(\Delta h<0\) を区別する。これは2D二値画像が本質的に失う情報である)、等価直径、および体積 \(V=\sum_{(x,y)}\Delta h(x,y)\cdot A_\text{px}\)\(A_\text{px}=0.02\times0.02=4\times10^{-4}\) mm² は画素面積であり、単位は mm³ である。この値は「この輪郭がどれだけの材料を突出または陥没させているか」を直接的に示す)。

実測により、この実際の距離画像から 5つの輪郭特徴 が分割された(表 42.1図 42.2):最も目立つのは中央の円台である——等価直径 11.76 mm、参照面からの高さ 7.15 mm、体積 776 mm³ であり、部品全体の幾何学的な中心的特徴である;下台面上の低い円台は等価直径 6.23 mm、高さ 2.22 mm である(外接矩形は 7.8×4.8 mm であり、やや長円形である);頂部の長円形の溝に囲まれた隆起した台座は面積 54.7 mm²、高さはわずか 0.47 mm である;そして部品全体の下台部は大面積の凹輪郭(247 mm²、平均 −0.89 mm)として正確に分離されている——これは約 1 mm の段差の低い側に相当する。

表 42.1: 多輪郭分割結果(参照面 \(h_\text{ref}=-1.694\) mm、\(\tau=0.35\) mm、最小面積 1500 px)
# 種別 面積 mm² 等価直径 mm 中心 (x,y) mm 平均 Δh ピーク Δh 体積 mm³
1 凸部 108.6 11.76 (16.3, 24.0) +7.145 +7.696 +775.9
2 凹部 247.0 17.74 (16.6, 37.3) −0.892 −3.868 −220.3
3 凸部 54.7 8.34 (15.9, 5.1) +0.465 +0.917 +25.5
4 凸部 30.5 6.23 (16.2, 41.9) +2.222 +2.428 +67.8
5 凸部 2.6 1.81 (16.0, 6.2) +0.367 +0.406 +1.0
図 42.2: 多輪郭分割結果(高さをグレースケールで表した元画像)。赤枠=凸輪郭(\(\Delta h>0\):中央の円台、低い円台、頂部の隆起台座)、青枠=凹輪郭(\(\Delta h<0\):下台部の段差領域)。中央の円台の上面にある2つの白点は、後節で検査する微小な凹点である。

ここから3D検査の根本的な利点が浮かび上がる:判定基準が物理量により近いことである。2D blobは面積や円形度といった画素ベースの幾何学量で分類を行うが、これらは解像度や視点によって変化する;一方、3D輪郭の高さ(mm)、体積(mm³)、等価直径(mm)はキャリブレーションされた真の寸法である(まさに チャプター 41 で強調された「3D計測は直接物理単位を得られる」という点である)。「円台の高さは7±0.1 mm、段差は1±0.05 mmでなければならない」という規定を、画素単位に翻訳することなくそのまま仕様書に記載できる——次元の統一により、規則書とアルゴリズムが同じ言語で記述されるようになる。

実際には、体積による判定基準は高さによる判定基準よりもロバストであることが多い:先端が鋭く高いバリ(高さが大きく、体積が小さい)と、浅く広い膨らみ(高さが小さく、体積が大きい)では、危害の程度が異なることが多く、高さだけを見ると両者を混同してしまう。高さと体積の二重判定基準を併用し——「高さがAを超えるか体積がVを超えたらNG」——とすることは、いかなる単一判定基準よりも「この輪郭が不良を引き起こすかどうか」という実際の問題に適合している。本件の中央の円台776 mm³と低い円台67.8 mm³の体積差は、直径差よりも両者の寸法の違いをより直感的に反映している。

42.2 断面測定

Blob分析は「輪郭がどこにあるか、体積がどれだけか」を回答するが、生産ラインではしばしば、より鋭い質問が求められる。ある指定された直線に沿って、表面の高さプロファイルは具体的にどのような形状をしているのか? これが断面測定(profile measurement / cross-section)である。距離画像上の1つの線分に沿って高さ系列を抽出し、1次元のプロファイル曲線を得る。これは3次元世界におけるノギスである(チャプター 20)。ノギスは探索線に沿ってグレースケール画像上でエッジを探し距離を測定するのに対し、断面は線に沿って距離画像上で高さを読み取り、段差や峰・谷を測定する。両者は同型である。どちらも2次元/3次元データを1本の線に沿って1次元に削減した後、古典的な1次元信号処理ツールで解析する。

実験では、高い円台と低い円台の両方を通る鉛直中心線 \(x=16.1\) mm に沿って断面を抽出した(図 42.3)。この線は、上台面、頂部の溝、持ち上げられたプラットフォーム、地から立ち上がった中央の円台頂部(頂面の2つの凹点による下向きの切り欠きを含む)、下台面向きに落ちる段差、そして低い円台へと上る、すべての段階を一気に通る。実測された断面には有効点が2054個あり、高さ範囲は [−6.562, 5.987] mm である。円台の頂上は5.987 mm\(y=22.2\) mm の位置)で、上台面(−1.668 mm)より7.66 mm高い。上台面と下台面の落差は段差高さ 0.988 mmである。これらはすべて 図 42.3 で明確に読み取れる。2本の水平な参照線が上台面と下台面を示し、中央の急激に持ち上がった高台が円台頂部(赤点が頂上を示す)であり、頂上の2つの下向きの鋭い切り欠きが後述する凹点であり、右側の半分の高さの小さな台が低い円台である。

図 42.3: \(x=16.1\) mm の鉛直中心線に沿った高さ断面(黒線)。左から右へ順に上台面、中央の円台頂部(頂上 5.987 mm、赤点)、段差、下台面、低い円台を通る。2本の水平線は上台面/下台面の参照線である。円台頂部の2つの下向きの切り欠きが頂面の凹点である。

特筆すべき点として、本章の3つのSDK 3D検査モジュールのうち、実測で使用可能な唯一のものが断面測定である。SciSv3DProfileMeasure::ExtractData は同じ線に沿って rc=02054個のサンプル点、Z範囲 [−6.562, 5.987] mm を返し、手書きで1行ずつ列を読み取った結果と点ごとに一致する。これは状態を持たず、単に「線に沿って読み取り+補間」を行うだけであるため、堅牢で使用可能である。断面の価値は「プロファイルを読み取る」ことだけにとどまらない。2.5次元データを線に沿って1次元に削減した後、チャプター 14 の1次元サブピクセルツール一式がすべて使用可能になる。頂上で放物線フィッティングを行えばサブピクセルの頂上位置が得られ、エッジモデルで段差の幅と勾配が測定でき、基線区間に直線フィッティングを行えば傾きが推定できる。断面は3次元データと古典的な1次元計測ツールをつなぐ架け橋である

断面線をどこに引くかはアルゴリズムの問題ではなく、工学的な判断である。欠陥の最深部を通る断面は最大偏差を与え、ワークの稜線に沿った断面は段差やエッジの崩れを検査し、キズに垂直な断面は溝の深さと幅を測定する。実務では、まず セクション 42.1 の輪郭重心を求め、次に重心位置に1本(または放射状に複数本)の断面線を自動的に配置して精密測定を行うことが多い。輪郭が「見つける」役割を担い、断面が「正確に測る」役割を担うという役割分担は、2Dにおける「Blobで位置決めし、次にノギスで精密測定する」という流れとまったく同じである。本章の中心線の情報密度が高いのは、まさにこの1本の線がすべての段階をつないでいるからである。

42.3 局所的な欠陥と表面品質

前2節では「どのような輪郭が存在し、それぞれの大きさはどの程度か」という問いに答えたが、検査にはさらに細かい側面がある。本来平坦であるべき面について、それ自体が平坦か、局所的な欠陥は存在しないかという点である。これにより、検査のスケールが「輪郭同士の間」から「単一の輪郭の内部」へと絞り込まれる。本節では中央の円台の上面を対象とする。この面は名目上は平坦な円形の台座であり、「唯一の正常状態を定義し、そこからのずれを定量化する」というパラダイムを最も純粋な形で実践する例となる。まず上面自体を「正常状態」として近似し、そこからずれた局所的な凹点を抽出する。

手法は2段階に分かれる。第一段階として、上面を基準平面に近似する。まず高さ閾値(\(z>1.5\) mm)を用いた連結成分処理により円台を抽出し、さらに内側に14回収縮処理を行って斜壁と縁部を除去する(清浄な内部の上面のみを残し、面積は96.85 mm²となる)。この領域に対して最小二乗法による平面近似を行い、\(z=ax+by+c\)を求める。近似された上面には約1.4°の治具による傾きが存在する(\(a,b=-0.0074,-0.0230\))。この傾きを除去した後、上面の残差の平面度RMSはわずか15.4 µmとなる。0.01 µmの量子化精度で高さ7 mmの円台の上面として、これは非常に平坦な面である。第二段階として、基準平面からずれた局所的な凹点を欠陥として標識する。残差が\(-0.25\) mmを下回る画素を「凹点候補」とし、連結成分ごとに統計を行う。実測では2つの凹点が検出された。1つは面積0.440 mm²、深さ644 µmであり、もう1つは面積わずか0.014 mm²、深さ818 µmである。図 42.4 は上面の残差を発散型カラーマップで示したヒートマップである(青=凹点、赤=隆起、白=基準平面に一致)。上面全体は白色が主体であり(実際に平坦であることの証明)、中央にある青い芯と赤い縁を持つ斑が0.44 mm²の凹点、その下方の黒い枠で囲まれた小点が0.014 mm²の微小な凹点である。上部にある白い空洞は、上面に存在するレーザーの反射がない深い穴である(無効画素であり、凹点には計上されない)。

図 42.4: 中央の円台の上面の残差ヒートマップ(治具による傾きを除去、発散型カラーマップ ±300 µm;青=凹点、白=基準平面に一致)。全体的に白色が主体であり、平面度RMSはわずか15.4 µm。中央の青い斑が0.44 mm²/644 µmの凹点、黒い枠が0.014 mm²/818 µmの微小な凹点。上部の白い空洞は反射のない深い穴(無効画素)。

本節では欠陥検出のパラダイムを論理的な極限まで推し進める。「正常状態」は図面上の公称値である必要はなく、データからその場で近似した基準平面であってもよい。上面の平面度RMS 15.4 µmと凹点の深さ644/818 µmは、次元が一致する2つの物理量であり、図面の公差に対して直接閾値を設定できる。前者は「この面は十分に平坦か」という問いに答え、後者は「傷は存在しないか」という問いに答える。本節、さらには検査編全体の方法論を一言で総括すると、欠陥の定義が、どのような量を用い、どのような基準に対してそれを測定するかを決定するということである。

SDKには「濃度/密度検出」(SciSv3DConcentrationDetection)という名前のモジュールが存在する。これは本来、統計的な欠陥を検出するためのものである。つまり、平均値は正常であるものの局所的な分散が異常な欠陥(つや消し面の局所的な研磨、塗膜のゆず肌、焼結部品の多孔質化など)を、高さ閾値ではなく局所的な高さの分散によって抽出する手法である。しかし本装置ではこのモジュールは何も出力せず動作しないセクション 42.5 参照)ため、本章では幾何学的な経路(残差の平面度 + 凹点)によって同じパラダイムを実演する。統計的な欠陥と幾何学的な欠陥の共通点は「まず正常状態を定義し、次にずれを定量化する」ことである。ただし前者の「ずれ」は分散に、後者の「ずれ」は高さに表れる。誤った尺度を用いれば、どれほど優れたアルゴリズムであっても、零誤差を精密に算出するに過ぎない。

42.4 検出限界と最小検出可能寸法

セクション 42.3 で検出された2つの凹点は寸法が大きく異なり、一方は0.440 mm²、他方はわずか0.014 mm²(約35画素、幅3–4画素)である。後者はこのシステムの検出限界に接しており、「どれほど深いか」ではなく「どれほど小さくなると検出できなくなるか」を問うている。

まず限界の性質を明確にする。2つの凹点はいずれも深さが600–820 µmで、天面の15 µmという平面度のノイズフロア(SNR約40)をはるかに超えているため、「検出の可否」は深さと無関係であり、真のボトルネックは横方向寸法と連結成分の最小面積の下限である。そこで凹点検出の最小面積 \(A_\text{min}\) を、深さ閾値を0.25 mmに固定したまま「厳しい」「標準」「緩い」の3段階で掃引した結果は以下の通りである。

表 42.2: 凹点検出の最小検出可能寸法(深さ閾値固定0.25 mm、最小面積を掃引)
設定 最小面積 検出凹点数 散在する小斑点(≥1 px)
厳しい 6 px 2 0
標準 25 px 2 0
緩い 200 px 1 1

この表は、合成データとは著しく異なり、かつより真実に近い結論を与えている。チャプター 26 の2Dの世界では、閾値のジレンマは「厳しくすると誤報、緩くすると見逃し」であり、閾値を厳しくするとノイズのピークが領域単位で閾値を超えてしまっていた。しかし、この高品質な実スキャンの天面は非常に清浄であり、最小面積を6 pxまで下げてもノイズの小斑点は一切誤報されなかった(虚警=0)。言い換えれば、ここには誤報と見逃しのジレンマは存在せず、片側の寸法下限のみが存在するのである。緩い設定(200 px)では0.014 mm²の微小凹点が完全に見逃され(検出数は1つのみとなる)、「最小でどれほど小さく検出できるか」を真に決定するのは0.02 mmという横方向分解能そのものである。幅3–4画素の凹点は、「単一画素の抜け落ちか、真の凹点か」の判別が困難になる境界にすでに迫っている。図 42.5 は2つの設定を並べて示しており、左図(厳しい設定6 px)では2つの凹点が両方とも枠で囲まれているのに対し、右図(緩い設定200 px)では中央の大きな凹点のみが残り、微小凹点の位置は空白となっている。

図 42.5: 検出限界:厳しい/緩い設定の最小面積の比較(中央円台の天面残差グレースケール画像、赤枠=検出された凹点)。左:厳しい設定6 px、2つの凹点がすべて検出され虚警は0。右:緩い設定200 px、0.014 mm²の微小凹点が見逃され、中央の大きな凹点のみが残る。上部の白斑は無エコーの深孔である。

整定方法は依然として チャプター 26 の「両端からの挟み込み」と同じ系統である。既知の最小の実欠陥を用いて検出を検証し上界(寸法下限)を求め、良品を用いて虚警を抑え下界を求める——ただし、この清浄なスキャンでは虚警が元々0であるため下界は緩く、ボトルネックはすべて上界(横方向分解能)にある。この寸法下限をさらに下げるには、面積閾値ではなく、横方向分解能の高いレンズと走査線ピッチの密な撮像方案に変更すべきである(チャプター 30 のセンサ選定は、まさにこの限界を広げるために存在する)。そして、この点で3D検査は2D検査にはない切り札を持っている。深さ判定基準は物理単位(µm)である——「凹点の深さは100 µm未満でなければならない」という基準は、装置間で再現可能な絶対的なプロセス量であり、照明や露光のドリフトの影響を受けないため、3Dの閾値整定は2Dのグレースケール閾値よりも安定し、移植性が高くなる。

実データの「検出限界」は多くの場合、アルゴリズムではなくサンプリングに存在する。58.7%もの無効画素(急峻な壁面/深孔での無エコー)が最初に直面する壁なのである。天面のその無エコーの深孔がその証拠である——これは欠陥ではないが、完全なデータの空洞であり、天面の平面度評価ではいずれも最初に除外しなければならない。3D検査エンジニアの最初の課題は多くの場合「どこにデータがないか」であり、次に「データが存在する箇所の判定が正確か」となる。

42.5 SciVision の実装

本章は、SciVision の 3 つの 3D 検出モジュールが本機上でこの実距離画像に対して動作した実測状態を忠実に記録する——これ自体が本書の方法論の最後の実践である:商用ライブラリのあらゆる約束は黄金実験を通過しなければならない

// 実距離画像の読み込み(Sci3DFileOperation.lib をリンク;rc=0 なら成功;
// 標準エラー出力に無害な "Directory does not exist." が出力される)
SciRangeImage ri;  SCIMV::Sci3DFileOperation fop;
long rc = fop.LoadRangeImage(SciVar("sample\\001.srt"), &ri, false);
double z = ri.GetValue(r, c) * ri.ResolutionZ();   // 生カウント×Z解像度 = 物理高さ mm
// 無効ピクセルは INT_MIN(-2147483648) でマークされる(急峻な壁/無反射)、明示的に除外する必要がある

// ① プロファイル測定(実測で使用可!線上から高さデータを抽出)
SciROI line;  line.GenLine(SciPoint(805,120), SciPoint(805,2380));
SCIMV::SciSv3DProfileMeasure pm;  SciFloatArray wz; /* ... */
rc = pm.ExtractData(ri, line, shield, 0, 0, &wxy, &ixy, &wz, NULL, &idxZ, &dist, NULL);
// rc=0, wz.Length()==2054, Z∈[-6.562,5.987]mm —— 手書きのプロファイルと1点単位で一致

// ② 3D Blob 解析(実測でサイレント:rc=0 だが blobs.Length()==0)
SCIMV::SciSv3DBlobAnalysis ba;  SciRegionArray blobs;  SciMatrix res;
rc = ba.BlobAnalysis3D(ri, roi, base, lo, hi, mn, mx, ft, rt,
                       false, false, &blobs, &res);   // rc=0, blobs=0, res 0×0

// ③ 濃度検出(実測でサイレント:rc=0 だが dst は 0×0 の空画像)
SCIMV::Sci3DConcentrationDetection cd;  SciImage dst; /* ... */
rc = cd.DetectConcentration(ri, roi, 0.05, 9,
         SCI_CONCENTRATION_FILTER_MEAN, 4, 4, &diff, &dst, &reg);   // dst 0×0

実測の結論は明確である:SciSv3DProfileMeasure::ExtractData使用可——指定された線分に沿って 2054 個のサンプル点を返し、Z 範囲は [−6.562, 5.987] mm であり、手書きのプロファイルと1点単位で一致する。3 つのモジュールの中で唯一、直接生産に使用できる 3D 検出プリミティブである。一方、SciSv3DBlobAnalysis::BlobAnalysis3DSci3DConcentrationDetection::DetectConcentration はいずれもサイレントで出力なし——戻りコードは rc=0(公称成功)であるが、前者の blobs は長さ 0、後者の dst は 0×0 の空画像であり、実質的な出力は一切ない。これは Part IX の複数の 3D モジュールにおける「サイレントで出力なし」の特徴と一致するため、本章の主要アルゴリズムはすべて手書きで代替する:高さ偏差の連結成分解析による多輪郭分割(セクション 42.1)、最小二乗法による頂面+残差による平面度と凹点検出(セクション 42.3)。サイレント/クラッシュのリスクを隔離するため、3 つの SDK モジュールはいずれもサブプロセスプローブ経由で呼び出される——メインフローはまず system() でサブプロセスを起動してプローブを実行し、その戻り値と出力を記録した後、手書きアルゴリズムを実行する。これにより、いかなる SDK の異常もメインフローを崩壊させることはない。この工学的姿勢自体が 1 つの結論である:現在の 3D 検出の SDK の成熟度は 2D よりも顕著に低く、ほとんどの検出演算子は依然として独自開発が必要である——これは驚くべきことではない。3D 検出は機械視覚の中で最も若い分野であり、標準化された演算子ライブラリはまだ形成途上にある。

なぜプロファイルは使用可で、blob と濃度はサイレントなのか?妥当な推測として:プロファイルは単に「線上の読み取り+補間」に過ぎず、状態を持たず外部リソースにも依存しない;一方、blob と濃度はセグメンテーションとフィルタリングの内部パイプラインを伴い、本機の複数の 3D モジュールと共通して「Directory does not exist.」というリソース不足の特徴を共有している(本書全体の Part IX の実測記録を参照)。根本原因が何であれ、工学的な対応は同じである——実測を基準とし、サイレントであれば独自開発する。

産業事例:精密構造部品の多輪郭オンライン検査

あるコネクタ・構造部品メーカーは、本章の対象と同様の多層射出成形部品に対し、レーザラインスキャンセンサを用いて全数のオンライン3D検査を実施している。検査項目は単一の欠陥ではなく、多輪郭寸法の一式である:円台高さ(7±0.1 mm)、段差量(1±0.05 mm)、低円台の直径、天面の平面度、および天面の凹点・異物の有無である。各項目は本章の3つのツールに対応している——高さ偏差に基づく連結成分で各輪郭を分離し、高さ・直径・体積を計測し(セクション 42.1)、中心断面で段差とピーク高さを計測し(セクション 42.2)、天面の残差平面度で局所的な欠陥を確認する(セクション 42.3)。真の技術的課題は2つある。1つ目は無効画素である——急峻な壁面や深い穴の部分ではレーザの反射波が得られず、全画素の58%にデータが存在しないため、すべての評価で「有効性マスク」を先に作成する必要がある。そうしなければ、データの空洞が深い凹みと誤判定されてしまう。2つ目は市販の3D演算器の性能のばらつきである——本章で実測した通り、断面計測は使用可能だがBlobや濃度演算は動作しないため、プロジェクトのスケジュールには「SDKの各演算器を1つずつ実測で検証し、使用不可なものは自前で開発する」ための予算を確保しなければならない。得られた教訓は以下の通りである:3D検査プロジェクトの第一原理は、まず「どこにデータがあるか」を問い、次に「判定の精度は十分か」を論じることである——これは2D検査ではほとんど考慮する必要のない、3D検査では避けて通れない課題である。

42.6 まとめ

  • 3D検査は「欠陥=正常からの偏差」というパラダイム(チャプター 26)に従うが、次元が物理量へと昇格する:輪郭は3Dにおいて、高さ(mm)、体積(mm³)、平面度(µm)といった2Dグレースケールでは不可視の次元を持ち、仕様書とアルゴリズムが初めて同じ言語で記述される。
  • 多輪郭セグメンテーション=高さ偏差しきい値+連結成分+物理特徴チャプター 23 の3D版):実際の距離画像から5つの輪郭が分離され、中央円台(直径11.76 mm/高さ7.15 mm/体積776 mm³)、低円台(直径6.23 mm/高さ2.22 mm)、段差0.988 mmがそれぞれ計測される。凸部と凹部を別々の連結成分として処理することで、誤った統合を防ぐ。
  • 断面計測は3Dのノギスであるチャプター 20):中心線に沿って2.5Dを1Dに還元することで、すべての層を1本の線でつなぐ。SciSv3DProfileMeasure::ExtractData は実測で使用可能であり、その2054点は手書きの逐点計算と完全に一致し、円台の頂点は5.987 mmであった。
  • 局所欠陥では「正常」をその場で基準面にフィッティングする:中央円台の天面の最小二乗平面度のRMSはわずか15.4 µmであり、残差から2つの凹点(0.440 mm²/644 µm、0.014 mm²/818 µm)が検出される——欠陥の定義によって、どの物理量を、どの基準に対して計測するかが決まる。
  • 実際の高品質スキャンにおける検出限界は、片側の寸法下限である:深さ600 µm以上の凹点は15 µmのノイズレベルをはるかに超えており、虚警のジレンマは生じない。0.014 mm²の微小凹点(幅3–4画素)は0.02 mmの横方向分解能に迫っている一方、58.7%の無効画素(反射波なし)が3D検査で最初に直面する壁となっている。

工業用3D表面検査のより体系的な解説(欠陥の分類、テクスチャと統計モデルを含む)については、Stegerらの著作 (Steger, Ulrich, と Wiedemann 2018) を参照されたい。本章の「欠陥=正常からの偏差」という自動光学検査のパラダイムは、距離画像・2.5Dに基づく検査手法とともに、NewmanとJainの自動視覚検査に関するレビューにおいて、歴史的・方法論的に網羅的に整理されている (Newman と Jain 1995)


ここに至り、全42章が最後のページを閉じる。我々は第1章のデジタル画像——光がセンサーによって格子状の濃淡値に標本化されること(チャプター 1)——から出発し、最終章の3次元検査——アルゴリズムが物理的な高さに基づき、高さ7 mmの円台、1 mmの段差、644 µmの凹部の良否を判定すること——に到達した。その間に展開されているのは、機械視覚の完全な1本のエンジニアリングチェーンである:撮像は情報の上限を定め、光で引き出せないコントラストやレーザーが到達できない急峻な壁面は、どれほど強力なアルゴリズムでも生み出すことはできない;前処理は後続のあらゆるステップの道を敷く;位置決め、計測、検査、認識がそれぞれの役割を果たし、画素を「それが何であるか、どこにあるか、どれほどの大きさか、良否はどうか」へと層を重ねて翻訳する;そして2Dから3Dへの移行は、これらすべてにさらなる次元を追加し、輪郭に高さと体積を与え、計測に現実のミリメートルを与えるのである。

しかし、この42章からたった1つの言葉だけを残すとしたら、それはいかなる具体的なアルゴリズムでもない。大津の手法はより優れた閾値処理法に置き換えられ、手書きで実装された連結成分処理はより高速な実装に置き換えられ、今日は無応答のSDKも明日は修正されるかもしれない。本書全体を真に貫き、携えていく価値のあるものは、エンジニアリング方法論である:物理を理解する——光、レンズ、センサーがどのように見えるものを決定するのかを知ること、それには反射波が全く存在しない58.7%の画素も含まれる;誤差を定量化する——あらゆる数値には誤差棒が伴うべきであり、15 µmの平面度は「非常に平ら」という2つの言葉よりもはるかに誠実である;不具合の限界を誠実に受け止める——無反射のデータ空洞、急峻な壁面を跨ぐ不感帯、無出力の商用ライブラリを、そのまま書き留めることは、それらを隠蔽するよりも百倍も有用である;そしてあらゆることを実験で検証する——依存する商用ライブラリを検証すること、特にそれを含めて、である。なぜならドキュメントは約束であり、既知の挙動に対する対照実験(断面は動作、Blobと濃度は無応答)だけが真実だからである。この方法論は2Dにも3Dにも属さず、特定のSDKやベンダーにも属さない;それは現実の生産ライン上でアルゴリズムに日々信頼できる判定をさせることを求められる、すべてのエンジニアに属するものである。

アルゴリズムは更新されるが、方法論は永遠に残る。これを携えて、より広い世界を見に行かんことを願う。