先日、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