省型旧形国電の残影を求めて

戦前型旧形国電および鉄道と変褪色フィルム写真を中心とした写真補正編集の話題を扱います。他のサイトでは得られない、筆者独自開発の写真補正ツールや補正技法についても情報提供しています。写真補正技法への質問はコメント欄へどうぞ

ImageJ / Python プログラミング Tips: 開かれている画像がない場合はファイルから読み込む

 以下、開かれてる画像があればその画像の情報を取得し、開かれている画像がなければ、ファイル選択ダイアログを開いてファイルを読み込む、ImageJ の Python を使ったプログラミングサンプルをお示しします。

 プログラミング初心者でも、書きたいプログラムでファイル読込をやらせたいというケースは結構ありますが、ちょっと面倒です。なので、テンプレート的に使えるサンプルコードがあると良いと思って、公開します。

---------------------

1 |from ij import IJ, ImagePlus
2 |from ij import WindowManager as WM
3 |from ij.io import DirectoryChooser, OpenDialog
4 |from loci.plugins import BF
5 |import os
6 |from org.python.core import codecs
7 |codecs.setDefaultEncoding('utf-8')
8 |
9 |
10|window = WM.getActiveWindow()
11|if not window:
12|    od = OpenDialog("Choose a file")
13|    folder = od.getDirectory()
14|    filename = od.getFileName()
15|    if filename:
16|        path = folder + filename
17|        IJ.log(path)
18|        IJ.log(folder)
19|        IJ.log(filename)
20|# Always Open file with Bio-format Plugin
21|        imps = BF.openImagePlus(folder + filename) 
22|        imp0 = imps[0] #imp0: Original Image 
23|        imp0.show()
24|    else:
25|        IJ.showMessage("File is not selected.")
26|else: # target image is already open
27|    imp0 = IJ.getImage()
28|    imagename = imp0.getTitle()
29|    try:
30|        folder = imp0.getOriginalFileInfo().directory
31|    except:
32|        folder = IJ.getDirectory("Output_directory")


---------------------

1~7行目

 ライブラリを読み込みます。ファイルはバイオフォーマットプラグインを使って読み込むことにしているので、それを読み込むとともに、ウィンドウマネージャ、ファイルを新たに読み込むのに使う、ディレクトリチューザやオープンダイアログなどを読み込んでいます。

10行目

 現在アクティブなウィンドウがあるかを取得します。

11~25行目

 現在開かれた画像がなければオープンダイアログから、ファイル情報を読込み、21行目でバイオフォーマットプラグインでファイルから画像を impsに読み込みます。バイオフォーマットプラグインを使っているのは、ImageJのデフォルトでは、16bitカラー画像を読み込めないからです。カラー8bit以下の画像や単チャンネルモノクロ画像であれば、バイオフォーマットプラグインを使う必要はありません。

 因みに、読み込んだ画像のビット深度を判定するには、ImagePlus オブジェクトに、getBitDepth() というメソッドがありますので、

bitdepth = imp0.getBitDepth()

などとやると、ビット深度が取得できます。値は、8, 16 というような整数値になります。

 そしてバイオフォーマットプラグインで読むと通常ハイパースタック形式で読み込みますが、例え画像が1枚でも、これは必ず ImagePlus の配列(リスト変数)として読み込まれるので、その1枚目の画像( imps[0] ) を表示させます。

 なお、万一ファイル情報が取得できない場合 (24~25行目)、ファイルが選ばれていないとのメッセージを表示します。

26行目以下

 ここでは、既に開かれた画像(ウィンドウ)がある場合の処理です。

IJ.getImage() で、現在開かれている画像を imp0 に取得し、画像のタイトルを imagename に取得します。さらに、30行目で開かれている画像のパスやファイル名を取得しますが、失敗した場合はダイアログを開き、ファイルを保存するディレクトリーを指定します。

 

 適宜コピペしてお使いください。なおお分かりかと思いますが上のコードの頭3桁は行番号なので、コピペして使用するときは、頭の行番号部分は削除してご活用ください。