ImageJ において Python スクリプトを作成するためのテンプレートコードを公表します。このコードは、以前公表したテンプレートのバージョンアップにあたります。ポイントとしては、8, 16, 32-bit の様々なビット深度の画像が読み込まれることを想定して、Bit 深度の判定を行うようなコードを付加しています。また、画像を読み込む部分をユーザ定義関数化しています。このコードは自由にご活用ください。
このテンプレートには次の特徴があります。
1) 既に画像が開いていればそれを imp0 として取得し、開いている画像がなければ、ファイルオープンダイアログを使ってファイルを開きます。
2) 読み込んだファイルのスタックサイズとビット深度を取得します
3) メイン部分では使っていませんが、8bit 表示の明るさの値を、読み込んだ画像のビット数や最大値に応じて変換する関数、convValue() を付けておきました。ImageJ は画像が 8-bit であることを前提とした仕様が残っていますので、それの橋渡しとしてつけておきました。
使い方は、
convValue(8bit表示の値, 読み込んだ画像のビット深度, 読み込んだ画像の ImagePlus)
となっています。
なお、8bit (8 x 3 = 24bit画像を含む) 画像の最大値は 255, 16bit 画像の最大値は 65535 を前提とし、32bit 画像の場合、1.0, 255, 65535, 16777215 のいずれかであることを前提とします。
---------------------
# ImageJ Python Programing Template
# (c)2023 Ohnishi, Yasuo
# 2023.6
from ij import IJ
from ij import WindowManager as WM
from ij.io import OpenDialog
from loci.plugins import BF
from org.python.core import codecs
codecs.setDefaultEncoding('utf-8')
#---Convert Value in 8, 16, 32bit mode
def convValue(Value, BitDepth, imp):
# Converting Luminance Value each in 8, 16, 32bit mode
if BitDepth == 16:
Value = Value * 256
elif BitDepth == 32:
L_max = set_Lmax(imp)
Value = Value * (L_max / 255.999)
else: # 8 or 24
Value = Value
return Value
#-----------------
def set_Lmax(imp):
# set Maximum value of Lightness
L_max = imp.getProcessor().getMax()
if int(L_max) > 65536:
L_max = 16777215
elif int(L_max) > 256:
L_max = 65535
elif int(L_max) > 1.0:
L_max = 255
else:
L_max = 1.0
return L_max
#--- image type detection
def imageTypeDetection(imp):
StackSize = imp.getStackSize()
BitDepth = imp.getBitDepth()
return StackSize, BitDepth
#----load image-------
def load_image():
imgCurrent = WM.getCurrentImage()
if not imgCurrent:
od = OpenDialog("Choose a file")
folder = od.getDirectory()
filename = od.getFileName()
# Always Open file with Bio-format Plugin
if filename:
imps = BF.openImagePlus(folder + filename)
imp0 = imps[0] #imp0: Original Image
imp0.show()
else:
IJ.showMessage("File is not selected.")
else: # target image is already open
imp0 = imgCurrent
filename = imp0.getTitle()
try:
folder = imp0.getOriginalFileInfo().directory
except:
folder = IJ.getDirectory("Output_directory")
return imp0, filename, folder
#--- code for test
imp0, filename, folder = load_image()
StackSize, BitDepth = imageTypeDetection(imp0)
if filename:
IJ.log("folder: " + folder)
IJ.log("filename: " + filename)
IJ.log("StackSize: " + str(StackSize))
IJ.log("BitDepth: " + str(BitDepth))
#---