Re - ImageJで学ぶ!: 2015-11-01

2015年11月5日木曜日

第48回 ImageJの構成とWeb活用で学ぶ!

lmageJの構成を理解し、プラグインとして作動しているアプリケーションとJavaのライブラリそのものを利用したアプリケーションのソースコードの内容を見極めて、lmageJの機能をオブジェクトごとに拡張していくのがImageJの開発スタイルとして最も作業効率が高い方法であることは周知の事実です。しかしながら、lmageJで使用している関数やクラスは、膨大で各機能を拡張するための関数の相互関係が把握し難い場合が生じることも事実です。 

テーマはWeb活用ですが、ImageJのAppletについては前回(第47回)で触れているので、今回は、lmageJ全体の構成を整理し、ImageJ APIを見ていく手順について説明します。

ImageJ全体の仕組みの概要

次の図にImageJパッケージ“ij”のクラスダイアグラムを示します(lmageJの WebサイトのUMLクラスダイヤグラム:
http://rsbweb.nih.gov/ij/developer/diagram.htmlから抜粋)。その名の通り、この図にはImageJで定義されているクラスが描画されています。白抜きの矢印は、下位クラスであること、線の矢印は参照していることを示しています。


UML(Unified Modeling Language)は、オブジェクト指向分析・設計においてシステムをモデル化する際の記法を規定した言語(ビジュアル・ランゲージ)で、ソフトウェア開発において、これを学ぶことは開発者として必須要件になってきています。UMLで図を書く理由は、主に以下の3つの理由が考えられます。
  • プログラムを書く前に,俯瞰的な図で自分の考えを整理する.
  • 図でコミュニケーションする.
プログラマーがコードを書き、3000行、30000行とその量が増えると、すべてを記憶しておくことが難しくなり、無駄なコードを書いたり、不正確なコードを書いてしまったりするリスクがあります。UMLはこのような事態を避けるために、シンプルな図でクラスやメソッドの関係性を表現しておくことができます。

この図を見ると、クラスが四角枠で表現されていることがわかります。中央にImageJクラスがあり、その左側にAppletクラスがあります。この図から、Web(ブラウザ)上でImageJを動作させる方法の1つであるアプレットは、直接lmageJクラスからアクセスできることがわかります。

次に、画像データを取り扱うImageProcessorクラスを見ていきます。ImageProcessorクラスは、Javaの標準クラスのjava.lang.Objectクラスの拡張クラスです。


ImageProcessorクラスの中には、ImageProcessorクラスを親クラスとして、ByteProcessor、ShortProcessor、FloatProcessor、ColorProcessorクラスが収められており、それぞれ、8ビット(インデックスカラー、バイナリサブクラス含む)、16ビット、32ビット、32ビットフルカラーの型別に整理されていることがわかります。

実際の画像データは、単一の画像であるかスタック画像群かのどちらかに応じて、ImageProcessorかlmageStackオブジェクトに保存されます。これらのオブジェクトは、画像処理には使用されますが表示機能は持っていません。画像を表示する処理は、Frameクラスの拡張クラスであるImageWindowクラスを使うことになります。

というように、クラス間の関係性を考慮しながらプログラムが作成されていることが理解できれば、このようなプログラムを独自に拡張する場合でも、開発が効率的に行えることがわかります。このUMLはあくまでも概略図なので、実際にはもっと詳しい情報が必要になります。これが、APIドキュメントです。

ImageJ API


ImageJは、そのAPIドキュメントが公開されています。
http://rsb.info.nih.gov/ij/developer/api/

ImageJAppletクラスを例に見ていきます。


この画面は何を示しているかというと、画面左上には、パッケージというものが表示されています。このパッケージとは、開発時に作成された複数のクラスをまとめておくフォルダです。このパッケージを選択すると、その内容に含まれるクラスのみが画面左下のリストに表示されます。今の状態は、ijパッケージを選択して、ImageJAppletクラスを選択表示している状態です。

次に、クラスを変えてみます。
ImagePlusクラスで、内容の詳細となる画面右側を見ていきます。

一番上には、クラスの継承関係が示してあります。

(ijパッケージに、含まれていて、java.lang.Objectを継承していることを示している)

少し下を見ていくと、クラスの説明や関連クラスのリストなどがわかるようになっています。さらに下げていくと、フィールドサマリーがあります。
このフィールドサマリーは、ImagePlusクラスで利用する各種操作(メソッド)で必要な変数のリストです。プログラマーが任意に選択して利用できます。


次にもっと下をみてみると、コンストラクターサマリーがあります。
これは、ImagePlusクラスを初期化するときの方法のリストです。


さらに下を見ていくと、メソッドサマリーがあります。
これは、ImagePlusクラスに対して利用できる処理のリストです。処理の種別ごとにタブが設けられているので、メソッドが多いときはこのタブを切り替えて検索できます。


さらに下には、これらのサマリーの詳細が説明されていますので、より詳細な使い方を調べたいときに参照できるようになっています。

Java APIの見方・調べ方は、Javaの入門について書かれているサイトでわかりやすく解説されていますので、筆者もたまに読み返しています。


今回は、UMLによるImageJの全体の仕組みの概要と、ImageJ APIの見方についてご紹介しました!
次回、ImageJの最新の機能の説明を行います!

参考記事:「ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(24・6) 2009, p118-119」

第47回 ImageJとWeb技術で学ぶ!

lmageJはオープンソースコミュニティが育て上げた医用・バイオ画像の処理・解析ツールとして抜群の認知度と人気を有しています。その背景には、インターネットの普及とそれに伴うWeb上での技術の進化が関連しているようです。

近年では、クラウドコンピューティングやシンクライアント、リッチクライアントなどの言葉が至るところで飛び交っていますが、これが情報を整理し、スマート化していく流れの1つの方向を象徴しているようです。

今回は現在のWeb技術についてlmageJと関連づけながら説明をしていきます。

インターネットを利用した画像処理


インターネットの人口普及率は日本ですでに80%を超え、小学生からお年寄りまでが扱うツールとなっています。インターネットはコンピュータネットワークのうち、インターネットワークの中の1つで、地球上の多数の政府、学界、公共、私用のネットワークを相互接続したインターネットワークに接続されたコンピュータ間で、あらかじめ規定された決まりごと(プロトコール)を介して、相互通信をする大規模ネットワークシステムです。やりとりされるデータは、主にOSI参照モデルのTCP/IPと称されるプロトコールによって、ユーザーやサーバ間で伝送・翻訳されます。

さて、インターネット上での画像処理については、扱うデータのフォーマットが比較的軽い圧縮されたJPEGやGIFなどが現在の主流です。しかしながら、医用画像やバイオイメージングのデータはマトリックスや濃淡ビットの高い特別なフォーマットで扱うために、簡単にインターネットやWebのブラウザに埋め込んで、そのデータ解析を行うことができなかった背景があります。

特に、動画像、三次元および四次元画像は、間接的に高次の高速ワークステーションで加工した後に、FlashやQuickTime VRに変換してブラウザ上で表示するなど、あくまで「閲覧および参照」のための利用でした。

しかしながら、ここ数年でスーパーコンピュータクラスのサーバシステムが堅牢かつ安価で構築できるようになったことにより、ネットワークシステムは分散サーバシステムとシンクライアントの組み合わせで発表されるようになっています。

シンクライアント(thin client)は、一般的な説明として、アプリケーションプログラム(ソフトウェア)や機密性のある重要なデータなどを手元に蓄積しないディスクレスのクライアントのことを言います。シンクライアントコンピュータには、必要最低限な機能だけを搭載し(thin:痩せているという意味)、アプリケーションはサーバにアクセスして実行します。

図に一般的なシンクライアントシステムを示します。


(シンクライアントとサーバ:参考記事より引用)


医用画像システムの業界では、大量のCT画像を超高速なサーバシステムでボリュームレンダリングし、それをシンクライアントに返すような仕組みが紹介されています。シンクライアントの実行形式は、サーバベース型、ブレードPC型、仮想PC型およびネットワークブート型などがあります。

高速ネットワークシステムが可能となった今日では、サーバ上に作成した仮想ディスクイメージをクライアントPCが立ち上がったときにマウントしてブートする方式のネットワークブート型がクライアント側でCPUとメモリは使用するものの、サーバ側に大容量のハードディスクを持てるため、注目されています。


ImageJ周辺のWeb技術の環境


これまで、ImageJ上で操作できるさまざまな機能を紹介してきました。多彩な画像ファイルの入出力、画像処理、画像解析、ユーザーオリジナルな拡張コードプログラムの記入方法、DICOM通信、DICOMビューワ、各種三次元画像処理、動画像処理、データベースとの連携などなど、ほぼユーザが使いたいであろう機能はすべて網羅して紹介してきたつもりですが、それらはすべてスタンドアローンでコンピュータを使う場合を想定したものでした。

当然ながら、ImageJで最新のWeb技術も利用可能です。ImageJはJavaを用いているため、アプレットとしても利用することが可能です。

ImageJのアプレットバージョンであるImageJAのサイトはこちら。(http://fiji.sc/ImageJA

このImageJAのjarファイルまで任意のWebサーバーのhtmlにAppletタグでパスを設定すれば、通信が許可されているクライアントからブラウザー越しにImageJを操作することができます。
WebサーバにAppletとして埋め込んでいる例を、ImageJのApplet例ページから紹介します。http://rsbweb.nih.gov/ij/applets.html


(FireFoxで表示:Javaが有効になっているブラウザで表示してください)

次に、“JNLP(Java Network Launching Protocol API)”という特別なファイルをサーバ側に作成することによって、クライアントにそのファイル内容を送信して、クライアントからアプレットを実行できるようにする方法を示します。JNLPも前述の方法同様に、JNLPファイル内で指定されたアドレスのアプリケーションを実行しますが、ブラウザー埋め込み型ではないので、直接ブラウザーを介さないことが前述の方法との違いになります。

JNLPによるアプリケーションの起動は、Java仮想マシン内のサンドボックス上で起動しています。原理的には、アプリケーションのプログラム自体もダウンロードしているのですが、Java(JRE)の中で保持されるだけで、ユーザーからは見えません。よくあるCドライブのProgram Filesに保存するようなイメージでダウンロードしているわけではありません。煩雑なインストール設定は不要です。この辺りが、リッチクライアントと呼ばれる所以です。

よって、この方法では、.jnlp拡張子ファイルをクライアントにダウンロードして、そのファイルを起動することで、アプリケーションを起動します。

JNLPファイルは、Javaアプリケーションが含まれるjarファイルや、起動に必要な条件、起動パラメータなどが設定できるようになっています。JNLPを使った例として、ImageJのJava Web Startバージョン「ImageJ.jnlp」が公開されているので、紹介します。


ImageJ.jnlpの中身


ImageJA同様、Java Web StartをHTMLコードで指定することもできます
なお、JNLPで指定するJarファイルは、署名がされている必要があります。Jarファイルの署名は、Javaのkeytoolを使います。この方法も、前述のImageJApplet紹介Webページに解説がありますので、ご興味のある方は参考にされてください。

今回は、ネットワークシステムー般やWebに関連する技術の概要を述べました。この先、クラウドコンピューティングなどで注目される技術が、セキュリティ部分を含めて改善されていけば、ますますユーザが利用する端末はスリム化されていくでしょう。(まだまだ課題も多いようですが。)

次回も続けて、Web周辺のネットワーク技術を解説します。

参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(24・4) 2009, p88-90」

2015年11月4日水曜日

第46回 ImageJを用いたSQLデータベース接続入門で学ぶ!

lmageJは主に画像処理および画像解析を基本設計として採用されているため、過去に処理した解析結果やデータはユーザー自身で「Microsoft Excel」(マイクロソフト社製)などのサードバーティツールを用いてファイリングしなければなりません。このような面倒な作業を解決する1つの方法として、ImageJとデータベースエンジンを連携させることができれば、データ管理などが簡便になります。

今回はその入門編としてImageJとオープンソースのデータベースエンジンである“MySQL”との連携方法について解説します。


データベースについて


データベースという用語を聞く限りでは、なにやら難しい話をしているように聞こえがちですが、実は非常に単純な概念です。要は、エクセルのデータのように、あるルールに基づいて整理されているデータテーブルです。データテーブルをいっぱい用意して、それぞれの関係性を考慮したものがリレーショナルデータベースなどとも呼ばれます。

身近な例として、年賀状などのハガキを作成するとき、ソフトウェアに知人の氏名と住所などをデータとして保存しておくのと同じです。保存しておけばいつでも簡単に送付先を検索してハガキを作成することができます。

医療分野においては、商用の「FileMakerPro」(FileMaker社製)などが、非常に優れたユーザーインターフェイスおよび多彩な機能を持っており、データベースの専門知識やコンピュータそのものの知識がなくても簡単にデータベースをつくることができるようになっています。

近年では開業医自らが患者の症例データベースや画像管理システムなどを作成するマニュアル本なども出版されており、その認知と人気度は高いようです。

このようにデータベースソフトウェアは大変身近で便利なものです。 

一方でデータベースを難しく思う人も少なくありません。アプリケーション開発側の視点になると、柔軟でスマートなデータベースを設計するのはなかなか難しいことです。データベースを構築する際に、大抵は行き当たりばったりで構築していくために、非常に複雑かつ使い難いデータベースシステムになってしまいがちです。このあたりは、経験が必要になりますが、簡単な、シンプルな、データベースは、誰でも使えて汎用性も高いです。

ImageJとデータベースエンジンの連携は、基本的にJava言語のデータベース用API(JDBC)を介して構築することになります。データベースも、SQLというデータベース言語を使って構築することが要求されます。


SQLについて


SQLは、その元になった言語SEQUEL (Structured English Query Language)をIBM社が開発しており、その名前に因んで名付けられたデータベース言語です。

このSQLは、データのやり取りを管理するメネージメントシステムモジュールであるデータベースエンジンで利用されます。
データベースエンジンには、クライアントからアクセスがあればいつでも問い合わせ内容に応じて処理を返す常駐プログラムが実装されています。常駐プログラムとは、PC上のオペレーティングシステム(OS)が起動した後、ユーザに意識されることなく動作しているプログラムのことです。このようなサービスは別名で”デーモン”や”サービス”と呼ばれています。

ImageJでは、プラグインとしてMySQLなどの優れたユーザーインターフェイスを持つオープンソースのデータベースとの連携が紹介されています。
もちろん、JDBCのAPIに対応したエンジンであれば、商用・非商用関係なく使用できます。

ImageJのWebサイト(http://rsbweb.nih.gov/ij/plugins/mysql.html)で、Dimiter Prodanov氏(Leiden University Medical Center, Leiden. The Netherlans)のプラグインコードや、このプラグインをGUIから操作できるようにしたJaap Kokorian氏のプラグインが公開されています。

以下、これらのプラグインを使う方法を示します。


MySQLとImageJの設定方法


MySQLをPCへインストールする方法はインターネットでもたくさんのサイトで紹介されています。

以下、ImageJへの実装手順を示します。

Dimiter Prodanov氏プラグイン利用例

  • 最新版のMySQLをインストールする。今回は、「Mac OS X 10.10(x86, 64-bit),DMG Archive」ダウンロードして、pkgファイルを実行してインストーラに従ってインストールしました。このとき、後ほどMySQLを起動するために必要な、rootユーザの初期パスワードがポップアップで出るので、キャプチャやメモをしておきます。
  • JavaによるMySQLエンジンのコネクタをダウンロードする。今回はmysql-connector-java-5.1.37をダウンロードし、コネクタをしかるべき場所にコピーします。(for windows)”jar”ファイルをImageJフォルダ内のjre/lib/ext下にコピーする。(for mac)~/ライブラリ/Java/Extensionにコピーする。
  • MySQLを起動する。Macでは、システム環境設定にMySQLが追加されるので、その画面からMySQLを起動します。(今回はテストなのでMac起動時に自動起動するチェックを外しています)


  • MySQLを起動したら、ターミナルからMySQLにログインします。初回ログイン時は、「セキュアインストレーション」します。ユーザーのアクセス権などを設定しながらインストールの詳細設定ができます。ターミナルで以下のコマンドを入力します。

$ /usr/local/mysql/bin/mysql_secure_installation

このとき、パスワードを聞かれるので、メモしておいたパスワードを入力します。
そのあと、指示通りに操作していき、rootユーザの新しいパスワードを設定しましょう。(http://qiita.com/hkusu/items/cda3e8461e7a46ecf25d
  • rootユーザとしてログイン。以下のコマンドをターミナルに入力して、設定したパスワードでMySQLにログインします。
$ /usr/local/mysql/bin/mysql -u root -p

http://mysqlweb.net/category/3998126-1.html
  • DB作成。テストで"darea"というデータベース(DB)をMySQLの中に作ります。rootでログインした状態で以下のコマンドを入力します。(データベース名は任意の名前で大丈夫です。)
mysql> create database darea;

実行後
(Query OK, 1 row affected (0.01 sec))
  • DBへのアクセスユーザとパスワードの設定。以下のコマンドを入力します。
mysql> GRANT ALL PRIVILEGES ON darea.* TO root@localhost IDENTIFIED BY 'root'; 

("darea"の部分は、作成したデータベース名にします。)
  • DBのテーブル作成。データベースの中に、実際にデータを格納しておくためのテーブルというものを作ります。まず、使うデータベースを宣言します。

mysql> USE darea;

(databaseがチェンジされます。)

次に、テーブル"config"を作ります。

mysql> CREATE TABLE config (id int, name text);

(単純に、IDと名前の配列としました。)

  • ImageJプラグインフォルダへMySQL_Plugin.javaファイルをコピーして、MySQL_Plugin.javaファイルをImageJで開き(ドラッグ&ドロップ)、上記のDBとテーブルに設定を合わせます。合わせたら上書き保存します。

(上述の操作に合わせたプラグインコードの設定)
    private String database  = "darea";
    private String dbHost  = "localhost";
    private String dbTable = "config";
    private String dbUser="root";
    private String dbPass="root";

  • PluginsからMySQL_Plugin.javaをコンパイル&ランする。下記、成功時のLogウィンドウが出ればOK)


(コネクト成功時のログ)

Jaap Kokorian氏プラグイン利用例

このプラグインはImageJで作ったResultsテーブルをMySQLのテーブルとして登録し、値を格納します。
  • MySQLの設定は上述のものと同じです。MySQL上でテーブルを作らなくても大丈夫です。
  • ij_mysql.zipを解凍し、フォルダごとPluginsフォルダにコピーして、ImageJを起動します。(内容にmysql-connector-java-5.1.13-bin.jarが含まれています。)
  • "Results Table to MySQL"を実行して、設定画面でDB、ユーザ、テーブルの指定をします。
(table欄には任意の名前を指定します。もし同じ名前のテーブルがMySQLにすでに存在していれば、上書きされます。)

次の図に、Jaap Kokorian氏プラグインに含まれる"mySQL test"の実行結果を示します。(設定は上述のものと同じです。)

自動でサンプル画像の全特徴量のテーブルがResultsテーブルとして現れます。
(サンプル画像のResultsテーブル)

(OKボタンでMySQLへ転送した後のログ)

無事に格納されたようなので、MySQLでも確かめてみます。
もし、一旦MySQLを落としてしまっている場合には、上述の手順で再度立ち上げて、パスワードを入力して、データベースの指定(mysql> USE darea;)まで行い、以下のコマンドを入力します。

mysql> SHOW TABLES;

(上述の手順で作成した二つのテーブルができています。)

そのまま、fiji_resultsテーブルの中身をみてみます。

mysql> SHOW COLUMNS FROM fiji_results;

(上述のResultsテーブルの中身が格納されていることがわかります。)

おわりに


今回は2つのプラグインを使って、ImageJのプラグインから、MySQLへデータテーブルの入力を行う手法を示しました。Dimiter Prodanov氏のプラグインを元に、MySQLのJavaコネクタ(Connector/J)を使って、削除、挿入、ソートなど、自在にコーディングが可能なはずです。もっとJDBCに詳しくなれば、もっとインタラクティブな操作も可能になるでしょう。

今回はSQLなどの文法などには詳しく触れることができませんでしたが、多くの書籍が出版されているので、図書館で調べてみてはいかがでしょうか。

今回はMySQLをいちからインストールしましたが、Webアプリケーション開発の時などは、MampやXampなどのパッケージソリューションを使うのも手段の一つです。

また、いろんなソフトがありすぎてというギークな人は、homebrewなどのパッケージ管理ソフトもオススメです。

次回もImageJと連携したAPIなどについて述べます。

参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(24・3) 2009, p120-122」

2015年11月3日火曜日

第45回 ImageJを用いた動画像処理プログラミングで学ぶ!

前回は、lmageJを用いたビデオカメラなどの映像信号のリアルタイムな取り込み方法について説明しました。今回は、取り込んだ映像を動画ファイルとして入出力を行う方法について説明します。動画像フォーマットとしては、WindowsユーザーおよびMacユーザーではなじみのあるAVIフォーマットとQuickTimeフォーマットを扱います。単に動画像ファイルを表示し、保存するだけではなく、ユーザーオリジナルのプラグインプログラムを作成する方法についても説明を行います。


ImgageJにおける動画像フォーマットの取り扱い


ImageJの連続画像処理方法については以前に本連載で説明をしてきましたがImageJでは、汎用の動画ファイルを簡単にフレームごとのスタックとして表示することが可能です。

ImageJでは、基本機能としてQuickTimeフォーマットの入出力に対応しており、Macユーザーにとっては「QuickTime」は互換性が良く扱いやすいと言えます。QuickTimeは現在ではWindows環境でも広く使われていますが、Windowsで使用する場合は、アップル社のWebサイトから「QuickTime for Windows」のインストーラをダウンロードする必要があります。一方、AVI(Audio Video Interleaving)フォーマットは、マイクロソフト社が開発したWindowsで音声付きの動画像を扱うためのフォーマットで、ImageJの基本機能の中にもこのフォーマットを入出力するためのプログラムが用意されています。


動画像処理プラグイン


QuickTimeフォーマットとAVIフォーマットを入出力するためのプラグインはいろいろなものが紹介されていますが、ユーザーが改良を加えられるという点を重視すれば、Wilhelm Burger氏によって開発されたサンプルプラグインコードが大変便利です。

(プラグインの内容)

Webサイトに書かれている通り、プログラムだけが紹介されているので、ユーザー側で簡単にアレンジできます。プラグインを動かすための準備段階として、JMF(Java Media Framework)をインストールする必要があります。

今回はMacと、32-bitのImageJ(ImageJに最初から含まれている32bit起動App)で試していきます。

まず、サイト(http://staff.fh-hagenberg.at//burger/imagej/)からMovieIO.zipをダウンロードして解凍し、通例通りImageJのpluginsフォルダにコピーします。

次に、JMFをインストールします。
MovieIOファイルの中には"jmf.jar"が含まれています。このjarファイルを、~/ライブラリ/Java/Extensionにコピーします。JMFは、特にAVIファイルの入出力のために使用します。

Macの場合、MacJava(~/システム/Java)とオラクルJava(~/ライブラリ/Java)がありますが、後者へのインストールだけで大丈夫です。

また、QuickTimeの入出カの準備として、QT Java.zip(解凍して)とlibQTJNative.jnilibをjmf.jarと同じところにコピーしておきます。ダウンロードはこちら。(http://imagej.nih.gov/ij/download/qt/

これで準備完了です。
インストールが完了しているか、確認してみましょう。
32ビットのImageJを起動して、Pluginsのコンパイルアンドランから、JMF_Test.javaとQT_Test.javaをそれぞれ起動してみます。

無事に両方インストールできていれば、以下のようにログが表示されます。

(JMF_Test実行結果)
※2015/11現在。Macでの動作確認はまだ検証の余地がありますので、QTを推奨します。その他のOSでは、JMFで問題ないと思われます。

(QT_Test実行結果)

ここから、QT_MovieReaderDemo.javaのコードをみながら、アルゴリズムを読解してみます。
デモコードは次の通りです。

(QT_MovieReaderDemo.java)

サンプルコードをみながら、かなり簡単に動画像フォーマットの画像処理のプラグインコードを記述できそうな気がしてきます。このデモコードでは、インポートするクラスライブラリとして、次の3つを指定しています。


  • import movieio.MovieReader;
  • import movieio.Util;
  • import movieio.qt.QtMovieReader;



この”movieio”はMovieIOファイル内の"movieio"ファイル内のクラスをインポートするために指定しています。

実行部分は次の通りです。
//==ここから==
public class QT_MovieReaderDemo implements PlugIn {
    
public void run(String arg) {

//ファイル選択ダイアログから動画ファイルを選択する。
String path = Util.askForOpenPath();
if (path == null) return;
//動画ファイルを読み込む
MovieReader mr = QtMovieReader.openMovie(path);
if (mr==null) {
IJ.error(this.getClass().getName() + ": could not open " + path);
return;
}
//動画ファイル名を取得しておく
String title = mr.getName();

//動画ファイルに含まれる各画像をウィンドウに表示する。
//各画像を格納する変数を指定
ImageProcessor ip = mr.createImageProcessor();
//画像を表示するウィンドウ
ImagePlus ijPlus = new ImagePlus(title, ip);
ijPlus.show();
//画像枚数を取得
int frameCount = mr.getFrameCount();
//動画の各画像を取得し、画像枚数ステータスを表示
int frame;
while ((frame = mr.getNextFrame(ip)) >= 0) {
IJ.showStatus(frame + "/" + frameCount);
IJ.showProgress((double) frame / frameCount);

//各画像を反転させてみる
//ip.invert();

//タイトルを表示
ijPlus.setTitle(title + " (Frame " + (frame) + ")");
ijPlus.updateAndDraw();
}
//動画を終了
mr.close();
IJ.showStatus("Done.");
IJ.showProgress(1.0);
}

}
//==ここまで==

上記のような手順で簡単に動画像処理コードを記述することができそうです。例えば、青文字で示した反転処理を有効にしてみる(スラッシュを削除する)と、読み込んだ画像を反転表示します。


(オリジナルコードを実行した結果)

(青文字部分を有効にして再度実行(コンパイル・アンド・ラン)した結果)


この"反転"を、自分がやってみたいメソッドに置き換えてみるとどうなるでしょうか。なんでもできそうですね。

動画像の読み込みとは逆に、あらかじめスタックした画像群を動画ファイルとして、各フォーマットで書き込み(保存)する場合も、これらのサンプルコードを活用すれば良さそうです。

動画像を処理するプログラムを作る練習には優れたプラグインですね。
今回は動画像フォーマットの入出力処理とそのプラグインの説明を行いました。サンプルコードをもとにユーザーオリジナルの画像処理コードを書くことに挑戦してみてはいかがでしょうか。

次回もユニークな画像処理法をImageJのコードを読み解きながら説明を行います。

参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(24・2) 2009, p108-110」

2015年11月2日月曜日

第44回 ImageJを用いたリアルタイムな映像信号の取り込み処理で学ぶ!

lmageJの入出力機能は、静止画像だけでなく、ビデオカメラなどのリアルタイムな映像信号の取り込み機能なども実装できます。lmageJのプラグインは、顕微鏡用カメラのアプリケーションインターフェイス(API)から汎用規格であるTWAINなどのAPIを含め、彩な規格に対応しています。本稿では、汎用のWebカメラなどからImageJを用いてリアルタイムな映像信号を取り込む方法や、基本的な処理について解説します。

ImageJの画像(信号)取り込みプラグイン


ImageJは、デジタルカメラ、ビデオカメラ、スキャナなどに付随する多彩な規格に対応した入出力用プラグインを持っています。代表的なものとしては、Apple社が開発したPCで動画や音声を取り扱うためのマルチメディアである「Quick Time」APIが挙げられます。また最近では、汎用PCを用いてインターネットを通じてリアルタイムに会話と映像を楽しむツールが流通していますが、ImageJではこのようなリアルタイムカメラ(Webカメラなどとも称され)APIを持っています。

また、デジタルカメラやビデオカメラばかりではなく、TWAINをはじめとしたスキャナなどに採用される規格のAPI なども実装可能です。TWAINとはヒューレット・パッカード社やイーストマン・コダック社などのメーカー5社が規格化したスキャナなど入力装置用のAPIです。これらのほかにも、工業用の高精細カメラや顕微鏡用カメラAPI など多くのプラグインが紹介されていますので、詳細はImageJWebサイトなとで確認してみてください。

ビデオカメラインターフェースの実装


ImageJは、Javaというプログラミング言語で作成されているため、Javaよるマルチメディアコンポーネントを用いて、カメラなどの外部装置と接続する方法を紹介します。

筆者が確認したこの操作が実現できるImageJプラグインは以下のものがあります。




本稿では、この中のWebcamCaptureプラグインについてご紹介します。
非常に簡便で、使い勝手のいいシンプルなビデオ操作ができます。

このWebcamCaptureプラグインは、"webcam-capture API"を利用して開発されています。この"webcam-capture API"が非常に使いやすく設計されており、サンプルコードも豊富に公開されているので、開発者には親しみやすいインターフェースになっています。

JMFやその他の高度な画像処理パッケージを利用して開発されていることも注目です。(このJMF Java Media Frameworkのことで、コアJavaではなく、ビデオや音声などのマルチメディア対応のオプションAPIです。)

webcam-capture APIに利用されているインターフェースを以下に示します。


それでは早速試してみましょう。WindowsでもMacでも操作は同じです。


  1. リンクから、WebcamCaptureプラグインをダウンロードします。念のため、システム環境変数(またはユーザー環境変数) のパスとクラスパスに、Javaの実行環境やライブラリが設定されていることを確認しておくことをお勧めします。
  2. ウンロードしたzipファイルを解凍し、通例どおり、ImageJフォルダ下のPluginsフォルダに入れます
  3. ImageJを起動し、PluginsメニューからWebcamCaptureを起動します。
すべてがうまくように設定できれば、ように、起動画面が立ち上がります。
設定方法は以下のとおり。

  1. Webカメラを選択します。最近のPCには内蔵されているものが多いと思います。今回はMac内蔵のiSightを選択しています。
  2. Grab and returnは、Snapを撮るときに使います。
  3. Custom sizeは、表示したい画面フレームの大きさを設定できます。
  4. Calibrationで、ピクセルごとの単位を定義します。
  5. Timelapseの各項目はGifアニメのような静止画像のキャプチャのつなぎ合わせ設定をしますがここは気にしなくて大丈夫です。



(初期画面:カスタムサイズ設定は無視しています)


(Image>Duplicateでキャプチャした画像:朝でヒゲがボーボーです。冬前の朝は寒い。)

このように、Webカメラなどでのリアルタイムな映像が映し出され、映像が出ているときに、Spaceキーを押すと、Snapが作成され、スナップを撮り終わったら、エスケープキーで終了し、作成したスタック画像をAVIやQuickTimeなどの動画として保存できます。

これらの操作は、ImageJの既存の機能を使って、キャプチャ(カメラ起動中にImage>Duplicate)やこれらのDuplicate画像をスタックして保存することも可能です。

今回は動画像処理の準備としてビデオカメラなどのリアルタイムな映像信号の取り込み方法などを紹介しました。

れらの臨床応用としては、内視鏡画像の取り込みや関心領域シーンの画像キャプチャなどに適応できると考えられます。例えば、内視鏡画像をImageJDICOM化(セカンダリキャプチャ)して、プラグインのDICOMデータベース、通信、CD書き込み機能を利用して管理すれば、臨床現場でも研究用途で実用的に利用できますね。


事例;

https://repositorium.sdum.uminho.pt/bitstream/1822/21664/1/paper_IUDC12.pdf

ImageJすべてがオープンソースで無料ですので、ImageJ内視鏡画像処理システムなども構築できるかもしれません。

次回は、少し振り返りになりますが、連続画像の処理方法について解説します。

参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.INNERVISION(24・1) 2009, p91-93」