天文ガイド最優秀作品 受賞記念 〜 ケンタウルスAのPixInsight 全画像処理工程を公開!!

天文ガイド2021年9月号で最優秀作品賞をいただきました。最初に買った天文ガイドは小学校の4年生のとき。数十年を経て受賞できたことに感慨もひとしおです。嬉しかったのはケンタウルスAから吹き出るジェットの画像処理を評価してもらったことです。ジェットに限らず今回のケンタウルスAは、画像処理にいろいろ工夫しました。露光時間は100時間を超えましたが、画像処理も1ヶ月近くこればっかり。行きつ戻りつ露光時間に負けないくらいの時間をかけました。

最優秀賞をいただいたケンタウルスA
最優秀賞をいただいたケンタウルスA

受賞の記念に、ケンタウルスAで採用した画像処理の全工程を解説したいと思います。いまの私の持てる技術を総動員のフルスイングです。LRGBとHαの処理ですが、ワンショットのカラーカメラでも共通のプロセスは多く参考になるかと思います。

それでは始まり〜。

ケンタウルスA 処理フロー
ケンタウルスA 処理フロー

前処理

(1) SubframeSelector, Blink

イメージの選定からスタートです。画像品質チェックの効率化の記事で解説した手順でイメージを選定しました。今回は、1枚あたり600秒露出でトータル818枚(136時間20分)撮影しましたが、そのうち74%にあたる605枚(100時間50分)を採用しました。とくに淡いジェットを撮影することが目的の一つであったため、もったいない気がしましたが一定品質以下のデータは不採用にしました。

(2) WBPP (Calibrationのみ)

Bias, Dark, FlatDark, Flatはそれぞれ100枚ずつ用意しました。FlatはRGB, L, Hαごとに撮影しています。リモート撮影のためFlatは薄明時間にスカイフラットで撮影しています。Bias, Darkはチリにいる友人に頼んで望遠鏡に蓋をつけてもらいました。

WBPPはImageIntegrationにチェックをせず、Calibrationのみをしています。これは次の行程で一枚ごとのABEをかけるためです。

(3) ABE (一枚ずつ)

チリの観測地はライトを消すと自分の腕も見えなくなるくらいの暗さですが、空は真っ黒というわけでなく少し明るさがあります。大気の関係なのでしょうか、日によって明るさが異なる気がします。そのためかぶり除去の処理は必須です。まず前行程でImageIntegrationをする前に、一枚ずつの画像にABEをかけました。Function Degree=1(一次関数)です。一枚ずつABEをかけるために、ImageContainerに処理対象を格納し、ABEをProcessContainerに登録して実行しました。その方法はそーなのかーさんのブログの前処理記事に詳しいです。この手法は、今回の画像に限らず毎回使いますので覚えておきたいです。ABEはWBPPが生成したRegisteredフォルダの下のイメージに対して、ABE処理をかけました。こうすることで位置合わせまでが完了しているので、この後にImageIntegrationをするだけでマスターファイルを作ることができます。

(4) LocalNormalization

複数の日に渡った撮影の場合や、同じ日でも撮影中に空の状態が変わり、個々のイメージの輝度が異なることがあります。イメージ全体が異なる場合もありますし、薄雲などの影響で部分的に輝度が異なることも。LocalNormalizationは、状態の良いリファレンスと対象画像の輝度の違いをサンプルを取って調べ、ImageIntegrationの際により均質な背景を得たり、ピクセル異常を検出しやすくします。こうすることでクリアな高いSN比の画像を得ることができます。

Reference ImageとしてWeightが一番大きな値の画像を選択する必要があるのですが、WBPPで一括処理したため個々の画像のWeightがわかりません(実際にはLogファイルに出力されているので、プログラムのスキルがある人は一番Weightが大きな画像を選択できそうです)。そこでSubframeSelectorを再度起動して、Weightを計算しました。

今回は銀河ですので、WBPPの設定ではFWHM 20%、Eccentricity 15%、SNR 25%の重み付けになっています。

