PCCは実はシンプルな処理でした 〜 PixInsightの画像処理

PixInsightでいつもお世話になっている色合わせツールのPCC。その仕組みは調べてみると、思ったよりシンプルでした。PCCのプロセスは、まず画像の星の色を測定し、APASSとよぶ星の色データベースと比較をします。これにより撮影した画像の色の傾向がわかります。

PCCの処理後に表示されるグラフ
星の色の測定

次に、その色の傾向を使って仮想的な銀河を作ります。この仮想的な銀河を白の基準(ホワイトリファレンス)として利用します。

平均的な銀河のWhite ReferenceのColor Indexを撮影データで求める
ホワイトリファレンスの決定

詳しくはこちらに解説しています。そこまではPCCのドキュメントに記載されています。では測定したデータを用いてカラーバランスを整えるときに「実際には画像にどのような処理をしているか」私は理解していませんでした。今回、とあるエラーの調査をする過程でPCCの処理内容がわかったのでレポートします。

やっていることはRGBの重みづけだけ

簡単にいうと、R, G, Bのそれぞれのチャネルにかける重みを設定しているだけです。たとえば、R、G、Bの重みがW_RW_GW_Bとすると、調整後のRGBの値は、元のRGBの各チャネルにそれぞれW_RW_GW_Bをかけています。

本当にそうなのか試してみましょう。データとしてさそり座のアンタレス付近の画像を使用します。PCCをかける前の画像と、PCC処理後の画像がこちらです。PCC画像は説明のために、 Backgroud Neutralization (BN)のチェックのあるとなしの両方を準備しました。Background Neutralizationは文字通り背景をニュートラルグレーにする機能です。

PCCの実行結果

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をかけるという意味です。それでは実行してみます。

BNなしのPCCと、Pixel Mathの比較

見事に一致します。つまりBackground Neutralization無しのPCCは、単純にRGBチャネルに重みをかけただけです。

Background Neutralizationを実行する

PCCにはもうひとつ、Background Neutralizationという機能があります。これは背景をニュートラルグレーにする機能です。

PCCのBackground Neutralization

次のステップとしてBackground Neutralizationを実行します。ProcessメニューのColor CalibrationからBackground Neutralizationを起動します。From Previewで先ほどPCCを実行した画像のPreviewを設定します。画像が異なりますが、このFrom PreviewボタンはPreviewの座標を取得するだけなので異なる画像のPreviewを設定しても問題ありません。

Background Neutralization

先ほどPixel Mathをかけた画像にBackground Neutralizationを実行します。

BNありのPCC画像と、Pixel Math+BNの画像
BNありのPCC画像と、Pixel Math+BNの画像

これも見事に一致します。

通常、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をやっていますので画像サイズが大きくなっています。

Photometric Color Calibration problem with large image
Hi. I have been trying to test Photometric Color Calibration with extremely large images (33580 x 25360) and I always ge...

この投稿によれば「画像サイズを小さくしてPCCを実行し、取得できたパラメータでPixel MathとBackground Neutralizationを実行する」とあります。画像サイズは、Processメニューの<All Processes>からResampleを実行することで小さくすることができます。私の画像も縦横1/2、つまり1/4のサイズにすると無事にPCCが実行できました。その結果得られたRGBの重みづけを使って上記の処理をすすめました。

謎の多かったPCCですが、かなり解明できてきました!

タイトルとURLをコピーしました