20  カリパー計測とサブピクセル位置決め

本章から、我々は正式に計測の領域に入る。前章までは「対象が何か、どこにあるか」に答えてきたが、計測章では「それはどれだけ幅があり、どれだけ離れていて、どれだけ真円か」に答える——つまり画素をミリメートルに換算する。チャプター 5 のキャリブレーションは縮尺率を与えるが、「画素でミリメートルを測る」にはまだ最後の一里がある。ミクロンオーダーの分解能を持つシステムで厳しい寸法判定を行うには、エッジ位置を1画素よりはるかに小さい精度で測定する必要がある。この最後の一里を踏破する標準ツールがカリパー(caliper)である。これは指向性を持つ1次元計測器で、ROI、探索方向、エッジ極性を与えると、探索方向に沿ってグレースケールプロファイルを抽出し、1つまたは一対のエッジを検出してサブピクセル位置と幅を直接出力する。本章では実際の工業用サンプル画像——Micro-USBコネクタの側断面金属組織像——を用いて、カリパーの3つの核心的な問題を逐一定量化する:サブピクセル精度はどこから来るのか、繰り返し性は何によって決まるのか、精密度と正確度はなぜ別々に検証しなければならないのか。

実験対象は 図 20.1 の通りである。2592×1944のグレースケール画像上、暗い背景の中にMicro-USBコネクタの側断面があり、明るい金属シェルの内部に一列の接触端子(pin)が立っている。各端子は明るい垂直の金属条(グレースケール値約240)で、両側は暗い背景(グレースケール値約70)となっており、コントラストが鮮明で境界が急峻である——これはまさにカリパーの本来の用途である:水平方向に探索し、端子の幅と端子間の間隔を測る。コネクタの組立良品率は端子の幾何的な均一性に大きく依存する。端子が太すぎる、細すぎる、または位置ずれしていると、挿入力の異常や接触不良の原因となるため、端子の幅とピッチ(pitch)はこの種の部品の重要寸法である。本章では隣接する2つの端子(端子A、端子Bと記す)を計測ターゲットとする。

図 20.1: 実際の計測対象:Micro-USBコネクタ側断面(2592×1944 グレースケール)。暗い背景中に明るい金属シェルと一列の垂直な接触端子があり、端子の幅は約33 px、間隔は約73 pxである。本章では中央部の隣接する2つの端子に対してカリパー計測を行う。

20.1 カリパーの動作原理

カリパーは チャプター 14 の探索線機構と同じ起源を持つ。ROI内で探索方向に沿ってグレースケールプロファイルを取得し、垂直方向に投影平均してノイズを抑え、プロファイルの一次導関数を求め、導関数の極値点で放物線補間を行ってサブピクセルエッジ位置を得る。エッジ点抽出器が「一連の点を出力し、ユーザーがそれを近似する」のに対し、カリパーは3つの点で異なる。第一に、それは本来エッジ対(edge pair)を対象としており、2つのエッジを位置決めして直接それらの距離、つまり幅を出力する。第二に、プロファイル上に複数の候補エッジが現れた場合、強度や期待距離などのスコアリングルールに基づいてエッジを選択するため、油汚れや傷による偽エッジに対して組み込みの耐性を持つ。第三に、その出力は計測値そのものであり、後処理は不要である。チャプター 13 との関係は一言で言える:エッジ検出は「画像内のどこにエッジがあるか」に答えるのに対し、カリパーは「エッジのおおよその位置がわかっており、それを正確に測りたい」場合の1次元特化版である——探索範囲が2次元の画像全体から1本の線に縮小されるため、速度と精度の両方が向上する。

「カリパー」の名は機械式測定器であるノギス(vernier caliper)に由来する。2つの爪で工作物を挟んで幅を読み取る。ソフトウェアカリパーはその仮想版であり、ROIが本体、2つのエッジが爪の接触点に相当する。ノギスはバーニアで目盛りを細分化するのに対し、ソフトウェアカリパーは放物線補間で画素を細分化する——思想は同じである。