WBPPの重み設定画面

そのためSubframeSelectorの重み設定でも次の式を採用しました。

(20*(1-(FWHM-FWHMMin)/(FWHMMax-FWHMMin)) + 15*(1-(Eccentricity-EccentricityMin)/(EccentricityMax-EccentricityMin)) + 25*(SNRWeight-SNRWeightMin)/(SNRWeightMax-SNRWeightMin))+40

この式をSubframeSelectorのExpressions画面のWeightingに設定すると、Weightが計算されますので、RGB, L, Hαの各画像で最もWeightの大きな画像名をメモしておきます。Weightの値のファイルへの書き込みはWBPPで済ませているので、今回はファイル名の確認のみです。Weightが一番大きなこれら画像はPixel Rejectionの参照用に使います。そのためLocalNormalizationを実行する前に人工衛星のあとやかすみなどがないか画像をチェックします。問題なければLocalNormalizationのReference Imageとして設定します。問題があった場合はWeight値が次点の画像を選択すれば良いと思います。LocalNormalizationの残りのパラメータは規定値のまま使用しました。実行するとNormalization用のファイルが生成されます。

Adam BlockはReference Imageは状態の良い複数のファイルをIntegrationして作ることを推奨していました。LocalNormalizationはReference Imageとの比較でノイズを除去するため、Reference Imageの品質が結果に大きく影響するので、手間をかけているのです。

また最近、NormalizeScaleGradientというスクリプトが登場しました。これは強力と聞きます。今回の前処理のノイズ処理は(4)一枚ずつのABEとLocalNomalizationを使いましたが、デモ映像を見る限りこの二つをNormalizeScaleGradientに置き換えることもできそうな予感です。

(5) ImageIntegration

(3)でABE処理した画像を対象にImageIntegrationを使って画像合成をします。まずAdd Filesで合成する画像を選択します。また(4)で生成したNormalizationファイルもAdd L.Norm Filesボタンで追加します。Weightsオプションは”FITS Keyword”を選択し、Weights Keywordとして”WBPPWGHT”と記載します。これはWBPPがFitsファイルに登録した重み付け情報です。Rejection AlgorithmはLinear Fit Clippingを選択しました。

これで前処理は終了。後処理に移ります。

R,G,Bイメージ処理

(6) DynamicBackgroundExtraction(DBE)

後処理の最初は、かぶりを除去するDynamicBackgroundExtraction(DBE)です。パラメータは最近のお気に入り、Tolerance=5.0、Smoothing factor=0.6、Default sample radius=18としました。

DBEの設定
DBEの設定

これらのパラメータの意味についてはDBEが上手になった記事を参照ください。サンプル数は多めの253打点しています。

DBEのサンプル打点

サンプル数が多いように思われるかもしれません。私は以前はサンプル数は50〜100点くらいにしていましたが、いろいろ試した結果、サンプル数は多い方が良い結果を得ると判断しました。今回は銀河のためバックグランド領域が多いこともあり、253打点しています。ただし銀河のハローを消してしまわないように、サンプル位置は銀河からある程度距離を離しています。同じABEはデスクトップに▲マークを保存しておき、同じサンプルデータをRGB、L、Hαの5枚に対して適用させました。

<追記 2022.7.18>
記事を公開して1年近く経って、RGB合成の記載漏れに気づきました。ここでChannel Combinationを使ってRGBを合成しカラー画像を作成しています。

(7) PhotometricColorCalibration(PCC)

Color CalibrationにはPhotometricColorCalibration(PCC)を利用しました。Photometry ParametersのLimit Magnitude=16、Aperture=16に変更し、Background Neutralization用のBackgroundを設定して実行しています。Limit MagnitudeとApertureはその後のPCCの調査でわかったように最初はデフォルト通りAutoからスタートするのがよかったかもしれません。

(8) ArchsinhStretch

