
PixInsightには多くの画像処理プロセスがありますが、Deconvolutionは効果が大きく、しかも熟練が必要とされる必修プロセスです。大気の状況や撮影機材の性能により、本来シャープであった天体の画像はソフトになっていきますが、Deconvolutionはアルゴリズムによりもう一度、もとのシャープな画像に戻すというプロセスです。
私もマニュアル、テキスト、国内外サイトの先人の智恵を学んで、知識は増えてきたのでもっか練習中です。複数の情報を踏まえてプロセス自体への理解は深まりましたので解説します!
Deconvolutionはリニアステージで実行する
このあとに解説するPSFモデルはリニア画像を用いる必要があります。そのためDeconvolutionプロセスもリニアステージで実行します。通常はABEもしくはDBEでバックグラウンドを調整した後に実行します。以下の画像もABE実行直後に実行しています。PixInsightの全体フローはこちらを参照ください。
3つの事前準備
Deconvolutionの実施前に3つのファイルを準備します。
- Point Spread Function (PSF) モデル
- Star mask
- バックグラウンド保護用のマスク
一つずつ説明してきましょう。
PSFモデルの作成 – DynamicPSFの実行
まずPoint Spread Function(PSF)という手法を用いてモデルを作ります。星は本来は点像です。しかし大気の影響、光学機器の性能など様々な影響で点ではなくある程度の広がりのあるぼんやりした円として撮影されます。PSFモデルはその撮影環境によって点像である星が、どのような形に撮影されるか平均しモデル化した人工的な星です。Deconvolutionは雑にいうと、この点像をPSFモデルに変換する関数を作り、その逆関数を画像全体にかけることで、もとの映像を復元しようという手法です。
Process – <All Processes>からDynamicPSFを起動します。つぎに処理対象となる画像から明るすぎず、暗すぎないちょうど良い星をポチポチ選択します。ちょうど良い星は、表のA (Amplitude)の値が0.3〜0.8くらいで良い様です。Amplitudeが1は星が飽和(Satulate)しているという意味です。また0.2未満は暗すぎです。

100個以上の星を選択する必要があるのですが、これが意外に難しい。私がとっている方法は、「PCのモニタの明るさを最大にしてSTFをオフにして星を選択する」です。たまたまかもしれませんが、上記の状態で見える星を選択すると、ちょうど0.3〜0.8の間に入っていました。また星を選択するときはAmplitudeの値は気にせず、ひたすら120個くらいの星を選択します。一つひとつチェックしていると時間がかかりすぎるので一気に選択してしまいます。

星を120個ほど選択したら、採用する星を選びます。まずAmplitudeが0.3〜0.8の間の星を選択します。これには右下のソートボタンを押して、ダイアログボックスでAmplitudeを選択して実行するとAの列でソートされますので、上下の範囲からはずれた星を選択しーボタンで削除します。

次に、MAD列を確認します。MADとはMean Absolute Differenceつまり外れ量の絶対値の平均です。MADを使って大きく外れた値の星は削除し、似た星を集めます。これにはAmplitudeと同じ方法でMADソートします。

確認すると6.803e-04〜1.271e-02まで開きがありました。約20倍の開きです。どれくらいの範囲にいれるかは基準があまり設定されていませんが、今回は6.803e-04 ~3.656e-03までを採用しました。これで約4倍の開きの中に入っていることになります。
以上の作業で約60個の星が残りました。これらの星々を使って仮想的なPSFモデルの星を作ります。ここでふと思ってしまったのですが、採用するとかしないとか言っている星にも太陽系があり知的生命が住んでいるかも知れません。もしかしたら向こうからも「この星、つかえねぇ」とか言って太陽を非採用にしているのかもしれません。
それはさておきPSFモデル作成はControl+Aで星を全部選択し、カメラマークを実行します。

するとPSFモデルの星が小さいウィンドウに表示されます。これが今回の画像の平均的な星の形と言うことですね!
Star Maskの作成
処理から星を保護するためのStar Maskを作成します。これは簡単。ProcessからStarMaskを実行するだけです。通常はデフォルトのままでOKです。散開星団を撮影したときなど、明るい星をとくに保護したい場合はScaleをデフォルトの5から10など大きな値に変更すると良い様です。今回はデフォルトのまま使用しました。

バックグラウンド保護用のマスク生成
準備の最後はバックグラウンド保護用のマスク生成です。これはRangeSelectionを使用します。ノンリニアステージでRangeSelectionを使ったことがある方もいらっしゃると思います。ここはまだリニアステージなので、ストレッチしてからマスクを作る必要があります。まずマスクを作るために画像のクローンを作ります。これは画像のタブをPixInsightのデスクトップにドロップすることで作ることができます。

そのあとはクローンに対して通常のストレッチ処理をかけます。つまりSTFし、HitogramTransformationにデータを移し、クローン画像をストレッチさせます。

この処理はノンリニアステージの最初の処理と同じです。違いは元画像をストレッチするのではなく、クローン画像をストレッチすることです。詳しくはこちらを参照してください。
つぎにストレッチしたクローン画像を使ってマスクを作ります。ProcessからRangeSelectionを起動します。

