2007年中頃、「HALCON」という画像処理ツールを利用した部品検査システムを構築したいとお考えのお客様より、ソフト部分の開発のご依頼をソフテックにいただき、私はその担当者に選出されました。
ところが、ソフテックでは今まで「HALCON」を本格的に使いこなしたことは無く、それに関するノウハウがほとんど無い状況でした。そこで、まずは研究開発という位置付けでの学習から始め、画像処理技術を身に付けてから、お客様にご依頼いただいたソフトの開発に着手しました。(※1)
ここでは、その開発を通して学んだ、画像処理技術や、画像処理アプリケーション作成時の注意点などを、ご紹介いたします。
Windowsアプリケーション内で画像処理を実行するために使用したツールが、「HALCON(ハルコン)」です。開発元はドイツのMVTec社で、ライブラリ関数の組み合わせにより効率的に画像処理システムを開発でき、汎用性にも優れ、世界で高い評価を得ています。
日本国内では、
株式会社リンクスが販売を行っています。
以下、多数の機能の中より、私が実際に使用した事のあるものの一部をご紹介します。
(1) 2値化
基本的な処理で、1つ1つの画素を「明」と「暗」のどちらかに変換します。指定した値(しきい値)よりもその画素の輝度が高ければ「明」、低ければ「暗」となります。(図1)
この方法だと、1画素に収まる長さが精度の限界になってしまうので、輝度の変化率から境界を求め、1画素よりも細かい精度(サブピクセル精度)で2値化を行う方法もあります。
 |
 |
| 数段階のグレーで表現された画像 |
左の画像を2値化した画像 |
| 図1. 白黒画像の2値化 |
(2) 領域の特徴量解析
画像の2値化を行うと、隣り合った「暗」同士の集合ができますが、これを「領域」と呼んでいます。(図2)
また、領域の特性を示すパラメータとして、面積や高さなどがあり、これらのパラメータを「特微量」と呼んでいます。
 |
| 連続した領域ごとに色分けして表示させた状態 |
| 図2. 画像の領域 |
検査対象を撮影すると、機械の一部やホコリなど、対象外のものが画像内に映り、それも領域として認識されてしまい、アプリケーションはどれが検査対象なのかわからなくなってしまいます。そこで、人間が物を見分ける時にするように、その領域の様々な特徴を分析し、条件と一致する領域だけを取り出す必要があります。
HALCONがあれば、面積、高さ、幅、縦横比、円形性など、その領域の特徴量の解析を、関数をいくつか組み合わせるだけで実行でき、画像内にある検査対象の領域を特定できます。
(3) パターンマッチング
特徴量の解析により、予めモデルとして登録しておいた領域と似たような領域を、画像内から探し出すという機能が、「パターンマッチング」です。
例えば、複数の金属部品が映っている中から、ボルトを見つける事ができます。複数のボルトの中から、特定の規格のものを見つける事も可能です。
回転角やスケールの変化、一部の欠けなどの許容範囲を設定できるので、様々な画像に対応できます。不良品を検出したり、画像内の検査対象を発見したりするのに使えます。
(4) 検査範囲の絞り込み
工場の生産ラインに組み込まれる場合をはじめ、画像処理には、正確さや精度だけでなく、速度も求められる事が多くあります。
速度を向上させるために有効なのが検査範囲の絞り込みで、効果は行う処理内容や対象の画像によって異なってきますが、処理時間をある程度まで短縮できます。例として、画像の5分の1程を占めている金属部品の検査を行う場合に、常に画像全体に対して処理を行うと約100msになる処理時間を、部品周辺に検査範囲を絞り込む事で、30msに短縮できた事がありました。
(5) 各種補正
カメラによる撮影では、照明の不均等、レンズによる歪み、カメラの傾きなどにより、期待する画像を正確に得られない場合があります。
それらは大抵、HALCONが具備しているライブラリ関数による処理を2、3行追加する事で補正でき、理想に近い状態の画像に変換してから検査を行う事ができます。
(6) その他
画像の回転、移動、拡大・縮小、文字の表示、図形の描画などの機能も備えており、操作画面、結果表示画面の編集に役立ちます。
(1) 検査対象の製造と連動した画像処理
製造機械からシャッタートリガを出してもらう、というシンプルで確実に同期をとれる方法をとりました。アプリケーションは、画像が撮影され次第、計測からデータ送信までを短時間で行うようにします。これにより、機械側は検査を行いたいタイミングでシャッタートリガを出力するだけで、必要なデータをリアルタイムに得る事ができます。
(2) 画像処理設定
画像処理による検査は、対象や環境の変化の影響を受けやすく、精密な検査には各パラメータの調整が不可欠になります。例えば検査を行っている部屋が明るくなった場合、検査対象も明るく映り、2値化の境界がずれ、実際と異なる位置を輪郭として認識してしまう事があります。常に同じ対象を同じ環境で検査し続けるのがベターですが、なかなかそうは行かないと思います。
そこで、2値化のしきい値や検査対象の形状などを、アプリケーションの操作画面上で設定できるようにしておき、複数の規格の部品を様々な環境で検査できるようにしました。
(3) 長さの計測
2値化によって作成した領域を利用するというのは、ほとんどのケースで共通ですが、対象によって領域の処理方法は大きく異なってきます。やはり複雑な形状の部品ほど、検査プログラムも複雑になる傾向にあります。それぞれの案件に応じ、より早く正確な検査を行う方法を考案しなければなりません。
単純な長方形の検査対象であれば、その領域の高さと幅がそのまま対象の高さと幅になります。画像は単位が[画素(=pixel)]なので、1画素あたりの長さを計算し、計測結果の単位を[mm]に変換すれば、計測完了です。
精度はカメラとレンズの性能に依存するところが大きいのですが、私は最小分解能0.135μmでの計測を行った事があります。(※2)
(4) 画像処理結果表示
画像処理により計測した長さや、それに対する良/不良判定結果などを表示します。テキストだけでなく、検査した画像もアプリケーションの画面に表示させました。
必要であれば撮影した画像の中の対象部分を拡大表示させ、良品と不良品の境界を表す直線を引き、視覚的にわかり易くしたりもできます。(図4)
 |
 |
| 先端が2本の線の間にあれば良品と判定 |
| 図4. 結果画面イメージ |
(5) インターフェースの工夫
アプリケーションの性質上、工場で使用される事を考慮し、表示を大きく、操作をシンプルにするよう気を付けました。画像処理の設定などを行う機能があっても、必要な数値はできるだけ初期値で与え、起動さえしてしまえばその後は一切操作しなくても、製造機械と連動して検査を行える、というようにしました。