2015年12月24日木曜日

第67回ImageJによるOpenCVの利用で学ぶ!

この記事は参考記事を援用して、筆者の考えも交えつつ、記述しています。


OpenCV(Open Source Computer Vision Libraryはその名のとおり、オープンソースのコンピュータビジョン用ライブラリです。もともとはインテル社によって開発されました。その後、ハードウェア/ソフトウェアの開発を行っているWillow Garageに開発が引き継がれ、現在はコンピュータービジョンの技術開発を手掛けるItseezによって開発が進められています。


今回はImageJでOpenCVを利用する方法をご紹介します。


OpenCVとは


OpenCVは、汎用の画像処理ライブラリで、同じような画像処理ライブラリは世の中に数多く存在しています。
プログラミングの初心者であってもC言語の基本的な知識で簡単に仕上げることができ、特に、コンピュータビジョンに応用する上では非常に使いやすいとされているのが特徴です。OpenCV関連の書籍も多く出版されているので、調べる資料も豊富です。

2015年12月現在の最新バージョンは3.1で、こちらに詳細が紹介されています。
http://www.buildinsider.net/small/opencv/001

コンピュータビジョンはコンピュータに視覚を仕掛けるといったニュアンスとして解釈でき、Webカメラをコントロールしてリアルタイムの動画像処理を行うなど、ユニークな処理が可能です。

コンピュータビジョンは特にゲームなどのエンターテインメントや仮想空間での自動車、飛行機のフライトシミュレーション、衝突シミュレーションなどでその技術が使われています。

ImageJにOpenCVをプラグインとして組み込むことによって、豊富なOpnCVの画像処理、コンピュータビジョンの機能を医用画像に応用できます。


OpenCVの主な画像処理機能について


プログラミングの詳細なテクニックは、別紙に譲り、OpenCVでは、"imgproc"にインクルードされている画像処理機能として、以下のようなものがあります。

  • ヒストグラム操作
  • 画像フィルタリング
  • 幾何学的変換処理(線形レジストレーションなど)
  • 画像変換処理(距離変換や濃淡操作)
  • 構造解析と形状記述子(ROI関連操作や輪郭抽出)
  • 平面再分割処理
  • モーション解析と物体追跡(OpenCVの強み)
  • 特徴検出
  • 物体検出
  • 画像のクラスタリングと多次元空間の検索
  • オブジェクト認識
  • ビデオ解析
  • カメラキャリブレーション、姿勢推定、パノラマ合成(Stitching)
  • 機械学習機能

(http://www.buildinsider.net/small/opencv/001)

OpenCVのダウンロードサイトはこちらです。



OpenCVの実装


ImageJでOpenCVを使用するためのプラグインのサンプルが次のサイトで紹介されています。

https://sites.google.com/site/qingzongtseng/template-matching-ij-plugin


インストール方法は簡単で、上記サイトから以下のすべてのjarファイルをダウンロードしてプラグインフォルダにコピーして利用できます。

  • Template_Matching.jar
  • javacv.jar
  • javacpp.jar
  • opencv.jar

このプラグインを参考に、テンプレートマッチングを試した結果は、こちらの回をご参照ください。




今回は画像処理ライブラリの中でも定評の高いOpenCVをImagerJで利用する方法を示しました。このコラボレーションでもっと高度な医用画像を対象としたコンピュータビジョンが実現できそうですね。

次回は、バイオ系画像処理のためのImageJ利用法を紹介します。


参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(26・7) 2011, p106-107」

Visionary Imaging Services, Inc.は、イメージング技術サポートを通じて、創薬研究や医療機器開発など、臨床研究(臨床試験)サポートサービスを展開しております。OsiriXシリーズも販売中です!よろしくお願いします!

3 件のコメント:

  1. こんにちは。ImageJを研究で使っている者です。
    こちらのブログはいつも拝見させて頂いております。

    このエントリから、OpenCVのJava実装版であるJavaCVを見つけたので、利用しようとしております。

    そこで少し立ち入った質問です。
    OpenCVでの画像の取扱(IplImage)とImageJでの画像の取扱(ImageProcessor)が異なっており、うまく相互に変換したいなと考えています。

    今のところ、ImageProcessorを1次元配列に直し、これをCvMatのputメソッドに投げてからCvMatのasIplImageメソッドでIplImageに変換しています。

    この方法だと非常に非効率な気がするので、もっと効率的な方法をご存知だったりしますでしょうか?

    知っていたらでかまいませんし、エントリのネタにしていただいても構いませんので、ぜひお返事いただけたらと思います。

    返信削除
  2. コメントありがとうございます。

    すみません、
    JavaCVを利用される場合でも、Matオブジェクトに置きかえる必要があるので、
    記載いただいた上記の手順が効率的なように思えます。

    もっと効率的な方法、例えば、ImageProcessorConvertToIplImage(imagearray);的なメソッド(または逆のパターンなど)があればということでしょうか。

    なにか、ひょんなことからこのようなJavaのメソッドを見つけた時には、ここにコメントさせていただきます。

    今後ともよろしくお願いいたします。




    返信削除
    返信
    1. お早いお返事で助かります!

      やはりそうなりますよね。
      こちらでももう少し考えてみますね。

      ではこちらこそ、今後ともよろしくお願いします。

      削除