RGBのカラー画像はArchsinhStretchとHistogramTransformationを併用しました。最初にArchsinhStretchをある程度の色が出るところまでかけています。実は、私にとって初めてのArchsinhStretchの使用です。これまで検証用に使ってきましたが、どうも狙い通りの色にならず本番への使用を避けてきました。しかし軽くかければ問題ないことがわかり、今回から使用しています。

(9) HistogramTransformation(HT)

つぎにHistogramTransformation(HT)でカラー画像のストレッチを終えます。今回は先にArchsinhStretchをし、最後にHTで仕上げました。しかしArchsinhStretchの先人であるだいこもんさんそーなのかーさんに後から聞いたのですが、先にMaskedStretch, HTなどである程度ストレッチをしておき、ArchsinhStretchは最後にかける方が結果が良いそうです。

この時点でここまでコントラスト、彩度をあげています。

RBGのストレッチ後
RBGのストレッチ後

彩度を強めにしているのはLRGB合成すると全体に色が薄くなる傾向があるためです。彩度はArchsinhStretchを使って高めました。RGB処理はここまで。次にHαの処理です。

Hαイメージ処理

(10) Jetの抽出処理

今回の画像処理の目玉、Jetの抽出処理です。Hα領域に写るケンタウルスAのジェットは非常に淡いことが予想されます。そのためHαを43時間50分撮影し、そのうち状態の良い画像を選定し33時間40分を採用しています。

銀河から左上に伸びるジェットが写っていますが少しわかりにくい。

Hα領域のジェット

今回使用したHαフィルターは656nm近辺を中心に7nmの幅で撮影します。Hαフィルターという名前からHα輝線だけが撮影されそうですが、実際には連続光も多く、Hαは連続光の中に紛れてしまいます。この写真でも星や銀河のハローは連続光です。

連続光にまぎれるHα輝線

ジェットをはっきり見るためにはこの連続光を取り除きたいわけです。同じ帯域幅をもつ645nmのフィルターで撮影して差し引くのが良いのですが、そんなフィルターは持っていません。そこで代替策としてHαに近い領域の可視光のRフィルターを使うことにします。連続光成分はそんなに変わらないだろうとの考えです。

RフィルターとHαフィルターの関係
RフィルターとHαフィルターの関係

問題はRフィルターとHαの帯域幅が異なること。しかし撮影される二つの画像の連続光の明るさは帯域幅に比例すると考えられます。そこで二つの画像の明るさを合わせるため、Hαフィルター画像を100倍した画像から、Rフィルタ画像を7倍した画像を差し引いてみます。リニアなHαとRフィルターの画像を使って、PixelMathで次の式で計算します。

ジェットの画像 = ((Hα x 100) – (R x 7)) / (100 – 7)

するとなんと・・・

HαからRを差し引いた画像(この画像も誌面掲載されました)
HαからRを差し引いた画像(この画像も誌面掲載されました)

見事にフィラメント構造が浮き上がりました。この瞬間が一番感動しました。ちなみにこの手法は私のオリジナルではなくPixInsightでHα画像をRGBにブレンドするときによく使われています。アカデミーの世界でも使われる手法のようです。大学で研究している娘に、父の威厳をこめて手法を自慢したら「うん、よくやってるよー」って言われましたww

この画像は本来ジェットをカラーにブレンドするための中間画像ですが、これ自体で面白いので一つの作品として扱うことにしました。

(11) ブレンド画像作成

ジェットの画像はできたものの、これをカラー画像に自然にブレンドするのはひと工夫が必要でした。ジェットがとても淡いため背景のムラが無視できないのです。知人の雑賀さんによれば、これはセンサーごとに感度の差があることから生じるセンサー固有のパターンノイズだろうとのこと。ダークで取るべきノイズですがジェットがとても淡い。そのためジェットの強調処理により、ダークで引ききれないノイズが見えてしまったのと思います。

