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

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

ImageJ / Python プログラミング Tips: プログラミング用テンプレート update

 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))

#---