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

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

ImageJ / Python Tips: ImageJにおけるカラー画像の画像深度の扱いについて

 ImageJの画像の型はImagePlusのgetTypeメソッドで取得できます。その種類は、 現状では、GRAY8, GRAY16, GRAY32, COLOR_RGB, 及び COLOR_256です。GRAY8はグレースケール(もしくは色チャンネル単独)で8bit (0-255の値を取る)、GRAY16はグレースケール(もしくは色チャンネル単独)で16bit (0-65535の値を取る)、GRAY32は浮動小数点を使った32bitの値で諧調を表現します。COLOR_256は、いわゆるインデックスカラーで、gifと同じように色を256色で表現します。COLOR_RGBはRGB3チャンネルでフルカラーを表現します。要注意なのはこのCOLOR_RGBの場合、8bit x 3チャンネルになることです。なぜならRGB各8bitの値を単独の24bitの整数値に割り付けて表現するからです*1

f:id:yasuo_ssi:20211217000744p:plain

COLOR_RGB
Color画像が単独のImageProcessor (ColorProcessor) として扱われている

 

 とはいえ、ImageJの現行バージョンは16bit x 3 (または32bit x 3) のカラーの画像も扱えます。但し 8bit カラーの扱いと異なってきます。どのように扱っているかというと、画像の型が、GRAY8, GRAY16, GRAY32, COLOR_RGB, 及び COLOR_256の場合は、あるImagePlusオブジェクトが単独の画像を扱うのであれば、その中に1枚のImageProcessorしか含まれません。しかし16bitカラーの場合は、1枚のImageProcessorで表現することができず、必ずR, G, B, 3枚のImageProcessorがスタックとして含まれています(つまり、ImageProcessorは32bitが限界ということだと思います)。つまりGRAY16bit x 3枚で表現しているのです。それでもImageJ上では単独のカラー画像として表示できます。

 これはおそらく元々はOSの32bitの制約 (現在は64bitまで拡張されているOSが増えていますが) から ImageProcessorの最大サイズが32bitに制限されているためと思われます。

f:id:yasuo_ssi:20211217000058p:plain

R, G, Bが別々のスタックとして扱われている状態

 ところで、他のアプリケーションと画像をやり取りするときに問題が起こります。この3枚のImageProcessorを含んだImagePlusオブジェクトを、他のアプリケーションで読ませるためにRGB画像ファイルとして出力しようとすると、多くの場合8bitカラー画像としてしか出力できません。但し、TIFFファイルであればImagePlusをそのまま出力できます。ところが、16bit x 3のImageProcessorを含んだImagePlusをTIFFとして出力した場合、R, G, B画像が別々のページとなった3ページのマルチページTIFFとして出力します。これだと多くの画像ソフトで正しく読み込めず、マルチページTIFFに対応しない画像ソフトでは、R画像のみのモノクロ画像に、マルチページ対応の画像ソフトではモノクロ 3ページの画像になってしまいます。GIMP (2.10.24以降)でも、読み込めることは読み込めますが、RGBそれぞれのチャンネルをそれぞれレイヤーもしくは別々の画像ファイルとして読み込みます。従って、GIMP上で正しく表示させるには、さらにチャンネル合成が必要になります。つまり16bit x 3スタックとして扱われている画像は、SaveAsTiff メソッドで保存しても常に SaveAsTiffStack メソッドで保存したのと同じ扱いになる (複数ページのTiffファイル扱い)、ということかと思います。基本的にはSaveAsTiffメソッドの仕様が変わらないと、16bitや32bit RGB TIFFファイルとして保存はできないものと思います。

f:id:yasuo_ssi:20210420223249j:plain

ImageJで保存した16bitカラー画像をGIMPで読み込むところ

 ただ、16bitの無圧縮TIFFファイルを読み込んで、加工せずにそのまま名前を付けて保存しなおした場合は、16bitのまま保存が可能です。ひょっとしてどこかに抜け道があるかもしれませんが、まだ探せていません。

 JavaAPIを使えば抜け道があるのかもしれませんが...

 ですので、4月に不均等黄変ネガ写真補正ツール簡易版を出したときは、16bit画像のチャンネル合成はGIMP上のプラグインで合成するようにしました。

 とりあえず、ImageJによって、R, G, BチャンネルがマルチページのTIFFとして保存されたファイルをどの画像ソフトでも正しく扱えるRGBカラー画像フォーマットに変換するには、GIMPを使うのが良いと思います。上でも触れたようにGIMP (但し2.10.24以降) で読み込み、上図のダイアログが出たところでページの展開方法に[レイヤー]を選択して読み込みます。

 すると一番下がR, 次がG, 一番上がBのレイヤーとして読み込みますので、読み込んだところで、メニューから[色]→[色要素]→[チャンネル合成]を選択します(下図)。

 

f:id:yasuo_ssi:20210618221326p:plain

GIMP上で、マルチページのTIFFファイルをレイヤーとして読み込んだところ

 読み込んだら、一番下のレイヤー(背景)をR, 二番目のレイヤー(1ページ)をG, 一番上のレイヤー(2ページ)をB と指定してチャンネル合成を掛けると(デフォルトの順番と反対になる。下図参照)、合成されたRGBカラー画像になります。

 

f:id:yasuo_ssi:20210618221500p:plain

GIMP上でチャンネル合成を行う

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

この記事には以下に補足記事があります(2021.12)。

yasuo-ssi.hatenablog.com

*1:以下を参照。

syn.mrc-lmb.cam.ac.uk