23 Blob解析
閾値処理(チャプター 7)は画像を白黒に変換するが、製造ラインが投げかける問題は「どの画素が白いか」では決してなく、「このトレイ上のチップ部品は何個あるのか」「どの部品同士が接触しており、再投入による手直しが必要か」「最大のblobはどれほどの大きさで、どこにあるか」といったものである。これらの問いに答えるには、まず「白い画素の集まり」を「個々のオブジェクト」に整理しなければならない——これがセグメンテーション後の最初のステップである。Blob解析(blob analysis)=連結成分抽出+特徴量計算+フィルタリングと分類であり、この3つのステップを合わせて、計数、選別、異物検出といった検査分野の大半の骨格を構成する。
本章では、実際の産業用サンプル画像1枚を用いて実験全体を進める(図 23.1)。Smart3の「Blob解析サンプルレシピ」から取得した画像で、濃色のフェルトトレイ上に表面実装チップ部品が散在し、金属端面が同軸照明下で高輝度に光っている。元画像は3840×2748のシングルチャネルグレースケールであり、本書の図に合わせてボックス型ダウンサンプリングで×4圧縮し、960×687に調整している。画面内には約24個の部品がさまざまな角度で配置されており、そのうち1組の端面同士が接触したペアと、視野下端で切り取られた1個の部品が含まれている。また、高輝度閾値下ではトレイのフェルト面に細かい散斑が多数生じる。我々の課題は、アルゴリズムに部品を正確に計数させ、接触ペアを抽出することである——その過程で遭遇するあらゆる落とし穴は、実際の製造ラインでも頻繁に見られるものである。
23.1 連結成分とラベリング
二値画像における「オブジェクト」は数学的に連結成分(connected component)と呼ばれる。これは一連の前景画素の集合であり、集合内の任意の2画素は、隣接する前景画素の連鎖を介して互いに到達可能である。重要なのは「隣接」の定義である——4連結(4-connectivity)は上下左右の4つの隣接画素のみを認めるのに対し、8連結(8-connectivity)は4つの対角方向の隣接画素も含める。
この一見些細な選択は、明確な結果の違いを生む。対角の1角のみで接触している2つの塊は、8連結下では1つのオブジェクトとなるが、4連結下では2つとなる。1画素幅の斜線は、8連結下では1本の完全な線であるが、4連結下では一連の孤立点に砕かれる。計数を行う際、連結性を誤って選択すると、計数値は系統的に多くなるか少なくなる。産業用ライブラリの標準設定はほぼ例外なく8連結である。これは、実際の対象をサンプリングした際の斜めの境界が、対角方向で自然に接続されるためである。
対角方向の接触は8連結下では1つのblobとしてカウントされる。本章後半で登場する接触ペアはこれとは別の問題である——それら2つの部品は物理的に端面同士が重なっており、画素集合が真に結合しているため、4連結でも8連結でも1つにまとまる。もう1つの古典的な規約として、前景に8連結を用いる場合は背景に4連結を使用する(逆も同様)。そうしなければ、閉じた8連結の曲線で囲まれた内外が8連結で連結されてしまい、トポロジー的に矛盾が生じる。
各連結成分を抽出して番号を付けるプロセスは連結成分ラベリング(connected component labeling)と呼ばれる。古典的な手法は2回走査する方法である:1回目の走査で行ごとに前景画素に仮のラベルを割り当てながら「どのラベル同士が実際に連結しているか」という等価関係を記録し、2回目の走査で等価なラベルを統合して最終的な番号を付ける。ランレングス(run-length)符号化に基づく実装はより効率的である。まず各行の連続した前景セグメントをランに圧縮し、次に隣接する行のラン間の連結関係を確立する。この手法の計算量は面積ではなくラン数にのみ依存する。SciVisionのSciRegionはまさにこのランレングス符号化された領域表現である:閾値処理は直接SciRegionを出力し、Blob解析はそれをSciRegionArrayに分割する——配列の各要素が1つのblobに対応する。図 23.2 は、本章のサンプルを輝度閾値\(T=80\)(グレースケール値\(\ge 80\)の高輝度画素を前景として保持)でセグメンテーションした結果である。部品は白色の前景となって明確に塊となるが、濃色のフェルト面からは1~数画素の散斑が数百個生じている。この画像——ノイズを含めたもの——が、以降のすべての解析の入力となる。
23.2 Blob特徴量
blob配列を取得した段階では、各blobは依然として「画素の塊」に過ぎない。分類を行うには、まずそれを数値として計測する必要がある——これが領域特徴量(region features)である。一般的に使用される特徴量は3つの系統に分類される。
大きさと位置。面積(area)は単純な画素数であり、最も計算コストが低く、最もロバストな特徴量である。重心(centroid)は座標の平均値である:
\[ \bar x = \frac{1}{A}\sum_{(x,y)\in R} x, \qquad \bar y = \frac{1}{A}\sum_{(x,y)\in R} y; \]
外接矩形(bounding box)は最小の包含矩形を与え、可視化や大まかな寸法確認によく使用される。
等価楕円(equivalent ellipse)。領域の2次中心モーメントから、その領域と慣性モーメントが等しい楕円を計算できる。その長半轴\(R_A\)、短半轴\(R_B\)、方向角\(\varphi\)は、領域の「伸長した姿勢」を要約する。2つの半轴の比から伸長度(anisometry)が定義される:
\[ \text{anisometry} = \frac{R_A}{R_B} \;\ge\; 1, \]
この特徴量は対象の位置と回転に依存しない。本章の実測値はこの点を最もよく示している:21個の単体部品はどの角度に回転していても、伸長度がすべて2.7~3.4の狭い範囲に集中する(部品の縦横比は約2.5∶1である)。一方、端面同士が接触したペアの伸長度は5.26まで上昇し、公称値のほぼ2倍となる——これが後でそれを識別するための重要な判定基準の1つとなる。
無次元形状量。円形度(circularity)は領域が円にどれほど近いかを測る指標であり、一般的な定義は
\[ c = \frac{4\pi A}{P^2} \in (0, 1], \]
であり、\(P\)は周長である。完全な円では1となり、細長いほど、また境界が粗いほど値は小さくなる。矩形度(rectangularity)は領域の面積とその外接矩形の面積の比であり、理想的な矩形では1に近づく。SciVisionのSciFeatureType列挙型はこの系統の特徴量を非常に幅広くカバーしている:面積、重心、外接矩形、等価楕円の\(R_A/R_B/\varphi\)、anisometry、circularity、roundness、rectangularity、さらにはHuモーメントや穴の数まで——本章の実験ではそのうち10個を使用する。
本章の実測から得られた教訓の1つ:SciVisionの矩形度(SCI_REGION_RECTANGLEDEGREES)は軸に平行な(正接)矩形に対して計算されるため、姿勢に依存する。同じロットの部品でも、正しい向きに配置されたものは矩形度が0.9に達するが、45°傾けたものは0.38まで低下する(軸に平行な外接矩形がほぼ正方形になるため)。したがって、ここでの矩形度は姿勢に依存しない判定基準として使用できない——その役割を担うのは面積と伸長度である。また、分母に周長を含む特徴量(円形度)にも注意が必要である:デジタル画像の周長は画素の境界に沿って計数されるため、小さな対象に対して系統的に過大評価される。
特徴量が非常に多い中で、どれを選ぶべきか? 3つの原則がある:解釈可能であること——誤判定が生じた際に、プロセスエンジニアに「なぜそうなったのか」を説明できること;対象間の差異に敏感であること——接触ペアと単体部品は伸長度でほぼ2倍の差があるため、使用する価値がある;ノイズと姿勢に鈍感であること——面積と伸長度は並進と回転に対して不変であるのに対し、外接矩形の幅・高さや軸に平行な矩形度は対象の回転に伴って変化するため、直接分類の判定基準として使用すべきではない。
23.3 フィルタリングと分類実験
ここでパイプラインを最後まで実行する。図 23.2 から何の制限もなく連結成分を抽出すると、479個のblobが得られる——その大部分はトレイフェルトの散斑である。最初のゲートは面積フィルタリングである:面積\(\ge 150\)のblobのみを保持することで、散斑の塊は速やかに除去され、部品サイズの連結成分が23個残る。2番目のゲートはignoreROIBoundary——ROI境界に接触するblobを除外する——であり、視野下端で切り取られた部品が除去され、22個が分類に進む。
なぜ境界に接触するオブジェクトを除外しなければならないのか? それらは視野によって切り取られているためである:半分しか撮像されておらず、面積も伸長度もすべて歪んでいる——信頼できない特徴量で分類を行えば、結果は必然的に信頼できないものとなる。正しい対応は「分類に全力を尽くす」ことではなく、このフレームではオブジェクト全体を見ることができないことを認め、次のフレームまたは隣接するカメラに委ねることである。これがまさにignoreROIBoundaryパラメータの工学的価値である:SDKがネイティブでサポートしており、1つのブール値でこの種の系統的な誤りをすべて排除できる。
分類規則では、2つの姿勢に依存しない特徴量のみを使用する:
- 面積\(\in [300, 1000]\)かつ伸長度\(\le 4.0\) → 合格単体(good);
- それ以外 → 異常(reject)——接触ペア、異物、または切り取られた残片。
面積の上限と伸長度の上限の両方を設定した理由は、接触によってこれら2つの量が同時に増加するためである:端面同士が接触したものは面積が単体の約2倍、伸長度も約2倍となるため、いずれかの判定基準で捕捉できる(相互に冗長であるため、よりロバストである)。結果は以下の通りである:
| クラス | 判定規則 | 検出数 | 備考 |
|---|---|---|---|
| 合格単体 good | 面積 ∈[300,1000] かつ aniso ≤ 4 | 21 | 実測伸長度 2.72~3.41 |
| 異常 reject | それ以外 | 1 | 端面同士の接触ペア:面積/伸長度ともに公称値の約2倍 |
図 23.3 は結果を元画像に重ね合わせたものである:合格単体には細い白い枠が付けられ、異常な接触ペアには太い白い枠に斜めの十字が付けられている。この図を注意深く読むと3つのことがわかる:散在するフェルトの散斑には枠が一切ない——面積フィルタの働きによるものである;下端で切り取られた部品にも枠がない——ignoreROIBoundaryにより分類前に除外されたためである;そして中央左の十字付きの太い枠が、21個の合格部品の中の唯一の異常——端面同士が接触した部品のペアであり、次節の主役となる。
23.4 搭接と合併
この一組の搭接素子は実サンプルに元から存在するものである:2つのチップ部品が端と端で重なり、金属端面が継ぎ目でつながっているため、二値化後には必然的に1つのblobに融合する。図 23.4 (a) は当該領域の二値図を8倍拡大したものであり、中央にくびれのある「折れ曲がった長棒」となっている。連結成分ラベリングはこれに対して無力であり、処理系はこれを1つのオブジェクトとして認識する。
融合したblobの特徴は誤判定のメカニズムを完全に露呈すると同時に、それを検知するための鍵も手渡してくれる:面積 1342 px(正常な単体部品の面積中央値は 637 pxであり、比は2.1)、伸長度 5.26(単体部品は約2.8であり、比は約2)。2つの姿勢に依存しない判定基準が同時に警報を発しており、これが前節でrejectと判定された理由である。計数の回復には、モルフォロジーよりも軽量な方法が存在する:面積商である。融合したblobの面積を公称単体部品の面積で割ると、\(1342 / 637 = 2.11\) となり、四捨五入すると 2 となる——これで一組の部品が正しく計上される。したがってフレーム全体の部品計数は \(21\ (\text{合格}) + 2\ (\text{面积商还原}) = \mathbf{23}\) 個となる(下端で切り取られて次フレームに持ち越された部品を除く)。
搭接は連結性の選択の誤りではなく、供給の必然的な結果である:バラ部品をばら撒くと、端と端が接する確率が常に存在する。ここで第1節の斜め接触との違いを強調しておく必要がある——斜め接触の一組の部品は画素集合が真に重複しており、4連結でも8連結でも融合してしまう。連結性を変更しても解決できず、特徴レベルで検知するか、機械的に再度ばら撒くしかない。
古典的な別の対策は腐食による分離である(腐食の原理は チャプター 8 を参照):搭接箇所は通常、狭い「くびれ」となっているため、数回の腐食で切断できるはずである。実験を行ったところ、実際の構造部品に関する教訓が得られた:これらのチップ部品は中実の明るいブロックではなく、「両端の明るい端面 + 暗い本体」という構造部品である——1回の3×3腐食は搭接のくびれを切断すると同時に、個々の単体部品の端面と本体の間も腐食によって切断してしまう。図 23.4 (b) は同じ領域を1回腐食させた後の拡大写真である:折れ曲がった長棒はきれいに2つに分かれるどころか、複数の破片に砕けてしまっている。代償はすぐに現れる:画像全体の部品サイズのblob数が 22から32に急増——計数は腐食によって破壊され、修復されていない。
工学的な結論は率直に述べる必要がある:実際の構造部品では、腐食による分離を盲目的に適用してはならない。合成シーンの接する円は中実の円盤であり、腐食は境界を削るだけできれいに分離できる;しかし、対象物の内部に明暗の構造(金属端面と本体、めっきと母材)が存在する場合、腐食は内部の「暗い継ぎ目」に沿って正常な部品まで引き裂き、計数と面積の両方を歪めてしまう。したがって実際の生産ラインでの堅牢な手法は2つのアプローチを併用することである:面積、伸長度などの姿勢に依存しない特徴で搭接を検知(rejectと判定して警報を発する)し、連結成分の個数ではなく面積商で計数を回復する。もし画素レベルで融合を切断する必要がある場合、距離変換に基づくウォーターシェッドセグメンテーションが盲目的な腐食よりもはるかに安全である——これは距離マップの「尾根」で切断するため面積を削らないが、実装とパラメータ調整の負担ははるかに大きくなる。
23.5 SciVision 実装
本章のパイプラインは3つのクラスが連携して実現される:SciSvThreshold が領域を生成し、SciSvBlobAnalysis が分割とフィルタリングを行い、SciSvRegionFeature が特徴テーブルを計算する。
// 1) 明るい閾値処理:グレースケール [80,255] の明るい部品を保持、dstRegionと二値図を同時に出力
SCIMV::SciSvThreshold th;
SciImage binImg; SciRegion fgRegion;
th.ManualThreshold(img, roi, /*lower*/80, /*upper*/255,
SCI_THRESHOLD_TYPE_WHITE, 0, &binImg, &fgRegion);
// 2) Blob抽出:抽出時に面積下限で散斑をフィルタリング + 境界に接するオブジェクトを除外
SCIMV::SciSvBlobAnalysis ba;
SciRegion mask; // デフォルト構成 = 全領域を許可
SciVarArray minV, maxV, ft; // 特徴区間フィルタリングの3つ組
ft.Append(SciVar((int)SCI_REGION_AREA));
minV.Append(SciVar(150.0)); maxV.Append(SciVar(5000.0));
SciVarArray fhF, fhMin, fhMax; // 空欄 = 穴埋めを行わない
SciRegionArray blobs; SciMatrix featM;
ba.BlobAnalysis(fgRegion, img, roi, mask, minV, maxV, ft,
/*fillHole=*/false, fhF, fhMin, fhMax,
/*ignoreROIBoundary=*/true, false, &blobs, &featM);
// 2') 代わりに、まず全て抽出してから BlobFilter で事後的に面積フィルタ(各ゲートで誰が除外されたか観察しやすい)
ba.BlobFilter(blobsAll, featAll, SCI_REGION_AREA, 150.0, 5000.0,
&featArea, &blobsArea);
// 3) blob配列に対して特徴を計算(面積、重心、外接矩形、伸長度、矩形度……)
SCIMV::SciSvRegionFeature rf;
SciVarArray feats; // 順次 SciFeatureType 番号をAppend
SciMatrix m;
rf.CalRegionFeature(blobs, feats, &m);いくつかのパラメータについて個別に説明する。ManualThreshold はグレースケール帯 [80,255] を使用し、SCI_THRESHOLD_TYPE_WHITE は「帯内を前景とする」ことを意味する——暗背景上の明るい対象物には最適である;最後のパラメータ dstRegion は工学的な利点であり、セグメンテーション結果が SciRegion 形式で直接 BlobAnalysis の最初のパラメータに渡されるため、二値図を経由して再度抽出する必要がない。BlobAnalysis の minValue/maxValue/featureType の3つの配列は、抽出時に適用される特徴区間フィルタを構成する(本例では散斑を除去するため面積下限のみを設定);ignoreROIBoundary = true は セクション 23.3 で述べた境界に接するオブジェクトの除外処理である。BlobFilter は事後的なフィルタリングを提供する——まず全集合を取得してから必要に応じて条件を厳しくすることで、パラメータ調整時に各ゲートが誰を除外したかを正確に観察しやすくなる(479 → 23 → 22 の数値はまさにこの方法で出力された)。なお、画像全体のROIには GenRect1((0,0),(W,H)) を使用する:右下隅は排他的端点であるため、\((W,H)\) を渡すことで画像全体をカバーでき、\((W{-}1,H{-}1)\) を渡すと最外列と最外行が漏れる。
記録すべき3つの落とし穴がある。1つ目は、CalRegionFeature が出力する SciMatrix の行列表記がドキュメントに明記されていないこと——本章の付属コードでは「どちらかの次元の長さが特徴数と一致するか」で自動的に向きを判定してから値を取得しており、移植時にはこの防御層を必ず保持する必要がある。2つ目は、矩形度 SCI_REGION_RECTANGLEDEGREES は軸合わせ外接矩形に対して計算され、対象物の回転角に応じて変動する(同型部品で実測0.38~0.93)ため、姿勢に依存しない判定基準として使用できない——姿勢不変の形状判定基準には伸長度を使用すること。3つ目は、SciSvBlobAnalysis などのいくつかのヘッダーファイルが無条件に DLL_EXPORTS を定義している(dllexportとして宣言されている)こと——これらの #include をdllimport形式のヘッダーの後に配置することで正常にリンクでき、実測で問題はない。
産業事例:バラ供給における搭接の手直し
あるSMDの受入検査ラインでは、振動フィーダでチップ部品を検査トレイにばら撒き、blob分析で各トレイの個数を計数して仕様を照合していた。部品密度が高くなると、2つの部品が端と端で搭接することがあり、二値化後に1つのblobに融合して計数が1つ不足し、システムが「部品不足」と誤警報を発してラインが停止していた——実際には1つも不足していなかった。調査の結果、誤警報フレームには常に面積が通常部品の約2倍、伸長度も約2倍の「大きなblob」が含まれており、これが搭接対であることが判明した。現場では当初、腐食で切断しようと試みたが、これらの「端面 + 本体」構造部品は腐食で砕けて計数がさらに混乱することがわかった。最終的な修正ではモルフォロジーを使用せず、2つのアプローチを併用した:面積と伸長度の二重閾値で搭接対を異常として検知し、振動フィーダに再度のばら撒きをトリガ(機械的に融合を解消)すると同時に、「部品不足」の判定基準を連結成分数から全前景面積を公称単体部品面積で割って丸めた値に変更した——搭接対の面積商は \(1342/637\approx2\) であり、不足していた1つが正しく補われた。導入後、誤警報はゼロになった。教訓:計数タスクでは「面積商」の方が「連結成分数」よりもロバストである——搭接はトポロジーを変えるが面積はほとんど変えない;また、実際の構造部品では腐食による分離は極めて慎重に使用する必要がある。
23.6 まとめ
- Blob分析 = 連結成分 + 特徴 + フィルタリングであり、「白い画素の集まり」を「計数可能なオブジェクト」に変換する標準的な3段階の処理である;連結性(4/8)の選択は斜め接触を1つと数えるか2つと数えるかを決めるが、物理的な搭接は画素集合が重複するため、連結性を変更しても解決できない。
- 特徴選択の3原則:解釈可能であること、対象物の差異に敏感であること、ノイズと姿勢に鈍感であること。面積と伸長度(anisometry)は最も堅牢な第一線の特徴である(本章の単体部品の伸長度は2.7~3.4で安定しているのに対し、搭接対は5.26に跳ね上がる);軸合わせ矩形度と外接矩形の寸法は回転に応じて変動し、周長に基づく円形度は小さな対象物には信頼できない。
- フィルタリングは分類の前提条件である:面積下限は植毛面の散斑を除去し、
ignoreROIBoundaryは視野で切り取られて特徴が信頼できない境界オブジェクトを除外する——本章の 479 → 23 → 22 の各段階はそれぞれの役割を果たしている。 - 搭接は供給の必然的な結果であり、腐食による分離は対象物に依存する:合成された中実の対象物は腐食できれいに分離できるが、実際の「端面 + 本体」構造部品は腐食で砕け(画像全体のblobが22→32)、計数は修復されず破壊される。堅牢な手法は面積・伸長度で搭接を検知し面積商で計数を回復するか、ウォーターシェッドに切り替えることであり、機械的には再度ばら撒く方法がある。
- Blob特徴は画素の「占有」のみを見て、境界の「形状の軌跡」は見ない——分類により詳細な輪郭情報が必要な場合は、輪郭分析(チャプター 24)に進むこと。
連結成分ラベリングのアルゴリズムの起源は、デジタル画像における逐次操作に関するRosenfeldとPfaltzの基礎的な論文 (Rosenfeld と Pfaltz 1966) に遡る——連結成分ラベリング、距離変換、さらにはスケルトンの初期形態がそこに記載されている;領域境界のトポロジー分析とランレングスによる抽出については、SuzukiとAbeの境界追跡アルゴリズム (Suzuki と Abe 1985) を参照されたい。連結成分ラベリングと領域特徴の教科書的な概説はGonzalezとWoods (Gonzalez と Woods 2018) に記載されている;領域特徴とモルフォロジーセグメンテーション(ウォーターシェッドを含む)に関するより体系的な工学的な解説については、Stegerらの著作 (Steger, Ulrich, と Wiedemann 2018) をさらに参照することができる。