いろいろ工夫してみましたが、通常のHαのカラーへのブレンド手法では赤被りを免れません。そこで選択的に対象を処理するマスクを作ることにしました。実は私は、先日から画像処理の自分ルールを規制緩和しました。「マスクは塗っても良い」ということにしています。一度始めると規制緩和はこれからも進むことが予想され、来年の今頃には「CGで描いても良い」とか「ハッブルの画像とまぜても良い」とかならないか、今から心配をしています。

作ったマスクはジェットと銀河のHII領域(いわゆる赤ポチ)の抽出用のマスクです。

ジェット抽出用のマスク
銀河の赤ポチ抽出用のマスク
銀河の赤ポチ抽出用のマスク

マスク作成には禁断のCloneStampを使いました。GAMEというマスク作成用のより便利なScriptも最近見つけたので、今後は(節度を保って)GAMEも活用しようと思います。

ブレンド用に抽出したジェットと赤ポチがこちらです。

抽出したジェットと銀河の赤ポチ
抽出したジェットと銀河の赤ポチ

これ以上の淡い部分の抽出も可能だったのですが、ノイズとの差がわかりにくいのでこれくらいに留めました。Hαは40時間以上の露出をして、撮れ高はこれだけでした。

(12) カラー画像へのHαのブレンド

生成したブレンド用画像をRGBにPixelMathを使って合成します。ジェットは目に見えないので何色にしても良いのですが、配合比率はRを強めに56%、G,Bを少しいれてGを23%、Bを21%としました。

Hαの配合比率
Hαの配合比率

それっぽい(?)色になったと思います。

Hαをブレンド
Hαをブレンド

ささやかな変化ですが、ジェットを入れてみるとアクセントになりますし、銀河もHαを加えることにより少し華やかになったかなと思っています。

RGBとHαの処理はこれで終わりです。つづいてLuminanceです。

Lイメージ処理

(13) Deconvolution

DBEを済ませたL画像にDeconvolution処理をします。私のDeconvolutionの基本方針は下記の3つです。

  • Global dark=0
  • マスクとして自分自身のクローンを使用
  • Local Supportに手間をかける

これらの方針はDeconvolutionの解説1解説2をご参照ください。

Local Supportの画像として使用したのはこちらです。

Local Support画像

Local Support画像のでき一つでDeconvolutionのクオリティは大きく変わります。星の大きさ、明るさ、銀河のハロー内の星の明るさなど、何度か調整を重ねました。リンギングを抑制するために銀河内の恒星の輝度を高めています。StarMask画像をベースに銀河周辺以外にマスクをかけた上で、MorphologicalTransformationやHTを使って強調をしました。

実行結果がこちらです。

Deconvolution結果
Deconvolution結果

暗黒帯部分が詳細になりました。効果が出ているようです。

(14) HistogramTransformation(HT)

L画像のストレッチはHistogramTransformationを使用しました。MaskedStretchも試してみましたが、HTの方が結果が良かったのでHTを採用しました。HTはShadowクリッピングとMidtoneの二つのスライダーを少しずつ詰めて、必要な分をストレッチしています。

(15) HDRMultiscaleTransform(HDRMT)

銀河の中心部の明るい部分の詳細に描画するためHDRMultiscaleTransformを実行します。いくつかのLayerを試したところ、Layer8が一番有効でした。私はいつもは6くらいが多く、8は大きな数字です。

HDRMTをLayer=8で実行
HDRMTをLayer=8で実行

効果は絶大です。ハローに埋もれてぼんやりしていた銀河の中心部がくっきりして、球体に見えます。Layerが8なので大きな構造に効いたのと思います。

LRGBHαイメージ処理

(16) RGBWorkingSpace, LinearFit

いよいよ最終行程LRGB合成に入ります。でもその前におまじないが必要です。L画像とRGB画像の合成において、ノイズレベルを低くするためには両者の明るさを一致させる必要があります。例えばRGBがLに対して暗いと、カラー画像からの背景のノイズが強くなってしまいます。