今回の目的はバックグラウンド保護用なので、Invertをチェックして背景のマスクを作ります。また銀河周辺にも処理をかけたいのでUpper Limitを少し小さめの数字にして広く処理ができるようにしました。
作成したマスクは元画像を表示した状態でMask – Select Maskによりマスクを元画像に設定してください。その際にShow Maskを確認して背景側が赤くなっている、つまり背景を保護していることを確認ください。マスクの作り方、使い方はこちらも参照ください。
PSFの設定
作成したPSFを設定します。そのためにDeconvolution画面を起動します。Process – Deconvolution – Deconvolutionから起動してください。

PSFでExternal PSFタブを選択し、View Identifierから作成したPSFを選択します。
StarMaskの設定
次にStarMaskの設定です。DeconvolutionのDeringingとLocal deringingにチェックをいれ、Local Supportで作成したStar Maskを設定します。

これでPSF、StarMask、バックグラウンド保護用のマスクの3つの準備ができました。いよいよDeconvolution処理に入ります。
いよいよDeconvolutionの実行
Deconvolution画面で主に使うのは、Iterations、DeringingのGlobal dark、Global brightです。まずはこれだけなのですが、これがなんとも・・・何度も何度も試行錯誤をすることになります。初めての時は3時間かけました・・・。
まずはPreviewの作成
試行錯誤しますので、まずはPreviewを作ります。画像全体に処理をかけると時間がかかるので小さいPreviewを作ります。

今回は銀河と星が両方分かるようなPreviewを作りました。Previewの作り方はこちらをご参照ください。タブが茶色なのはマスクがかかっているからです。もし茶色になっていない場合は、マスクが有効になっていないのでマスクを確認ください。
Iterationは処理回数です。回数が多いほど効果が高いですがやり過ぎると逆に画像を壊すことになるのと、画像自体も不自然になります。20-50回くらいが良いとされています。DeringingのGlobal Darkは星の周りの黒いリングができるのを抑制、Global Brightは明るいリングができるのを抑制します。

Iterationsを10でためす
それではPreviewで実行してみましょう。まずはIterationを10からスタートします。またGlobal Darkのデフォルト値の0.1000は大きすぎるので小さくします。結果は・・・

まあ、こうなるわけです。ここから苦闘が始まります。Previewでなんどもうまく行くまで試してみてください。黒いリンギングが出たときはDarkを増やし、白い場合はBrightを増やします。ポイントはいきなり増やさず「そ〜っと」やることです。処理済みの画像に上からかけるといったん処理をリセットしてかけ直してくれるようですが、私は念の為、Control+Shift+Z(MacはShift+⌘+Z)で元に戻してから実行しています。それで実行すること十数回、ようやくまともな画像ができました。

上記画像は、Global Darkが0.005、Global Brightが0.001です。それくらいそ〜っとやります。
また今回は発生しませんでしたが、他の画像でつぶつぶしたノイズが発生したときにもGlobal brightを少しかけることは私の画像では有効でした。
Wavelet Regularizationでノイズ削減
Wavelet Regularizationはノイズを削減する機能です。主に変更するパラメータは、Layer数の変更とNoise threshold、Noise reductionです。
Wavelet layers: レイヤー数設定。画像にある構造の大きさごとにレイヤー分けされ、個別にノイズ処理される。
Noise threshold: 数字が大きいほど大きな構造にもノイズ削減処理
Noise reduction: ノイズ削減強度。1が最高。
今回はデフォルトのまま使用しました。画像によっては、Layer2のNoise thresholdを少し増やしたり、Noise Reductionを増やしたりすると効果があるようです。多くのノイズはLayer1と2に乗っているようですが、Layerを一つ増やしてノイズ削減をすることも有効のようです。

Iterationsを増やす
次にIterationを50に増やして新しいPreviewに実行してみます。すると星の回りにリンギングができてしまいました。Global Darkを少し増やし0.005から0.01に変更して再実行したところ今度はうまくいっているようです。
全体画像のPreviewで試す
今度は一部の画像ではなく画像全体にDeconvolutionを実行します。今回もPreviewで実行します。そのため元画像のタブを下にドラッグドロップして画像全体のPreviewを作ります。画像全体のPreviewに実行したところ、やはりリンギングができたのでGlobal Darkを0.012に増やしたところ、うまく行ったので採用することにしました。

元画像に実行
これでPreviewでの処理が終わったので、元画像に処理をかけます。元画像をタブで選んで■ボタンで実行です。完成したのがこちら。

銀河の詳細が浮かんできてシャープになっています。
・・・とまあ、気軽に書いていますがこれを得るのに実行すること数十回。とくに画像が大きくなってくると処理時間がかかるので大変です。でもそれに見あう様に思っています。ん? そんなでもない・・・? 画像処理は地道な積み上げんなんです!!
今回はPixInsightのDeconvolutionについて解説しました。PixInsightの全体プロセスはこちらを参照ください。
あわせて読みたい
この記事を記載してから10ヶ月。Deconvolutionは荒れ球の豪速球投手みたいなもので、なかなか登板機会が限られていました。変な風になっちゃう。しかし我々の界隈で前進がありました。kさんが編み出したテクニックをだいこもんさんが検証の上、Deconvolutionのメカニズムの解説とともに詳細にまとめています。必読です!
私も議論した内容に独自の工夫を加えてDeconvolutionプロセスを改善しました。
私のこの記事はTwitterを始めるまえに書いたものです。10ヶ月たって仲間ができ、こうしてみんなで検証できるのも、私には夢のようです。