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

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

ImageJ / Python プログラミング Tips: Channel Splitter の仕様に注意

 ImageJ の ChannelSplitter ですが、ImageJ の解説書を書いておられる三浦耕太氏のサイトに、使用例が出ています。

sites.google.com

 この利用例を見て、Channel Splitter は、カラー画像の ImagePlus をチャンネル毎の ImagePlus に分割するのであり、てっきり、オリジナルの ImagePlus とは別の ImagePlus に分割されるのかと思っていました。

 ところが、それは根本的な誤解であることがわかりました。例えば、三浦氏のサイトに出ている例ですが...

imp = IJ.getImage()

imps = ChannelSplitter.split(imp)

print len(imps)

imps[0].show()

imps[1].show()

imps[2].show()

つまり、imp の RGB 各チャンネルが、imps[0] 〜 [2] というリスト形式に分割されています。これらに対しては、多くの場合 ImagePlus のメソッドも使えます。ですので、それぞれ オリジナルの ImagePlus とは別の ImagePlus であるものと思っていました。

 ところが、各 imps の要素の値を変更すると、imp の内容も変わってしまうことに気づきました。最初は何が起こっているのか全くわかりませんでした。imps の要素を変えると imp の内容が変わるということは、結局、

ChannelSplitter でチャンネル分割をしても、リスト形式でチャンネルにアクセスできるようになるだけで、オリジナルの imagePlus とポインタは同じ。

・分割したチャンネルの値を変更すると、オリジナルの imagePlus の値も変更される

 ということが明らかになりました。ImagePlus のメソッドも使えるので、てっきり 別のポインタの ImagePlus に変換されるのかと思っていましたが...

 結局、ChannelSplitter を使うと、Stack としてアクセスするしかなかったチャンネルに対し、リスト変数の形でアクセスできるようにするのであって、別々の ImagePlus に分割しているわけではない、ということのようです。非常に要注意です。

 そういえば、チャンネル分割を行い、各ピクセルの値を取得すると、なぜか4つの要素を持つリスト変数になります。そのうち最初の要素のみデータが入っていて、残りのスタックは空なのですが、ひょっとするとこのことと関連があるのかもしれません。