一手間かけて綺麗に星を小さくする 〜 PixInsightの画像処理

再処理によって完成したかのように見えたケンタウルスA。実はひとつ問題を抱えていたのです。それは・・・

星の周りに黒い輪
輝星の周りに黒い輪

等倍で見ると輝星の周りに黒い輪、つまりリンギングができています。EZ Star Reductionの副作用でしょう。このリンギング、なかなかの難物で頑張っても一向にとれません。一時は我が家に伝わる999の秘密の一つとして墓場まで持っていく決意を固めた私ですが、それもあまりにもというもの。七転八倒の末、ようやく目立たないくらいまで抑制することができました。

リンギングを抑制

EZ Star ReductionはAdam Blockさんの開発したDe-Emphasisという手法をもとに開発されています。今回はこのScriptを使わずに、ひとつずつマニュアルで実行することで調整弁が増え、よりよい処理ができると考えました。De-Emphasisをベースにオリジナルのプロセスもいくつか加えています。

また一つ発見がありました。EZ Star Reductionはあまりに簡単に星を小さくできるので、少し後ろめたいインチキに感じさせますが、原理を知るとまったくそんなことではありませんでした。正当な処理と言えるものです。星は単に形状を小さくしているのではなく、輝度マスクを使って撮影した星の明るさにそって形状を作っています。これは処理の中で解説しますね。

EZがあまりにイージーでしたので、これからの説明はちょっと面倒に思えるかもしれません。しかし一度実施してしまうと、手順は多いもののそれほど煩雑ではありません。私もパラメーターを決めるまで何度もやりなおしを要しましたが、無理なくできました。同じ悩みを持った方は、お試しいただけると嬉しいです。

De-Emphasisの原理

De-Empasisの解説はこちらで見ることができます。

タイトルにEZとありますが、EZスクリプトではなくて本家のDe-Emphasisです。このDe-Emphasisにいくつかステップを加えて完成させました。まず原理を確認しましょう。De-Emphasisは3つのステップからなります。

De-Emphasisの原理
De-Emphasisの原理

最初は星無し画像の作成です。StarNetを使えば簡単です。次に星より大きなハロマスクを作り、そこから星の画像を差し引いてドーナツマスクを作ります。最後に処理をしたい画像にドーナツマスクをかけて、星無し画像を流し込みます。ドーナツマスクを作るときに、型抜きのように真ん中をぬいたものが最終的な星の形になりますが、これにはL画像をそのまま使います。これにより恣意的に星を小さくするのではなく、撮影した画像をそのまま使って星の形をつくっています。

では処理フローの解説です。調整できるパラメータが多いので、パラメータはその都度、別枠で記載しました。

(1) 背景を作成

最初にRGBWorkingSpaceを実行し、L画像生成のための情報を補正します。PixInsightはカラー画像からLを生成するときにRGBWorkingSpaceの値を利用します。RGBWorkingSpaceのLuminance CoefficientsでLを取り出すときのRGBの比率を設定が可能です。人間の目が緑色に強く反応するので既定値ではGの比率が高くなっていますが、マスクを作る場合は同じ比率の方が良いようです。Process – Color SpacesからRGBWorkingSpaceを起動します。

RGBWorkingSpace
RGBWorkingSpace

Luminance CoefficientsのRed、Green、Blueに1.0を設定します。▲マークを元の天体画像にドロップして設定完了です。

次に背景をつくるための画像を用意します。天体画像のタブをワークスペースにドロップしてクローン画像を作成します。

背景画像の元をつくる

タブをダブルクリックして「sub」という名前に変更します。

つぎに背景作りです。Process – MaskGenerationメニューからStarNetを起動します。

StarNet
StarNet

このプロセスでは星マスクは使いませんが、あると後続の処理で何かと便利なのでCreate star maskにチェックをして実行します。

星無し画像の名前をsubに変更

この画像の明るさを調整することで、星を流し込んだ時に自然にすることができます。

次はドーナツマスクです。

(2) ドーナツマスクの作成

天体写真に対してProcess – ChannelManagementメニューのChannelExtractionを実行するか、Lを取り出すボタンを押してL画像を作成します。

L画像の取り出し

取り出したL画像は、タブをダブルクリックしてhalosという名前をつけておきます。

L画像の名前をhalosに変更

Process – MultiscaleProcessingからMultiscaleLinearTransform(MLT)を起動します。

MultiscaleLinearTransform

Layerの1とRをXにして▲マークを画像にドロップして実行します。

MLTを実行

すると星マスクが取り出されました。StarNetで作られた星マスクを使っても良いのですが、StarNetの方はシャープすぎて今回の用途には使いにくいので、MLTで作っています。これがハロマスクの元になります。