まず計測結果を示す(図 20.2)。SciVisionのSDKカリパーによると、端子Aの左端はx=1003.42、右端はx=1036.15であり、幅は32.73 px。端子Bの左端はx=1076.68、右端はx=1108.92であり、幅は32.24 px。両端子の中心間隔(ピッチ)は73.02 px、端子Aの右端から端子Bの左端までの暗い間隙の幅は40.53 pxである。これらは画素領域での直接の読み取り値である。システムが\(s\) μm/画素にキャリブレーションされている場合、端子のピッチは\(73.02\,s\) μmとなる。このSDKのカリパーの近似線は常に垂直である(セクション 20.5 で詳述)ため、水平方向の距離を測っていることに注意されたい。端子はほぼ垂直であり(LinePointsLocatorで実測した傾きはわずか0.16°)、水平幅と垂直幅の差は小数点以下2桁目で現れる。

本章のSDK出力は画素の角点座標規約を用いている(整画素境界が整数、画素中心がx.5)。端子Aの左端x=1003.42は、第1003列と第1004列の間に位置することを意味する。異なるライブラリのサブピクセル結果を比較する際は、最初に座標規約を揃えなければ、見境なく0.5 pxの「誤差」が発生する。

図 20.2: カリパー計測結果(中央部の2つの端子領域、3倍拡大)。白い枠は2つのカリパーROI。各端子の左端は白線、右端は黒線で示されている(SDKで近似された垂直エッジ線)。端子Aの左端上の灰色の十字は、探索行ごとに抽出されたサブピクセルエッジ点である。

20.2 サブピクセル精度はどこから来るか

画素格子の間隔は1であるのに、なぜエッジを0.1画素以内で測れるのか?答えはエッジの物理的な本質に隠れている。実際の画像中のエッジは数学的なステップでは決してない。レンズの点広がり関数が鋭い物理的境界をぼかして勾配にし、画素が自身の受光面積で光強度を積分することでさらに平滑化される(チャプター 3)。デジタル画像に到達する頃には、エッジはすでに1から数画素にわたるグレースケールのスロープになっている。図 20.3 は端子Aの左端を8倍に拡大したものである。暗い背景から明るい端子までは一刀切りではなく、滑らかに遷移するグレースケール帯であり、その間の「半灰色」の画素がはっきりと見える。勾配こそが情報の所在である:エッジの真の位置は遷移帯の各画素のグレースケール値を連続的に決定する——エッジが右に0.1 px移動すると、遷移帯の画素のグレースケール値は比例して変化する。サブピクセル位置決めが行うのは、これら数個の半灰色の画素の具体的な値から連続的な位置を復号することである。

図 20.3: 端子Aの左端の8倍拡大。暗い背景(左)から明るい端子(右)までは硬いステップではなく滑らかなグレースケール遷移帯であり、サブピクセル情報はまさにこれらの「半灰色」の画素に担われている。垂直の破線は放物線補間で得られたサブピクセルエッジ位置(x=1002.96)である。

復号ツールは チャプター 14 で既に使用された放物線補間である(その最小二乗的な根源は チャプター 2 を参照)。プロファイルの一次導関数振幅の離散極値点とその左右の近傍\(g_{-1},g_0,g_{+1}\)に放物線を近似し、頂点オフセット\(\delta=\dfrac{g_{-1}-g_{+1}}{2(g_{-1}-2g_0+g_{+1})}\)がサブピクセル補正量となる。図 20.4 はこのプロセスを端子Aの左端に展開したものである。灰色の点は単一行(y=845)の元のグレースケールサンプルであり、センサノイズでばらついている。黒い折れ線は111行の投影平均後のプロファイルであり、スロープの輪郭はすっきりしている。垂直の破線は平均プロファイルに補間を行って得られたサブピクセルエッジ位置x=1002.91である。