まず目でみてL画像とRGBのLの明るさを一致させます。RGBのL画像はCtrl + Shift + L(Macは⇧⌘L)で簡単に確認することができます。

目でL画像とRGBから取り出したL画像の明るさを合わせたあと、LinearFitを使用することでより厳密に両者の明るさを一致させます。しかしその前にさらにもう一つおまじないをします。RGBWorkingSpaceです。人間の目はGreenへの反応が一番良いため、PixInsightでカラー画像からL画像を取り出した時、RGBの比率はGが多く取り出されます。しかし今回は純粋に明るさを一致させる目的のため、L画像をカラー画像から取り出すときにRGBの比率を1:1:1にして取り出します。RGBWorkingSpaceを使用します。

ProcessメニューからRGBWorkingSpaceを起動し、RGBの比率に1を入力します。

RGBWorkingSpaceでRGB比率を1:1:1にする
RGBWorkingSpaceでRGB比率を1:1:1にする

▲をカラーにドロップして実行します。これでカラー画像からL画像を取り出す準備ができましたので、Process – ChannelManagmentメニューからChannelExtractionを実行してL画像を取り出します。さきほどRGBWorkingSpace処理をしているので、RGB比率は1:1:1でL画像は生成されます。

ChannelExtractionによるLの取り出し

L画像はExtract CIE L* Componentボタンからも取り出し可能です。こちらの方が簡単です。

Lの取り出しボタン

L画像も明るさと、抽出されたRGBのL画像の明るさを一致させるために、Process – ColorCalibrationメニューからLinearFitを実行します。Reference ImageはL画像を指定します。

L画像とRGBのLの明るさを合わせる

▲マークをRGBから抽出したL画像にドロップして実行するとRGBのL画像の明るさが、L画像と一致します。Process – ChannelManagementメニューのChannelCombinationで調整したL画像をRGB画像に戻します。

RGB画像にL情報を戻す

ちなみにこれら情報はPixInsightの下記のフォーラムで議論されたものです。10年以上前にたてられたスレッドですが、バイブル的にいまだによくみられていて累計で数万回のアクセスがあるそうです。Juan ConejeroさんというPixInsightのスタッフの方がコメントされています。

LRGB combination
Hi all.I have no data to play with and so I am studying Pixinsight to try to understand everything I can.Suppose you hav...

これでLRGB合成の準備ができました。いよいよLRGB合成です。

(17) LRGBCombination

前プロセスで明るさを合わせたRGBとL画像を合成します。Process – ColorSpacesメニューからLRGBCombinationを起動します。L画像を設定し、RGBはチェックをオフにします。

LRGBCombinationでLRGB合成

この設定でRGB画像に実行することで、カラーとLのマリアージュ。画像の雰囲気がガラッと変わるのでこれもドキドキする瞬間です。

LRGB合成
LRGB合成

うまくいっているようです。多くの場合、LRGB合成するとRGBより彩度が落ちます。LRGB合成してから彩度あげするより、RGB時点でコントラストを高めて彩度を上げておいた方がその後の画像処理に無理がかからない気がしています。今回もArchsinhStretchとHistogramTransformationを使って彩度を上げておきました。またCurvesTransformationのSaturationによる彩度あげは、後述のよっちゃん動画を見て、あまりやらないようにしています。

(18) LocalHistogramEqualization

今回の処理の最初のバージョンでは私はLocalHistogramEqualization(LHE)は使用していませんでした。LHEとは名の通り部分的にヒストグラムを均質化することで局所的にコントラストを上げる処理です。LHEは劇薬の側面もあり、使うともくもくと模様がでるのですが、ちょっと嘘くさい感じもしてしまいます。今回もHDRMTで銀河の球の形が出たのでスキップしました。

しかし天リフ編集長がリツイートした画像を見て考え直しました。あまり効かせすぎると人工的になるLHE。今回はAmountを弱めの0.4にして、Kernel Radiusを既定値の64と、少し大きめの124の2回実行しました。また星に影響が出ないようにStarNetで生成した星マスクをかけています。

