PixInsightでいつもお世話になっている色合わせツールのPCC。その仕組みは調べてみると、思ったよりシンプルでした。PCCのプロセスは、まず画像の星の色を測定し、APASSとよぶ星の色データベースと比較をします。これにより撮影した画像の色の傾向がわかります。
次に、その色の傾向を使って仮想的な銀河を作ります。この仮想的な銀河を白の基準(ホワイトリファレンス)として利用します。
詳しくはこちらに解説しています。そこまではPCCのドキュメントに記載されています。では測定したデータを用いてカラーバランスを整えるときに「実際には画像にどのような処理をしているか」私は理解していませんでした。今回、とあるエラーの調査をする過程でPCCの処理内容がわかったのでレポートします。
やっていることはRGBの重みづけだけ
簡単にいうと、R, G, Bのそれぞれのチャネルにかける重みを設定しているだけです。たとえば、R、G、Bの重みがW_R、W_G、W_Bとすると、調整後のRGBの値は、元のRGBの各チャネルにそれぞれW_R、W_G、W_Bをかけています。
本当にそうなのか試してみましょう。データとしてさそり座のアンタレス付近の画像を使用します。PCCをかける前の画像と、PCC処理後の画像がこちらです。PCC画像は説明のために、 Backgroud Neutralization (BN)のチェックのあるとなしの両方を準備しました。Background Neutralizationは文字通り背景をニュートラルグレーにする機能です。
PCCを実行すると、コンソールに次の情報が表示されます。
これが先ほどのW_R、W_G、W_Bです。つまり元の画像の白い部分を白くするために、この値をRGBデータにそれぞれかけるわけです。
RGBに重みをつける
それでは早速、この重みを元の画像のRGBチャネルにそれぞれかけてみましょう。ProcessメニューのPixel MathからPixel Mathを起動します。表示されたら次の値を設定します。
Rチャネル: \$T * W_R
Gチャネル: \$T * W_G
Bチャネル: \$T * W_B
Symbols: W_R = 1.0000e+00, W_G = 7.7715e-01, W_B = 5.8121e-01
これはRGBそれぞれのチャネルに、W_R、W_G、W_Bをかけるという意味です。それでは実行してみます。
見事に一致します。つまりBackground Neutralization無しのPCCは、単純にRGBチャネルに重みをかけただけです。
Background Neutralizationを実行する
PCCにはもうひとつ、Background Neutralizationという機能があります。これは背景をニュートラルグレーにする機能です。
次のステップとしてBackground Neutralizationを実行します。ProcessメニューのColor CalibrationからBackground Neutralizationを起動します。From Previewで先ほどPCCを実行した画像のPreviewを設定します。画像が異なりますが、このFrom PreviewボタンはPreviewの座標を取得するだけなので異なる画像のPreviewを設定しても問題ありません。
先ほどPixel Mathをかけた画像にBackground Neutralizationを実行します。
これも見事に一致します。
通常、Color Calibrationの際は先にBackground Neutralizationを実行してからColor Calibrationを実行します。Background Neutralizationによってカラーバランスが少し変わるためです。しかしPCCは上述のようにRGBに重みをかけるというシンプルなプロセスのため、重みをかけた瞬間に背景のバランスは大きく崩れます。そのためRGBの重みづけをしてから、BN処理をしています。
以上のようにPCCは星の色指数によってホワイトバランスを決定したら、(1)RGBの各チャネルに対して重みづけ (2)Background Neulralizationで背景をニュートラルグレーに変更、の2つをやっているだけでした。これまでPCCを実行した画像に、マニュアルでちょこちょことカラーバランスを変えるのに抵抗がありましたが、RGBの重みづけをしているだけならば、少なくともノンリニアのフェーズでは色味の変更も罪悪感なくやれそうです。
またPCCのパラメータ値の変更もこの事実を知った上であれば、いろいろできることがありそうです。もう少し研究を続けます。
どうしてわかったのか? サイズが大きいファイルのPCCエラー
今回この事実がわかったのは、PCCにエラーがでてそのエラー回避のために調査をしたためです。今回のさそり座の画像にPCCを実行すると次のエラーが出ました。
*** Error: Failure to process image file ‘/var/folders/3b/06f9pldd0pj3sk1v9mzfy23c0000gp/T/PCC_B_91L5EW5ZX7GA.xisf’: Error: Image.getSamples(): error setting array element
このエラーをネットで調べてみると、Java Scriptの配列変数の限界である4GBを超えているからとのことでした。実際、私の画像もモザイク合成+Drizzleをやっていますので画像サイズが大きくなっています。
この投稿によれば「画像サイズを小さくしてPCCを実行し、取得できたパラメータでPixel MathとBackground Neutralizationを実行する」とあります。画像サイズは、Processメニューの<All Processes>からResampleを実行することで小さくすることができます。私の画像も縦横1/2、つまり1/4のサイズにすると無事にPCCが実行できました。その結果得られたRGBの重みづけを使って上記の処理をすすめました。
謎の多かったPCCですが、かなり解明できてきました!