次に白黒の二値化します。Process – IntensityTransformationメニューからBinarizeを起動します。

Binarize

RGB/Kの値は重要です。ここに入れた値より明るいピクセルが白く、小さいピクセルが黒くなります。微光星に対してStar Reduction処理をかけると処理のあとが残ってしまう場合があります。

ハロに食い込んだ処理後

微光星などすでに小さい星はこれ以上小さくする必要がない場合は、ある程度以上の大きさのある星が処理対象になるようにRGB/Kを設定します。

<パラメータ調整>
BinarizeのBinarization ThresholdのRGB/Kの値を大きくすることで大きな星のみが処理対象になる。小さくすると微光星も処理に含めることができる。小さな星をそれ以上小さくして副作用をおこさないようにするには、Binarization Thresholdは結果を見ながらある程度以上の大きさを設定する。

実行すると二値化された画像ができます。

Binarizeされたハロマスク

どの星をStarReductionの対象にするかで結果が大きく変わりました。Binarizeのパラメータ調整はなんども試すのがおすすめです。

(参考) 対象とする星をより細かく指定する

今回の私のケースでは、小さい星を対象から外したい時にBinarizeだけではうまく行きませんでした。そのためBinarizeに加えて、MorphologicalTransformationを使って一定の大きさの星のみを抽出しています。Process – MorphologyメニューからMorphologicalTransformationを起動します。

大きな星を抽出する
大きな星を抽出する

OperatorでClosing (Erosion + Dilation)を選択します。これにより、いったん星を小さくしてから大きく戻します。小さくした段階で小さな星は消えるため、元に戻すと大きな星のみが残るわけです。Sizeによって残す星の大きさを調整します。今回は5 (25 elements)を選択しました。

Erosion + Dilation

大きな星だけをのこすことができました。これをハロマスクの元データにします。

ハロを大きくします。Process – MorphologyメニューからMorphologicalTransformationを起動します。

ハロを大きくする
ハロを大きくする

OperatorはDilation (Maximum)を選択します。Sizeによりハロの大きさを決めます。まずは7くらいからスタートします。

<パラメータ設定>
MorphologicalTransformationをDilation指定したとき、Sizeの大きさで消すハロのサイズが決まる

できたデータのエッジをスムーズにします。Process – ConvolutionメニューからConvolutionを起動します。

エッジを滑らかにする
エッジを滑らかにする

StdDevの値によって、実行時にハロの消し方が変わります。まずは既定値の2.00を試して効果によって調整ください。

<パラメータ調整>
ConvolutionのStdDevを小さくすると星を小さくするとき、ハロがシャープに強く消える。大きくするとハロが広く柔らかに消える。

ここでいったんハロマスクを天体画像に設定し、ハロの大きさが適切かチェックします。

ハロの大きさをチェック
ハロの大きさをチェック

黒い部分がハロを消す処理対象となる箇所です。私は少しハロを大きめにとっています。大きめにしつつ、あとで実行するStar Reductionの処理の強度を弱めることで、自然にする作戦にしました。

次にドーナツの輪を作ります。Process – ChannelManagementメニューのChannelExtractionを実行するか、Lを取り出すボタンを押してL画像を作成します。タブをクリックして名前をlumに変更します。

L画像ができたらいよいよドーナッツの作成です。Process – PixelMathメニューのPixelMathを起動します。

PixelMathでドーナッツ作成
PixelMathでドーナッツ作成

計算式として、halos – lumと記載し、Replace target Imageを選択してハロマスクに▲マークをドロップします。すると大きな星であるhalosから小さい星のlumが引かれてドーナッツマスクができます。

ドーナツマスク
ドーナツマスク

中央の穴が星の形になります。この形はL画像から生成しているのがポイントで、単に星を小さくするだけではなく、自ら撮影した画像を使って星を形成しているため「正しく小さくできる」と言えると思います。

HistogramTransformationを使ってドーナツマスクの明るさを調整します。

HTで明るさを調節する
HTで明るさを調節する

Adam Blockさんのビデオではマスクを明るくしていましたが、私は逆に暗くした方が良い結果が出ました。

明るさを調整したドーナツマスク
明るさを調整したドーナツマスク

小さいドーナッツと大きいドーナッツで明るさに違いがあります。調整するために、「このマスクのクローンを作って、そのままマスクに設定」します。

自分自身をマスクとして設定
自分自身をマスクとして設定

こうすると、明るい場所はより強く、暗い場所は弱く処理をかけることができます。HTを使って全体を暗くすると明るいドーナツがより暗くなり、明るさがそろいます。

完成したドーナッツマスク
完成したドーナッツマスク

これでドーナッツマスクの完成です。