図 20.4: 端子Aの左端のグレースケールプロファイル。灰色の点:単一行(y=845)の元のサンプルであり、センサノイズを含む。黒線:111行の投影平均後のプロファイル。垂直の破線:平均プロファイルに放物線補間を行って得られたサブピクセルエッジ位置(x=1002.91)。

補間式自体は閉形式である。精度の良し悪しは、それに与えるプロファイルがどれだけ綺麗かに依存する。端子Aの左端で行ごとにサブピクセルエッジを抽出すると、111本の探索行の位置の平均は1002.96 px、標準偏差は0.37 pxである——この0.37 pxにはセンサノイズと実際の工作物の幾何形状の両方が含まれる(セクション 20.4 を参照)。カリパーはこれら20本の探索行を1本の垂直線に統合して近似するため、単点推定のばらつきは\(\sqrt{N}\)平均によって抑えられ、最終出力の安定度は単一行よりはるかに優れる。これがまさに セクション 20.3 で定量化する主題である。

20.3 繰り返し性:計測の生命線

工業計測で最も関心のある量の1つは、同一の工作物を繰り返し測定したときの結果のばらつきの大きさ——繰り返し性(repeatability)である。精密度は「安定して測れる」こと(分散が小さい)を意味し、正確度は「正確に測れる」こと(平均が真値に近い)を意味する。生産ラインの判定ロジックは「計測値の変動が公差帯よりはるかに小さい」ことに基づいている。繰り返し性の悪いシステムは、平均値にバイアスがなくても、良品を不良品と誤判定したり、不良品を良品の中に混入させたりする。

正確に測れる vs 安定して測れる:正確度のバイアスはキャリブレーションと標準器で補正できるが、ランダムなばらつきは計測システム自体を改善することでしか抑えられない。計測器能力分析(GR&R)の経験則:計測システムの繰り返し性(しばしば±3σのばらつきとされる)は公差帯の1/10を超えてはならない。そうでなければ、計測誤差が判定の信頼性を著しく損なう。

実際のサンプル画像は1枚だけであり、モンテカルロ法に使用できるノイズの集合はない。そのため、ROIの微小移動で繰り返し性を再現する。カリパーのROIを端子方向に沿って上下に±8 px平行移動し(計17位置、毎回サンプリングされる探索行の集合がわずかに異なる)、4つの計測量のばらつきを集計する:

計測量 単回計測値 (px) 繰り返し性 σ (px, 17回のROI微小移動)
端子Aの幅 32.73 0.073
端子Bの幅 32.24 0.052
端子間隔(中心) 73.02 0.373
間隙の幅 40.53 0.362

両方の端子の幅の繰り返し性はいずれも0.05–0.07 pxである。これは数μm/画素の典型的なシステムに換算すると、0.5 μm以下の単回計測ばらつきに相当する。最も注目に値するのは単一行のばらつきとの比較である—— セクション 20.2 で探索行ごとのサブピクセルエッジのばらつきは0.37 pxと測定されたが、カリパーが20本の探索行を統合して近似すると、幅の繰り返し性は0.073 pxに低下し、単一行のばらつきの約1/5となる。これはまさに チャプター 2\(\sqrt{N}\)の法則である:\(0.37/\sqrt{20}\approx 0.083\)であり、実測値の0.073と同じオーダーである。複数探索行の投影/近似は、ほぼ無料の繰り返し性増幅器である——ROIをエッジに沿って長くし、探索行数を増やすと、位置推定の分散が比例して低下し、その上限はエッジが探索線に対してどれだけ垂直であるかによって決まる。

なぜ端子間隔と間隙のσ(0.37、0.36 px)は単一の端子の幅の約5倍も大きいのか?それらはそれぞれ2つの異なる端子、2つの独立したROIのエッジを減算して得られるため、両端の近似誤差は同一の端子の左右縁のように高度に相関しなくなり、ばらつきはほぼ独立して重畳されて増幅されるからである。これは複合量計測の一般則である:誤差は関与するエッジの数と独立性とともに増大し、ピッチを測ることは単一の幅を測ることよりも「デリケート」である。

20.4 精密度は正確度ではない

