ImageJ の ChannelSplitter ですが、ImageJ の解説書を書いておられる三浦耕太氏のサイトに、使用例が出ています。
この利用例を見て、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つの要素を持つリスト変数になります。そのうち最初の要素のみデータが入っていて、残りのスタックは空なのですが、ひょっとするとこのことと関連があるのかもしれません。