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

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

ImageJのコマンドをPythonのコードに落とす (2): bit 深度変更ほか

■ 画像のBit 深度、型変換

 

[Image] →[Type] メニュー

・8-bit へ変換

IJ.run(imp, "8-bit", "")

 最後の、「 ,"" 」 が要注意です。

・16-bit へ変換

IJ.run(imp, "16-bit", "")

・32-bit へ変換

IJ.run(imp, "32-bit", "")

・24bit (8bit x 3)  RGB Color (ColorProcessor) へ変換

IJ.run(imp, "RGB Color", "")

 

 いずれも以下のインポートを前提としています。

from ij import IJ

 なお、深い bit 深度から浅い深度に変換する場合は、自動的にスケールを変えてくれますが、浅い方から深い方へ変換する場合は、変えてくれないようです。したがって、自分で Multiply コマンドをかけるなどして変更する必要があります。これについては、以下をご参照ください。

yasuo-ssi.hatenablog.com

 なお、ImageProsessor に bit 深度変換を行うメソッド、例えば、convertToByteProcessor, convertToShortProcessor, convertToFloatProcessor, convertToColorProcessor というものがあって、これを使って変換をしようとも思いましたが、RGB スタック形式の画像の場合、非常に面倒くさくなるので止めました。というのは、一つの ImagePlus の中では bit 深度の異なる ImageProcessor の同居を許さないようなので、当初、スタックを取得して、順々に ImageProcessor の変換を行うことを試みたのですが、失敗しました。

 もしやるなら、各チャンネルを一旦バラバラの ImagePlus に分割し、各チャンネルの ImagePlus の bit 深度を変更した上で、そこから ImageProcessor を取り出し、それをスタック形式の ImagePlus にまとめる、というような手順が必要になりそうなので、非常に面倒くさくなります。 IJ.run を使って bit 深度変更をしたほうがはるかに簡単です。

 またこれもすでに指摘しておきましたが、32bit 画像を変換する場合は、予めディスプレイ範囲をきちんと定義しておかないと、bit 深度変換時におかしな結果になります。

 

■ IJ.run(......) で使えそうなコマンドの当たりをつける

 IJ.run() は、ImageJ のマクロコマンドを実行するメソッドですが、この (    ) の中にどのようなコマンドが使えそうなのかは、ImageJ のマクロメニューの [Record...] を使うと当たりをつけることができます。

Macro メニュー

 上の、 [Record...] を選んで、ImageJ 上で操作を行うとマクロが記録されます。例えば、Prosess メニューから画像の掛け算を実行してみます。

マクロを記録する

 実行すると、下記のようなマクロが記録されます。

記録されたマクロ

 このマクロを応用し、IJ.run で、対象となる ImagePlus を引数として加えた上で、マクロの引数をそのまま引用すると....

IJ.run(imp, "Multiply...", "value = 1.250 stack")

 ちゃんと実行できます。

 ただ、時々この方式でちゃんと走らない場合があります。例えば上で紹介した bit 深度変更のコマンドですが、マクロで記録すると、以下のようにしか記録できません。

run("8-bit")

なので、

IJ.run(imp, "8-bit")

とやってみると、エラーになります。何故か最後に、

IJ.run(imp, "8-bit", "")

と空白 "" の引数を追加で入れないといけません。

さらに、必ず macro の引数は文字列で与えてやる必要があります。

また、時々、ImagePlus を最初に引数として取れないケースもあります。ただ引数として指定しなくてもカレントの ImagePlus に対して実行できる場合もあるようです。以下のページをご覧ください。

sites.google.com

また、IJ.Run(... で動かせないマクロコマンドもあります。このあたりはネットで検索するしかありません。