前節で測定された0.07 pxの繰り返し性は素晴らしいが、それは「測定が安定しているか」に答えているだけで、「測定が正確か」には答えていない。これが実際のサンプル画像と合成シーンの最も根本的な違いである。合成画像は真値を内蔵しており、直接バイアスを計算できるが、このコネクタのサンプル画像には認証された端子幅の真値は存在しないため、我々は精密度(precision)しか提示できず、正確度(accuracy)は提示できない。32.73 pxという数値を報告するときは正直でなければならない——その繰り返し性は0.07 pxであるが、それが真の物理的な幅からどれだけ離れているかは、この画像からは判定できない。生産ラインでこの環を補完する唯一の方法は、計量院によって寸法が認証された標準ゲージブロックを設置し、それを用いて画素の読み取り値を物理単位に固定し、システムバイアスを補正することである——これは チャプター 5 が強調する「キャリブレーションは縮尺率を与え、キャリブレーションは期限切れになる」と同じことである。

実データはまた、合成画像では見られない詳細を明らかにする。その0.37 pxの行ごとのばらつきはすべてがノイズではない。端子Aの左端の111行にわたるサブピクセル位置の最小値は1002.42、最大値は1004.59であり、約2 pxにわたっている——これはランダムなばらつきではなく、プレス成形された金属端子のエッジ自体にわずかなテーパと反りがある、実際の工作物の幾何形状である。カリパーの垂直直線近似は、このわずかに湾曲したエッジを代表的な直線に「押しつぶす」ため、0.37 pxにはセンサノイズと部品の形状の2つの成分が混在している。これは重要な工学的教訓である:すべてのばらつきをノイズとして扱ってはならない——ばらつきの中に部品の真の形状情報が隠れていることがある。端子が反っているかどうかに関心がある場合は、この残差を近似から掘り出して分析するべきであり、単に平均を重ねてそれを消し去るべきではない。

合成シーンでバイアスを計算できるのは、真値が我々によって書かれているからである。実際のサンプル画像は「未知の部品」を測定しており、真値がなければ精密度しか存在しない。これは欠陥ではなく常態である。生産ラインの計測の大部分は部品ごとの真値を持たず、標準器によるキャリブレーションと繰り返し性の監視というコンビネーションで信頼性を保証している。

ここから本章の実践的な指針が得られる:実際の部品でアルゴリズムを評価する際は、精密度と正確度を別々に報告する。繰り返し性は単一画像のROI微小移動、または同一工作物の複数回の撮像から直接測定できる。しかし、正確度には外部の標準器が必要である。両者を混同し——真値のないサンプルで「精度」について語ったり、理想的な合成画像のバイアスを実際の性能として提示したりすると、生産ラインの実態から乖離した結論に至る。

20.5 SciVision 実装

カリパーはSCIMV::SciSvCaliperによって提供されるが、このモジュールの現状については率直に説明する必要がある。マニュアル7.1節に記載された旧インタフェースはヘッダファイル内で#if 0により全体が無効化されており、実際に使用可能なのは現行のCaliper()である。実測によると、この関数にはドキュメントと一致しないいくつかの動作が存在する:極性パラメータはpolarity1=2の場合に限りエッジを検出でき、その実測上の意味は「探索方向に沿って暗から明へ」であり、ヘッダファイルのコメントとは正反対である。0または1を渡すと常にエラー122504007が発生する;エッジペアモード(edge2Idx>=1)では幅が全く出力されない(widthArrが常に0である);微分カリパーのmode=1は常に失敗する;また、近似されるエッジ線は常に垂直である(角度出力が常に90°である)。「カリパーで幅を測る」という本来の機能は、工学的に2回の片側エッジ呼び出しによる迂回実装で実現されている:単一の端子のみを含むROI内で、direction=2で左から右へ、direction=3で右から左へそれぞれ1回ずつ探索し(暗→明の極性がそれぞれ端子の片側にヒットする)、2本の垂直近似線のx座標の差が水平幅となる:

