キャリパツール温故知新
キャリパーはエッジを見つけるためのツールで画像処理ライブラリとしてはあって当たり前のツールです。
そんな今更感のあるキャリパですが、使いようによっては非常に強力なツールになります。おもしろい使い方の紹介はいずれまた別の記事でやります。この記事ではキャリパのごく基本的なことをまとめます。
キャリパツールの動作
キャリパツールは、大きく分けて下記の3ステップで構成されています。
- Affine変換により検出領域を水平な長方形に変換します
- プロジェクション処理により領域内のデータをエッジ検出方向に垂直に加算し、1次元の配列データに変換します
- 1次元の畳み込みフィルタにより1次元の配列からエッジを検出します
もし、VisionProをお持ちでしたら、図解入りの詳しい解説は、VisionPro→ユーザーズガイド→計測→キャリパ→理論ガイドをご覧ください。
CVLの場合は、Vision Tool Guide→Feature Extraction Tools→Caliperのセクションです。
キャリパの精度はどこで決まるのか?
キャリパツールで精度に影響を与えるのは、1と3のステップです。
特に大きな差が生ずるのが、1のステップです。
高速で高精度なAffine変換処理
Affine変換はキャリパツールの中でも計算コストが大きく、画素の補完のアルゴリズムも高精度のものから、高速なものまで様々なものがあります。アルゴリズムの種類も多いですし、実装方法の工夫のしがいがある部分です。
Affine変換は、VisionPro/CVLの様々なツールの内部で利用される重要な機能で、たとえばPatInspect、PatMax(PatFlexアルゴリズム)などでも利用されています。そのため、精度、速度の改善は地道に続けており、VisionPro/CVLの7.0でもAffine変換処理の精度と速度を改善しました。
VisionPro/CVL 7.0より、キャリパの内部で使っているAffine変換の補間モードのデフォルトをBilnearAccurateモードに変更しました。最も精度が出るモードですがこれまでは計算速度との兼ね合いでデフォルトにしていませんでした。このバージョンからBilinearAccurateモードの最適化により、ほかのモードよりも高速に処理することが可能になり、一番高精度で高速なのでデフォルトとして採用されました。
ノイズの影響を受けにくい微分フィルタ
3の微分フィルタも、お仕着せのフィルタではなく、フィルタ幅や検出するコントラストを設定できます。検出したいエッジの特性に合わせてフィルタ幅を広げることで、細かなノイズの影響をよりうけにくくなります。
フィルタの幅というのは、下の表のように対象ピクセルを中央にして左右に広がるフィルタの形状になり、その片腕のサイズを「フィルタ幅(VisionProでは「ハーフサイズピクセルのフィルタ処理」という表記です。ちょっとわかりにくいですね。。)」と呼びます。フィルタ幅1の場合は、3x1サイズのフィルタになります。
フィルタ幅 | 対象画素 | ||||
---|---|---|---|---|---|
1 | -1 | 0 | +1 | ||
2 | -1 | -1 | 0 | +1 | +1 |
実際には上の表のような単純な微分フィルタではなく、フィルタの重みづけにガウス分布を使った微分フィルタを用います。単純なフィルタと比べて優れた平滑化特性を持っており、よりノイズの影響を受けにくくなっています。
キャリパツールその他の特徴
VisionProのCalperツールでは、更にスコア関数を独自に定義できます。
多数見つけたエッジ結果から、一番期待したエッジに近い結果を選び出す手助けになります。
エッジ検出は単純な手法のため、期待したエッジ以外のエッジ結果がノイズとして多数得られる傾向があります。
多数のエッジから簡単に求めたいエッジを見つけだすことができるのが、スコア関数です。
スコア関数は単純な1本のエッジと、エッジペアの双方に定義することができます。
キャリパツールの精度って実際のところどうなの?
Caliperツールは単純な1次元配列から微分フィルタを使って変化する点を見つけてくるというツールの特性上、PatMaxなどと比べるとそれほどサブ画素の精度は期待できません。対象物を動かさず机上の繰り返し再現性を評価すれば、1/10画素、1/40画素と立派な結果は出るかもしれませんが、実際に運用すると経験上1/2〜1/4画素程度出れば上出来なはずです。
安定した精度を得るためには
実際のCaliperの精度は、実は設定で大きく変化することが多いです。
領域の方向をエッジの方向ときっちり合わせることで、コントラストの高いエッジが得られます。
領域の高さ(プロジェクション長さ)を最適に取ることで、ノイズに対して安定したエッジ情報が得られます。プロジェクションの長さは対ノイズ性(安定性)と精度のトレードオフの関係にあります。プロジェクションを長くすると、多くのデータの平均値が1次元画像に変換されるのでノイズの影響を受けずに安定しますが、多くのエッジ情報を平均化してしまうため、平均的なエッジの位置を報告することになり、精度は下がってしまいます。
- エッジが並行している場合は、領域の高さを大きくとって(プロジェクションを長くとって)ノイズの影響を除去し、エッジを強調する
- エッジが並行していない場合は、領域の高さを低くして斜めのエッジ情報が鈍るのを防止する
- フィルタ幅を適切に調整する。エッジが急激に変化している場合は、2〜3、エッジが緩やかに変化している場合は、4以上
VisionProの場合は、LastRun.RegionDataに表示されるプロジェクション画像やそのグラフ、微分フィルタ後のグラフを簡単に見ることができ調整が容易です。