25 形状特徴
前章までの内容で、我々は「画像を数値に変換する」多くのツールを手に入れた。Blob解析は面積と重心を与え(チャプター 23)、輪郭解析は周長と円形度を与え、エッジ検出は位置と方向を与える。しかし、生産ラインの課題はこれらにとどまらない。蛇行するPCB配線の「長さ」や「幅」はどのように定義すべきだろうか。平均輝度が完全に一致する2つの表面のうち、一方は均一な合格塗膜、もう一方は点々が散らばった不良品であるとき、それらを区別する数値は何だろうか。基板の粗位置決めを行う際、「疎でありながら安定した」基準点はどこで探せばよいだろうか。本章では、それぞれ独立しているが、いずれも「形状を判定可能な数値に圧縮する方法」を提供する3つのツールを1つのツールボックスにまとめる。スケルトン(skeleton) は細長い構造から中心軸を抽出し、グレースケール・テクスチャ特徴 は表面の外観から統計的な指紋を抽出し、コーナー(corner) は幾何学的な輪郭からランドマークを抽出する。図 25.1 はスケルトン実験のテストシーンである——Y字分岐配線、L字配線、角穴を持つ塊の3種類で、いずれも幅5画素の細長構造、または細長/ブロック状構造を含む典型的なサンプルである。
25.1 スケルトン
二値形状の内部に可能な限り大きな円を配置し、常に境界に接しながら形状内を転がすと想像してほしい——これらすべての最大内接円の中心の軌跡が、形状の中心軸(medial axis)である。各中心に対応する内接円の半径を付加すると、中心軸変換(medial axis transform)が得られる。直感的に、中心軸は形状の「背骨」である。等幅の配線に対しては、中心軸は配線方向に沿った中心線そのものであり、内接円の半径はちょうど半幅となる。これは細長い構造の最も自然な記述方法である——2次元の「画素の塊」を1次元の「線に幅を加えたもの」に還元する。
中心軸は境界ノイズに非常に敏感である。境界上の小さな突起1つで、中心軸に余分な分岐が生じる。工学的な実装(細線化アルゴリズムを含む)では通常、チャプター 8 のオープニング・クロージング演算で事前に境界を平滑化するか、短い分岐の剪定(pruning)を行う。
工学的にスケルトンを計算する最も一般的な方法は細線化(thinning)アルゴリズムである。形状の境界から反復的に画素を削除するが、各削除が連結性を変化させないことを保証する——1つの形状を2つに分割したり、穴を消したりしない——最終的に1画素幅の中心線のみが残るまで処理を続ける。これは@sec-morphology で紹介したモルフォロジーアルゴリズムのファミリーに属し、出力は中心軸の離散近似である。
図 25.1 に対してSciVisionのスケルトンアルゴリズムを実行した結果を@fig-sf2-skeleton に示す。3つの形状から3本のスケルトン輪郭が得られた。シーン全体の前景は計17729画素であるのに対し、スケルトンは738画素しか残っていない——24.0倍の圧縮でありながら、細長構造のトポロジーと走向の情報は一切失われていない。右上の穴を持つ塊のスケルトンに注目してほしい。角穴を囲むように閉ループを形成しており、これは細線化の「トポロジー保存」特性が働いている証左である——形状に1つの穴があれば、スケルトンにも切断も収縮もできない1つのループが生じる。
スケルトンは構造化された曲線であり、その上の特徴点自体が工学的な意味を持つ。端点(endpoint) は配線の始点または終点であり、交差点(junction) は分岐点である。Y字配線のスケルトンから特徴点を抽出すると、3つの端点と1つの交差点が得られ、真値と完全に一致した。端点は(70, 51)、(120, 190)、(170, 51)に位置し、交差点は(120, 119)に位置しており、幾何学的な真値(120, 120)からわずか1画素の誤差である。配線検査において、これら2種類の点は「回路図」そのものである。端点数が一致しなければ断線を意味し、交差点数が一致しなければブリッジを意味する。
スケルトンの最も重要な応用形態は、単純な除算である。
\[ \bar{w} = \frac{A}{L}, \]
ここで\(A\)は配線の前景面積、\(L\)はスケルトン長(画素数)、\(\bar{w}\)は配線の平均幅である。シーン内のL字配線(設計幅はちょうど5.00 px)で実測すると、面積1313 px、スケルトン長257 px、平均幅は\(1313/257 = 5.11\) pxとなった。誤差はどこから来るのだろうか。スケルトン長は4連結の画素でカウントされるため、L字の角の部分では離散的なカウントが幾何学的な弧長よりわずかに短くなる(角が「近道」される)。分母が小さくなるため、自然と幅はわずかに大きくなる。2%の系統偏差は傾向監視には完全に十分であるが、絶対的な良否判定を行う場合は、弧長(対角ステップを\(\sqrt{2}\)でカウント)またはノギスによる測定でキャリブレーションすべきである。こうした離散化による偏差を正直に報告することは、「実測値=真値」と装うよりも工学的な価値がある。
スケルトンの代表的な用途を一覧にまとめる。
- 線幅検査:面積をスケルトン長で割って平均幅を求め、スケルトンに沿って各点で内接円半径をサンプリングして幅の系列を得る。
- 断線・ブリッジ検出:端点と交差点をカウントし、設計ネットリストと比較する。
- 経路計画と長さ測定:蛇行する配線、亀裂、繊維の「真の長さ」はスケルトン長である。
25.2 グレースケール・テクスチャ特徴
第2のツール群が答える課題は、「領域の表面の外観をどのように数値に変換するか」である。最初に思いつくのは1次統計量である——領域内の全画素のグレースケールヒストグラムを計算し、平均、標準偏差、エントロピーを求める。これらは計算コストが低く直感的だが、根本的な盲点がある。1次統計量は「どのグレースケール値が存在するか」だけを見て、「それらのグレースケール値がどのように配列されているか」を完全に無視する。
図 25.3 の4つの100×100テクスチャ領域は、まさにこの盲点を露わにするために設計された。均一なグレースケール140、高コントラストの市松模様(40/240の交互)、水平グラデーション(40→240)、ガウシアンノイズ(\(\mu=140\), \(\sigma=20\))——4つの領域の平均値はすべて約140(実測値は140.00 / 139.84 / 139.51 / 139.76)である。平均値だけでは、4つの領域は同一の領域に見える。標準偏差は多少の差をつけることができる(0 / 100.00 / 58.18 / 20.04)が、エントロピーを見ると、グラデーション領域は6.64、ノイズ領域は6.36とほぼ同じである。1次統計量の目には、「滑らかに遷移するグラデーション」と「乱雑なノイズ」は区別がつかない。両者のヒストグラムが広く拡がっているからである。
「配列」を見るには、画素対を見る必要がある。グレースケール共起行列(gray-level co-occurrence matrix, GLCM)は、指定された方向と距離(最も一般的には水平方向に隣接)において、グレースケール値\(i\)の画素の隣にグレースケール値\(j\)の画素が出現する頻度\(P(i,j)\)を統計するものである。これは隣接する画素対のグレースケール値の同時分布である。グレースケール値を少数のレベル(本実験では16レベル)に量子化すると、この行列は大きくないが、テクスチャの「配列の規則性」がすべてその中に書き込まれている。均一なテクスチャは対角線上の1つのセルにエネルギーが集中し、グラデーションテクスチャは対角線付近の狭い帯に集中し、ノイズテクスチャは行列全体に拡がる。\(P(i,j)\)から4つの一般的なスカラー量が抽出される。
- エネルギー(energy) \(\sum_{i,j} P(i,j)^2\):分布が集中するほど(テクスチャが単一で規則的であるほど)値が大きくなり、均一領域では1となる。
- コントラスト(contrast) \(\sum_{i,j} (i-j)^2 P(i,j)\):隣接画素のグレースケール差が大きいほど値が大きくなり、「局所的な反差」を表す。
- 相関(correlation):\(i\)と\(j\)の統計的相関係数であり、隣接画素同士が「互いを知っている」度合いを表す。
- 均質性(homogeneity) \(\sum_{i,j} \frac{P(i,j)}{1+|i-j|}\):分布の質量が対角線に近いほど値が大きくなり、「局所的な滑らかさ」を表す。
GLCMには方向がある。本実験では水平方向に隣接する対をカウントしている。等方性のテクスチャ(ノイズ、均一)では方向は重要ではないが、異方性のテクスチャ(傷、ヘアライン加工、本例の水平グラデーション)では、方向を変えると数値が完全に変わる——グラデーション領域を垂直方向でカウントすると、コントラストは0になる。工学的には、欠陥の既知の走向に応じて方向を選ぶか、4方向の平均をとる。
4つの領域の実測値の完全な表を以下に示す(平均・標準偏差は独自に計算。理由は@sec-sf2-scivision を参照。GLCMは水平方向、16グレースケールレベルで取得)。
| 領域 | 平均値 | 標準偏差 | エントロピー(1次) | GLCMエネルギー | コントラスト | 相関 | 均質性 |
|---|---|---|---|---|---|---|---|
| 均一140 | 140.00 | 0.00 | 0.00 | 1.000 | 0.000 | 0.000 | 1.000 |
| 市松模様 | 139.84 | 100.00 | 1.00 | 0.393 | 20.485 | 0.758 | 0.879 |
| グラデーション | 139.51 | 58.18 | 6.64 | 0.061 | 0.131 | 0.996 | 0.934 |
| ノイズ\(\sigma=20\) | 139.76 | 20.04 | 6.36 | 0.048 | 3.350 | −0.015 | 0.467 |
各行ごとに「なぜこのような特徴になるのか」を読み解いてほしい。均一領域は縮退した場合である。グレースケール値が1種類しかないため、エネルギー1、均質性1、コントラスト0となり、相関は分散が0のため定義されない(SDKは0を返す)。市松模様領域の特徴は高コントラスト(20.48で、表の最も小さい有意な値より2桁大きい)である。8 pxの正方形のため、水平方向に隣接する対の約1/8が白黒の境界をまたぎ、またぐたびに巨大な\((i-j)^2\)が寄与する。残りの7/8の対は同じ正方形内で同じグレースケール値を持つため、相関は0.758に達する——「反差は激しいが配列に規則性がある」ことを示す。グラデーション領域の特徴は高相関(0.996)と低コントラスト(0.131)の組み合わせである。水平方向に隣接する画素のグレースケール差は約2レベルしかなく、互いにほぼ完全に予測可能である——「変化は大きいが秩序だっている」ことを示す。ノイズ領域の特徴は低均質性(0.467で表中最小)とゼロ相関(−0.015)である。隣接画素は互いに独立しており、どちらも相手を予測できない。平均値が同一の4つの領域が、GLCMの4つの量でそれぞれ異なる位置を占め、明確に分離可能となる——これが2次統計量の価値であり、「配列」を数値に変換する手法なのである。
25.3 角点
第3のツール群は幾何学的なランドマークを探索するものである。角点が特殊である理由は、小さなウィンドウの「自己類似性」を用いて理解できる。ウィンドウを任意の方向に微小量だけシフトさせ、ウィンドウ内の内容がどの程度変化するかを観察する。平坦な領域では、どの方向にシフトしても内容はほとんど変化しない。エッジ上では、エッジに沿ってシフトしても変化はないが、エッジに垂直な方向にシフトすると大きく変化する——つまり「感度を持つ」方向は1方向のみである。これに対し角点では、どの方向にシフトしても内容が劇的に変化する——2つの独立した方向に強い勾配が存在するのである。Harrisコーナー検出器(Harris と Stephens 1988)はこの直感を、ウィンドウ内の勾配構造行列に対する固有値判定基準として定式化した。両方の固有値が大きい場合に限り、角点と判定される。
実験に使用したシーンは、L字形の六角形板(6つの直角を持ち、そのうち1つは凹角である)に、干渉物として角の半径が25 pxの角丸矩形を加えたものである。この角丸矩形には鋭角が全く存在しない。Harris法を用い、フィルタ比0.30で角点を抽出した結果を@fig-sf2-corners-a に示す。正確に6つの角点が検出され、真値と一対一で対応している。各角点と幾何学的な真値との距離はいずれも1.41 pxであり、一貫した\((\pm 1, \pm 1)\)のバイアスが生じている。このバイアスがこれほど整然としているのは偶然ではない。Harris応答は勾配構造が最も豊富な位置でピークに達するが、5×5の近傍(blockSize=5)で評価された直角の場合、このピークは角の内側の対角画素に安定して現れるのである。系統的なバイアスはキャリブレーションによって補償可能であり、真に精度を低下させるのはランダムなジッタである——この1.41 pxのバイアスは前者に属する。
フィルタ比を0.30から0.02に下げると、検出数は6から14に急増する(図 25.4 (b))。そのうち8つは角丸矩形の4つの角丸上に位置し、各角丸につき2つの「角点」が検出されている。これは見過ごされがちな事実を明らかにする。角点の「強度」は連続量であり、「角点であるか否か」は工学的な定義によるものである。角丸の位置では曲率はゼロではなく、両方向に確かに勾配が存在し、Harris応答もゼロより大きい——ただ直角よりは弱いだけである。閾値をどこに設定するかによって、「角点」の境界が定まる。これは@sec-edge_detection の閾値調整と同じ思想である。アルゴリズムが出力するのは応答マップであり、「判定」は常に人間がアルゴリズムに代わって行うものなのである。調整方法も同様である——既知の干渉物を含むサンプルで閾値を走査し、「真の角点を全て検出し、角丸は全く検出しない」安全区間を見つけ出す。
角点を見つけた後の用途は何だろうか。代表的なものは3つある。2~3個の安定した角点を用いたワークの粗位置決め(テンプレートマッチングよりもはるかに高速である)。キャリブレーション板の格子交点は本質的に角点であり、カメラキャリブレーションの入力となる。そして特徴マッチングのための特徴点としての用途である——チャプター 18 の特徴マッチングの内部的な最初のステップは、まさにこの「どの方向にシフトしても変化が生じる」点の検出である。
25.4 SciVision 実装
骨格はSCIMV::SciSvSkeletonによって提供され、2つのインタフェースを組み合わせて使用する。
SCIMV::SciSvSkeleton sk;
SciContourArray arr;
sk.Skeleton(src, roi, &arr); // 細線化 -> 骨格輪郭の配列
SciPointArray ends, juncs;
sk.ExtractJunctions(arr[i], &ends, &juncs); // 単一輪郭の端点/交点SkeletonはROI内の各連結形状を細線化して骨格とし、輪郭配列として出力する。この関数は分岐点で分割を行わない点に注意が必要である。Y字形の配線の骨格全体は1本の輪郭となり、3本の枝には分割されない。これは意図的な工学的設計である。分割するかどうか、どこで分割するかはExtractJunctionsが決定する。この関数は単一の骨格輪郭を受け取り、端点配列と交点配列を出力するため、呼び出し元は必要に応じて交点で分割を行うことができる。「細線化は細線化、解析は解析」という2段階の構成により、1つのAPIで長さのみを必要とするユーザーと完全なトポロジーを必要とするユーザーの両方に対応できる。
グレースケール特徴はSCIMV::SciSvGreyFeatureによって提供される。
SCIMV::SciSvGreyFeature gf;
double ent, aniso;
gf.GetEntropyGreyFeature(src, roi, &ent, &aniso); // 1次エントロピー + 異方性
double ge, en, corr, homog, contr;
gf.GetGLCMFeature(src, roi,
SCI_SV_GREYFEATURE_GLCM_DIRECTION_HORIZONTAL, // 方向:水平隣接ペア
16, // グレースケール量子化レベル数
&ge, &en, &corr, &homog, &contr); // GLCM エントロピー/エネルギー/相関/均質性/コントラストGetGLCMFeatureのgreyClass=16は量子化レベル数である。レベル数が多いほど行列は大きくなり、ノイズに敏感になるため、16は一般的なトレードオフ値である。方向パラメータの意味については、セクション 25.2 の傍注を参照されたい。古い落とし穴について注意を促しておく。SciSvHistogram::CaculateHistのstdValueはヒストグラムのビンカウントの標準偏差であり、グレースケールの標準偏差ではない。そのため本章の表に記載された平均値と標準偏差は、定義に従って独自に算出したものである。
角点はSCIMV::SciSvCornerExtractionによって提供される。
SCIMV::SciSvCornerExtraction ce;
SciPointArray pts;
ce.ExtractCorners(src, roi,
0, // method: 0 = Harris
5, // blockSize: 勾配構造行列の評価近傍
50, // maxnumCorners: 個数の上限
0.30, // filterRatio: 応答フィルタ比(本章の感度実験の主役)
10, // minDistance: 角点間の最小距離、同一角の重複検出を抑制
&pts);minDistance=10が、弱い閾値でも各角丸から「わずか」2つの検出しか得られない理由である——このパラメータがなければ、円弧全体に検出点が現れることになる。本章の全ての画像とデータを生成した完全なプロジェクトはcode/shape_features/に置かれている。
産業事例:フレキシブル基板の断線検出
あるFPC(フレキシブルプリント基板)の生産ラインでは、エッチング後に配線の健全性を検査している。当初の方案はブロブの連結性解析を用いたもので、配線が2つのブロブに分断された場合に断線として報告するものであった。この方法では「完全に分断された」場合しか検出できず、過剰なエッチングによって生じるくびれ(配線の一部が細くなるが断線はしていない状態)は全て見逃されていた——くびれのある部品は曲げ試験で一括して不良となっていた。改善案では骨格を導入した。各配線の骨格を抽出し、骨格に沿ってスライディングウィンドウで「局所面積 / 局所骨格長」を計算し、配線に沿った幅の系列を得る。健全な配線の幅系列は平坦であるが、くびれは系列上の明確な谷として現れる——幅の下限を設定すれば、半断線状態の配線を断線する前に検出できる。教訓は次の通りである。骨格は「2次元形状の健全性」を「1次元信号」に還元する。そして1次元信号上では、古典的な閾値、トレンド、SPCツールの全てが直ちに利用可能となる——次元削減は情報を失うことではなく、情報を古いツールが届く範囲に配置することなのである。
25.5 まとめ
- 骨格は細長い構造の中心軸である:細線化アルゴリズムはトポロジーを保存しながら(穴は閉ループとなる)境界を反復的に剥ぎ取り、17729 pxの前景を738 pxの中心線に24倍圧縮する。この過程で配線の向きやトポロジーは失われず、端点/交点は断線/ブリッジの判定基準に直接対応する。
- 幅 = 面積 / 骨格長は骨格の最も実用的なパラダイムである(実測値5.11 vs 真値5.00)。画素計数によって角の弧長が過小評価されることで約2%の系統偏差が生じるが、トレンド監視では無視でき、絶対的な判定にはキャリブレーションが必要である。
- 1次統計量は「配列」を見ることができない:平均値がいずれも140である4つのテクスチャ領域は、平均値とエントロピーだけでは完全に区別できない。GLCMは隣接画素ペアの同時分布をエネルギー/コントラスト/相関/均質性の4つの数値に変換し、各領域に固有のシグネチャを与える(市松模様=高コントラスト、グラデーション=高相関・低コントラスト、ノイズ=低均質性・ゼロ相関)。
- 角点の強度は連続量であり、「角点であるか否か」は工学的な定義による:filterRatio=0.30では正確に6つの角点が検出され、一貫した1.41 pxのバイアスが生じる(キャリブレーション可能)。閾値を0.02まで緩めると、角丸の干渉物から8つの誤検出が生じる——閾値調整は干渉物を含むサンプルで走査する必要がある。
- 3つのツールの共通点は圧縮である。画素の塊を1本の線、1つの分布、数個の点に圧縮することで、後続の判定ロジックが扱いやすい情報が得られるのである。
中心軸(medial axis)の元々の定義はBlumによる形状記述変換(Blum 1967)によるものであり、本章の骨格の理論的な母体である。GLCMテクスチャ特徴の古典的な出典は、Haralickらによるテクスチャ画像分類に関する基礎的な論文(Haralick, Shanmugam, と Dinstein 1973)である。Harrisコーナー(Harris と Stephens 1988)の同族であり、ワークの粗位置決めに広く用いられるShi–Tomasiコーナー判定基準は(Shi と Tomasi 1994)に記載されている。姿勢に依存しない形状記述子については、Huのモーメント不変量(Hu 1962)が長年にわたり古典として用いられている。骨格と中心軸変換の厳密な定義、およびGLCMテクスチャ特徴の体系的な工学的考察については、Stegerらの著作(Steger, Ulrich, と Wiedemann 2018)を参照されたい。




