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

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

ImageJ / Python プログラミング Tips: ImageJ グレースケール画像の構造 + 輝度画像作成計算方法

 先日、ImageJ のプログラミングをしていてグレースケールの ImagePlusを Duplicator や ImegePlus の Dupulicate() メソッドを使って複写しようとすると、エラーになってしまうのに気づきました。なぜこうなってしまうのかを色々調べている過程で、ImageJ のグレースケール画像は次のような構造があることが分かりました。

 すでに先日指摘しましたが、まず、3スタックのカラー画像から直接イメージコンバーターを使ってグレースケール画像を作成することができません。一旦、ImageConverter(imp).convertToRGB() で、カラープロセッサに変換してから、グレースケール変換を行わなければなりません。

 それと、イメージコンバーターの convertToGray *() メソッドを使ってグレースケール画像を作成すると、グレースケール画像は次のような構造になることが分かりました。

・グレースケール画像は、それぞれ ByteProcessor 形式である RGB データ 3 枚を含んだ3 スタック構造になる。

 ColorProcessor を使った 24bit (8bit x 3) RGB カラー画像は1スタック構造なので要注意です。

・しかし、getNChannels() メソッドでチャンネル数を取得すると 1 チャンネルと表示される。

 3 スタックでも、あくまで 1 チャンネルなので、ChannelSplitter を使っても、各スタックがばらばらの ImagePlus に分解されることなく、元のファイルと同じ1 本のグレースケール画像ができてしまいます。

 

 このような仕様になっているのは、ImageJ 上では RGB カラーをグレースケールに変換した場合、RGB チャンネルの平均値を取ったグレースケールと、ウェイト付けをしたグレースケールの2種類を表示できるようになっているので、元々の RGB データを維持する必要のためのようです。

 とはいえ、ここで作成したグレースケール画像を TIFF に保存して他の画像処理ソフトに渡そうとすると、3 スタック構造の RGB データと同じ問題が発生します。つまり、このグレースケール画像は、他ソフトではやはり RGB バラバラの 3 ページ TIFF と認識されます。これでは困ります。

 そこで、ImageCalcurator を使って、1スタック、単独 ImageProcessor のグレースケール画像の ImagePlus に変換する関数を考えてみました。

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

 

def convertToLuminosity(imp0):
    # convert RGB 3 color image to mono Luminosity image
imp = Duplicator().run(imp0) impChs = ChannelSplitter().split(imp) ic = plugin.ImageCalculator() impChs[0].getProcessor().multiply(0.2126) impChs[1].getProcessor().multiply(0.7152) impChs[2].getProcessor().multiply(0.0722) impTmp1 = ic.run("Add created", impChs[0], impChs[1]) impLuminosity = ic.run("Add created", impTmp1, impChs[2]) impTmp1.close() impChs[0].close() impChs[1].close() impChs[2].close() return impLuminosity

 

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

 この関数は、imagePlus を引数として取り、impLuminosity という imagePlus を戻り値として出力します。また作成されるグレースケール画像は、ウェイト付けされたものです。

 このウェイトは CIE の XYZ に基づくもので、他にウェイトをつける計算式として以下のものがあるようです*1

ITU-R Rec BT.601 (アナログ放送規格 Jpeg の輝度計算でも使用)
V = 0.299*R + 0.587*G + 0.114*B

日本のアナログ放送規格
V = 0.30*R + 0.59G + 0.11*B

ITU-R Rec BT.709 (HDTV 規格)
V = 0.2126*R + 0.7152*G + 0.0722*B
※XYZ に知覚的 TRC 補正を掛けたもの

 

また、以下をインポートしておく必要があります。

from ij.plugin import ChannelSplitter
from ij.process import ImageConverter
from ij.plugin import Duplicator

 

 

 

 

*1:以下のサイトを参考にさせていただきました。

qiita.com