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

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」

0 件のコメント:

コメントを投稿