LHEの実行
LHEの実行

中央の球がより立体的になったことと、ハローの濃淡も出てきました。人工的になっていないか心配でしたが、天リフ編集長のリツイート画像とも比較してほぼ同じ形状の濃淡でしたので、採用としました。

(19) De-Emphasis

星のまわりのにじみが目立つため、少し星を小さくする処理をいれました。EZ-StarReductionを試したところ、処理の跡がめだってしまいます。そこでEZ-StarReductionの原型となっているAdam BlockさんのDe-Empasisを調べ、私なりの処理を追加しました。処理のステップ数が長めですので、詳細は先日記載した「一手間かけて綺麗に星を小さくする 」をご参照ください。

(20) TGVDenoise

ノイズリダクションはTGVDenoiseを使用しています。次のパラメータを設定しました。

  • mode: CIE L*a*b*
  • Strength (Light): 0.05 (既定値の1/100)
  • Strength (Chrominance): 0.07 (既定値の1/100)
  • Edge Protection: 0.0284 (Backgroundの標準偏差を測定)
  • Support Image: 処理をかける画像のLを抽出して設定

Edge Protectionの標準偏差などTGVDenoiseの設定はこちらの記事にまとめています。

(21) HistogramTransformation(HT)

TGVDenoiseをかけることで背景のノイズが減ったので、HTでShadowをクリッピングし、背景を少し暗くしました。またミッドトーンをつめてコントラスをあげています。StarNetの星画像をマスクとして使っています。

HTによる微調整
HTによる微調整

(22) CurvesTransformation

CurvesTransformationによって明るさを最終調整しました。HTと同じくStarNetの星画像をマスクとして使っています。私はこれまでCurvesTransformationを使って彩度をあげることが多かったのですが、よっちゃんの動画を見てからSaturationによる彩度上げは自粛しています。目から鱗のこの動画、コントラストを上げることで自然に彩度を上げるという手法です。しかしトーンカーブをS字にするコントラスを上げは、ハイライトが飛んで苦しくなる印象があるため、コントラスト調整はおもにHistogramTransformationのミッドトーンを使っています。

最後に銀河周りが明るすぎてハローの構造がわかりにくくなっていたので、RGBの明るさを少し下げました。前述のようにSaturationによる彩度上げはしませんでした。

CT, HTによる最終調整
CT, HTによる最終調整

(23) DynamicCrop

530mmでは広角すぎることもあり、クロップをしました。面積で半分くらいにしています。もうすこい長焦点が欲しいなあ、と思わせます。

(24) 印刷用データ作成

最後に印刷です。私は高性能なプリンタを持っていないので印刷はプリントサービスのフジプリを活用しています。プリントすると画面より茶色っぽくなるのに苦しんでいましたが、ふうげつ*さんのこのリツートで解決しました。

ディスプレイのキャリブレーションのことは詳しく知りませんでした。私のMacのディスプレイは色温度設定が6500kですが、iPadは感覚的に少し青みがかっている印象があります。私は画像の最終チェックはiPadでしているため印刷すると茶色っぽく感じるのかもしれません。印刷用の画像は、色温度を変更することにしていますます。画像の色温度変更はPixInsightを離れAdobe Lightroomの色温度設定を使用しました。印刷すると色温度が下がることを考慮して、少し青側にシフトさせたバージョンも作りました。幸いにもフジプリはA4印刷でも200円未満ですので、設定を変えた4枚を印刷に出して一番見栄えがよいものを採用しました。

応募せずボツにして余った印刷画像は、作業している部屋の壁に貼っています。天リフの「星と宇宙の夏ライブ2021」を見てくださった方は、私の後ろに天体写真が貼っていたことにお気づきかもしれません。つまり壁に貼ってあるのは理想より色温度がずれているボツ写真なのです。

以上で完成です。正解のないのが画像処理。なにかの参考になれば嬉しいです。

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