<パラメータ設定>
ドーナッツマスクの明るさをHTを使って調整。明かるいと強くハロが消え、暗いと弱く処理がされる。またドーナツマスク自身のクローンをマスクとして設定することで、ドーナッツの明るさを一定にできる。

最後に星を小さくする処理です。

(3) ドーナッツに背景を流し込む

Mask – Select Maskメニューを使って、作成したドーナッツマスクを天体画像に設定します。

ドーナッツマスクを設定
ドーナッツマスクを設定

次にProcess – PixelMathメニューからPixelMathを起動し、計算式として「sub」と入力します。subは最初にStarNetで作成した星無し画像です。

背景画像を流し込む
背景画像を流し込む

▲マークを天体画像にドロップすると画像がドーナッツに流し込まれます。subとだけ書いてあるので画像をsubの星無し画像に置き換えに行きますが、マスクがかかっているのでドーナッツ部分だけが置き換わります。またマスクの明るさに応じて置き換え量が決まります。そのためドーナッツマスクの明るさを調整することで、どれくらいハロを消すかコントロールできます。

処理前と後
処理前と後

流し込まれた画像と背景の明るさが合わないことがあります。このときは流し込むsub画像の明るさをHTを使って変更します。

subの明るさ調整
subの明るさ調整

不自然な場所があった場合、PixelMathの実行とUndoを繰り返しながら明るさを調整します。

<パラメータ調整>
ドーナッツに流し込んだ画像と元画像の明るさが合わない場合、HTを使ってsubの明るさを調整する。

今回は一回だけStar Reductionのを処理しましたが、複数回にわたって少しずつ小さくしていくのも有効です。そのときはドーナッツマスク作成以降を繰り返してください。

もう一つTipsを紹介します。

(Tips) 明るい星の処理

処理をしていると明るいハロが大きな星で消しきれず、このようになることがあります。私もかなり悩まされました。

ハロが消しきれない

これに対処するには2通りの方法があります。

(作戦1) 明るい星に大きめのハロマスクを作る
(作戦2) 明るい星は、処理対象から除外する

どちらの方法も、まずは明るい星のハロマスクが必要です。早速作ってみます。

今回はStarNetの画像から明るい星を取り出すことにします。元の天体写真のL画像に対してStarNetを実行します。

StarNetで作った星マスク
StarNetで作った星マスク

後で処理をしやすいようにHistgramTransformationで明るくします。ミッドトーンを左に、シャドークリッピングを右にします。

星マスクをHistogramTransformationで明るくする

ここから明るい星を取り出します。取り出しにはMorphologicalTransformationを使います。Process – MorphologyメニューからMorphologicalTransformationを起動しましょう。

MorphologicalTransformationで明るい星を取り出す

OperatorでClosing (Erosion + Dilation)を選択します。一度小さくしてから大きくするので、大きな星だけが残ります。とても大きな星だけを取り出すためにSizeは15を選択しました。これはどれくらいの大きさの星を取り出すかによって実験的に決定ください。

<パラメータ調整>
大きな星のハロマスクをつくるためにMorphologicalTransformationを使用。Closing (Erosion + Dilation)を選択し、Sizeの値を変更することで取り出す星の大きさを調整する。

L画像に対して処理を実行します。

大きな星を取り出す
大きな星を取り出す

名前はBigに変更しました。Process – IntensityTransformationメニューからBinarizeを起動し、Binarizeをします。

Binarizeをする

これで下準備が完了しました。

(作戦1) 明るい星に大きめのハロマスクを作る

大きな星のハロマスクに再びMorphologicalTransformをかけ、必要な分だけ大きくします。

大きな星のハロマスクを大きくする

この大きさが大きな星のハロマスクの大きさになります。

<パラメータ調整>
大きな星のハロマスクの大きさは、MorphologicalTransformで調整する。この大きさが消し去るハロの大きさとなる

できあがった大きな星のハロマスクを、上記でConvolutionする直前のハロマスクに足し合わせます。足し合わせはPixelMathを使用します。計算式は「halos + big」と記載します。

ハロマスクに大きな星のハロマスクを追加
ハロマスクに大きな星のハロマスクを追加

するとハロマスクに大きな星が追加されます。

大きな星のハロマスクを追加
大きな星のハロマスクを追加

あとはConvolution処理以降を進めます。

(作戦2) 明るい星は、処理対象から除外する

こんどは逆に大きな星をマスクから消します。上記のPixelMathで「halos + big」としたところを、「halos – big」とします。

大きい星を処理対象からはずす

これをハロマスクに処理すると、ハロマスクから大きな星のハロが消えます。

いかがでしたでしょうか。処理手順が長いので大変かと思いますが、実は一度やってみると二回目からは楽です。せっかく夜通しで撮影した画像。一手間加える価値はあるように思います。

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