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

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

ImageJ / Python Tips: ImageJに32bitフルカラーTIFF画像を読み込む

 ImageJでは、8bit フルカラー画像はネイティブで対応していますが、16bit フルカラー画像は  bio-format プラグイン経由で読み込むようになっています。さらに 通常のTIFF形式の32bit フルカラー画像については、bio-format プラグインも非対応のため、直接読み込むことができません。 (現在、bio-format プラグインのバージョンアップにより直接読み込めるようになっています。ただし、書き込みはできません[2023.7 追記]) ただし、ImageJ 自体は32bit 画像を扱うことができます。

 そこで、ImageJ に 32bit フルカラー画像を読み込む方法を考えました。32bitフルカラー画像がある場合、そのファイルを一旦GIMPで読み込んでおきます。そして、RGB分割を行って、それぞれのチャンネルを別々の TIFF ファイルとして保存します。

 ちなみに GIMP 2.10.32 でチャンネル分割してTIFFファイルに保存したところ、なぜかGチャンネルのみ、値がおかしくなりました。個別のファイルの問題かもしれませんが、そうだとしても、不安定なところがあるということです。開発途上版 GIMP 2.99.14 だと問題がありません。GIMP 2.10* では、32bit ファイルの扱いにまだ難があるようです。

 各チャンネル別に変換したTIFFファイルを読み込んで、ImageJでRGB合成に掛けますが、手作業だとちょっと面倒なので、以下にあるPython スクリプト・プログラムを使って読み込みます。但しRGBごとのファイル名は、*****_R.tif, *****_G.tif, *****_B.tif とし、***** の部分は名前をそろえてください (以下のプログラムでは大文字・小文字を区別します)。以下のプログラムを走らせ、ファイル読込ダイアログが開いたら、まず Rチャンネル画像ファイルを指定します。するとあとのG, B チャンネルファイルも読込み、ImageJ 上で RGB合成を実行します。なお、エラー処理などは行っていません。

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

# 32bit full color image import program for ImageJ
# (c) 2023 Ohnishi, Yasuo
import ij.ImagePlus
from ij.plugin import RGBStackMerge
from ij import IJ, ImagePlus
from ij.io import OpenDialog
from ij.plugin import RGBStackMerge, RGBStackConverter
from loci.plugins import BF
from org.python.core import codecs
codecs.setDefaultEncoding('utf-8')

od = OpenDialog("Choose Red channel file")
folder = od.getDirectory()
filename = od.getFileName()
if filename:
    path = folder + filename
    IJ.log(path)
    IJ.log(folder)
    IJ.log(filename)
    i = path.find('_R.tif')
    pathroot = path[0:i].strip()
    # Always Open file with Bio-format Plugin
    impr = BF.openImagePlus(pathroot + "_R.tif")
    impR = impr[0] #imp0: Original Image
    impg = BF.openImagePlus(pathroot + "_G.tif")
    impG = impg[0] #imp0: Original Image
    impb = BF.openImagePlus(pathroot + "_B.tif")
    impB = impb[0] #imp0: Original Image
    impMerged = RGBStackMerge.mergeChannels([impR, impG, impB], False)
    impMerged.show()
    impR.close()
    impG.close()
    impB.close()

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

 ところで、先ほど「通常のTIFF形式の32bit フルカラー画像」はImageJで直接にはよみこめないと書きましたが、通常ではない、つまり ImageJ 独自のカラータグを付したTIFFなら32bitフルカラー画像を扱えます。一旦 ImageJ 上でRGB合成した 32bit フルカラー画像を TIFF に保存できますが、これは ImageJ のスタック形式をそのまま TIFF に保存したもの、つまり、通常の画像処理ソフトでは、3ページのグレースケール画像を含むマルチページ TIFF として認識されてしまう形式です。これならImageJ上で、32bit フルカラー画像を TIFF ファイルとして扱えます。しかも bio-format プラグインなしで読み込めます。

 これを逆に通常の画像処理ソフトでカラー表示できるようにするには、RGB 合成機能をもつ画像処理ソフトに読み込んで、各チャンネルを RGB 合成しなおす必要があります。

以上をまとめますと...

通常の32ビットカラーTIFFGIMPで3色分解してチャンネルごと別々のTIFF として保存 → ImageJでチャンネルごとに読み込み、RGB合成 → ImageJ スタック形式の32bit フルカラー画像 → ImageJ 独自カラータグ付き、マルチページ TIFF

ImageJ のチャンネルマージ画面

ImageJ 独自カラータグ付き、マルチページ TIFFGIMP で3レイヤーのグレースケール画像として読み込み → 3レイヤーをRGB合成 → 通常の32bit フルカラーTIFF

GIMP で ImageJ 対応 32bitフルカラーTIFFを読み込む画面

GIMP上でのチャンネルマージ画面

という手順になります。なお、GIMP上で3レイヤーのグレースケール画像として読んだ場合、一番下から R, G, B の順になります。

 

 なお、上に掲げたサンプルプログラムはご自由にご活用ください。