EdgeDirection dir;
dir.direction1 = direction;  // 2=左から右;3=右から左(2回の呼び出しでそれぞれ端子の両側にヒット)
dir.polarity1  = 2;          // 実測上唯一使用可能:探索方向に沿って暗->明(ヘッダファイルのコメントとは逆)
EdgeFilter filter;
filter.searchLineCount = 20; // ROI内に20本の探索行
filter.edgeWidth = 3; filter.projectWidth = 1;       // mode=0ではROI全体に対して既に投影されているため、これ以上大きくしない
filter.sensitivity = 30; filter.strengthThresh = 30; filter.strengthLimit = 255;
EdgeScoring scoring;
scoring.maxResultNum = 5; scoring.expectDist = 34; scoring.sortMethod = 0;
SCIMV::SciSvCaliper cal;
long rc = cal.Caliper(src, roi, region, /*mode カリパー*/0, dir, filter, /*trend*/0,
                      /*pattern 指定エッジ*/0, /*edge1Idx*/1, /*edge2Idx 片側エッジ*/0, scoring,
                      &avg, &widthArr, &scoreArr, &mxi, &mni, &pos1, &ang1Arr, &pos2, &ang2Arr);
double edgeX = 0.5 * (pos1[0].x + pos1[1].x);        // 近似線は常に垂直なので、両端点のx座標は等しい
// 端子幅 = max(e2,e3) - min(e2,e3);端子中心 = 2つのエッジの平均;ピッチ = 2つの端子中心の差

strengthThresh=30は1階微分の大きさの閾値である;expectDist=34はスコアラーに端子の期待される幅のスケールを伝える;edge1Idx=1, edge2Idx=0は1番目のエッジのみを取得し、エッジペアを形成しないことを意味する。セクション 20.1 の32.73 pxの幅は、端子Aに対するこの2回の呼び出しから得られたものである。実測上の重要な注意点:端子の左エッジの勾配はy∈[780,920]の範囲内でのみ強く安定しており、この範囲外では端子の先端/根元のコントラストが急激に低下し、カリパーがエラー122504007を報告する;ROIと探索帯はエッジが鮮明な区間内に収める必要がある——これは理想的な合成画像に対し、実際のサンプル画像が追加で要求する項目である。

LinePointsLocatorによる対照ルートの価値は3重である:エッジに垂直な真の幅を測定できる(SDKのカリパーは水平幅しか測定できず、傾きが大きいほど歪みが大きくなる);各探索行の副画素点をユーザーに返すため、行ごとのばらつきや真直度を自分で計算しやすい;さらにエッジの傾きも(端子Aでは実測0.16°)得られる。実装上の詳細として、垂直に近いエッジでは\(x = ay + b\)を近似するように変更し、FitLineの垂直点集合に対する不具合を回避している(チャプター 14):

SCIMV::SciSvLineLocator loc;
SciPointArray pts;
long rc = loc.LinePointsLocator(src, roi, region, /*strengthThresh*/30,
             /*direction 左->右*/2, /*polarity 暗->亮*/0, /*edgeWidth*/3,
             /*projectWidth*/1, /*edgeType 最良*/2, /*searchLineCount*/16,
             /*findPointType 1階微分*/1, &pts);
// ptsに対してx = a*y + bを自分で近似;ROI中心高さでの2本の近似線の距離 / sqrt(1+a^2) が垂直幅となる

商用SDKのカリパーモジュールにこのような癖があることは珍しくなく、その対策は チャプター 14 と同じである:生の出力から重要な量を自分で再計算し、実際のサンプル上でパラメータごとに使用可能な範囲を実測する。完全な実行可能プロジェクトはcode/caliper_measurement/に格納されている。

産業事例:公差0.01mmのガラス幅測定

あるカバーガラスの端面研磨ラインでは、撮像分解能5 μm/画素の条件下で幅公差±10 μmが要求されている——公差帯は±2 pxに換算され、1/10法則に従うと繰返し性は0.2 pxに達する必要がある。投影平均後のカリパーの単発繰返し性は約0.07 px(0.35 μm)であり、一見余裕があるように見えたが、量産データから別の敵が明らかになった:工場の昼夜の温度変動により鏡筒と架台が熱膨張/収縮し、測定平均値が1日で0.5 μmドリフトした——これは繰返し性のばらつきの5倍である。精密度が良いことは正確度が高いことを意味しない:ばらつきは「今日100回測定したときの差」であり、ドリフトは「朝と午後に1回ずつ測定したときの差」であり、後者は繰返し性の指標では捉えられないものである。最終的な対策は、ライン上に標準ゲージブロックを設置し、2時間ごとに再測定して縮尺係数をリアルタイムで補正することだった——測定器のキャリブレーションは測定の基盤であり、これは本章 セクション 20.4 で強調した「精密度は正確度ではない」という点と同じである。

20.6 まとめ

  • カリパーは定向的な一次元測定ツールである:ROI + 探索方向 + 極性によって問題を限定し、投影、微分、放物線補間によって副画素エッジを得る——これは探索線機構と根源を同じくし、「エッジの位置はわかっているが、正確に測りたい」という場面に特化した一次元ツールである。本章では実際のMicro-USBコネクタについて、隣接する端子の幅32.73 / 32.24 px、中心間隔73.02 px、ギャップ40.53 pxを測定した。
  • 副画素情報は勾配の中に存在する:レンズのPSFと画素の積分によりエッジが濃淡の斜め勾配にスミアされ、斜め勾配の画素値がエッジの位相を連続的に符号化する;実際の端子エッジを8倍に拡大すると鮮明な遷移帯が見え、放物線補間によって副画素位置がそこから復号される。
  • 繰返し性は測定の生命線であり、複数探索行による平均は最も安価な増幅器である:行ごとの副画素のばらつきは0.37 pxであり、20行を直線近似した後の端子幅の繰返し性は0.073 px(≈ 0.37/√20)に低下する。その機構は\(\sqrt{N}\)の法則である;複合量(ピッチ、ギャップ)は2つの独立したROIの誤差を合成するため、ばらつきは約5倍に増幅されて0.37 pxとなる。
  • 精密度は正確度ではない:認証された真値のない実際のサンプルでは精密度(0.07 px)しか得られず、正確度は得られない;正確度には外部の標準部品によるアンカーが必要である。行ごとのばらつきには、プレス加工された端子の真のテーパ(約2 px)も混ざっており、一律にノイズとして平均化してはならない。
  • SDKのカリパーモジュールに対しては実測に基づく態度を保つ:本版のCaliper()は極性の意味がコメントと逆であり、エッジペアが幅を出力せず、近似線が常に垂直であるため、工学的には2回の片側エッジ呼び出しで迂回する;また、サンプル上でエッジが鮮明な使用可能な区間を実測する必要がある(端子はy∈[780,920]の範囲内でのみ測定可能である)。LinePointsLocatorによる自分で近似するルートは垂直幅と傾きを提供し、より制御可能な対照となる。

エッジ位置決めの精度限界や各種副画素手法のバイアスと分散の解析については、Stegerらの著作における一次元エッジ抽出と精度評価に関する章をさらに参照されたい(Steger, Ulrich, と Wiedemann 2018)。副画素エッジ位置決めの古典的な起源の1つは、Haralickが面素(facet)モデルの下で2階方向微分の零点交差を用いたステップエッジ検出を行ったものであり、局所的な濃淡多項式からエッジの位相が解析的にどのように復元されるかが体系的に記述されている(Haralick 1984)。また、本章で繰り返し強調した「精密度は正確度ではない」という点や繰返し性・再現性(GR&R)の評価は、測定器能力分析の範疇に属する:AIAGの『測定システム分析』リファレンスマニュアルには、繰返し性、再現性、バイアス、線形性の標準的な評価手順が記載されており、本章のばらつきの数値を生産ラインの判定規範に接続するための権威ある根拠となっている(Automotive Industry Action Group 2010)