天文はかせ幕下

リニア画像でLRGB合成する

LRGB合成はストレッチしたノンリニアの画像に対して実行せよーー

しかし後述の事情により、それが顧問には若干の不満でした。今回は、リニアの画像で実行できるLRGB合成について紹介します。

事の起こり

チリリモートの運用をきっかけに、顧問はモノクロCMOSカメラを使うようになりました。そこで障壁となったのが表題の「LRGB合成」でした。色が出なかったり、明るい星が破綻したり。でも、ゴニョゴニョやっている内に上手く行ったりして

「お、悟ったかも?」

なんて、別の画像を処理するとまたエラーが出ます。

要は根本的な原理を理解していなかったのです。最近Twitter上で議論を交わしていました。そのあたりは、Samさん、丹羽さんのブログにまとめられています。

最後のトドメで、蒼月さんが明快な解説動画をアップしてくれました*1

youtu.be

上を熟読・熟視聴していただければわかる通り、LRGB合成は

「LとRGBそれぞれにある程度のストレッチを施して明るさをそろえたノンリニア画像について行うべし」

というのが正解です。

ですが申し訳ない・・・。顧問には少し不満(というか不安)がありました。

どこまでストレッチすればいいの?

リニア段階での処理は画一的であり得るけれど、ノンリニアの処理は各人の好みの要素が入ってきます。ですのでLRGB合成の前に行うストレッチの強さも「ある程度お好みで」です。

それが顧問には不満でした。お好みでって言われるとわからなくなっちゃうのです。

今までもっぱらカラーカメラで撮影していたために、リニアなカラー画像に対しして、ノンリニアの処理を行い続けてきました。顧問の場合はそこにこそ画像処理のノウハウが蓄積されているために、モノクロ画像にたいして「ある程度」のストレッチと言われても何をしていいのか分からず、「えーどうしよ」となってしまうのです。

 

つまり欲していたのは、リニア画像で行うLRGB合成です。

使用する画像

本題に入る前に今回の説明で使用する画像を紹介します。チリで撮影したNGC3293です。

左がL画像、右がRGB画像です。

右のRGB画像からモノクロ画像を抽出し、それを「Lc画像」と呼ぶことにします。下にLとLcを並べてみました。見た目はほとんど同じです

ヒストグラムを比較すると、下のように、L画像の方が右に寄っていて、Lcよりもかなり明るいことが分かります。

単純にLinearFitで合わせても破綻する

LRGB合成を行う前に、Lc画像を基準にしてLにLinearFitを行い、L画像とRGB画像の輝度を一致させます。Linear Fitによってほぼ完全にヒストグラムを合わせることができます:

うえの状態でLRGB合成すると、これは上手く行かなくて、例えば中央下の散開星団は以下のように中心部が破綻してしまいました

原因はおそらく、Lc画像がノンリニアであるためです*2

RGB画像からLc画像を抽出する過程では、ノンリニアなストレッチが行われています。色によって明るさのの感じ方が異なる人間の目の特性を反映するためです。ですので、L画像とLc画像のLinearFitは、リニア画像とノンリニア画像のフィッティングになっており、本質的に上手く行かないようです。

もちろん、この例でもL画像とRGB画像をそれぞれ「ある程度」ストレッチすれば、破綻の無いLRGB画像が得られます。

リニア画像でLRGB合成する方法

Pixinsightのスクリプトは、世界中のガチ天たちがこれまでに作成してきた機能が盛り込まれていて、未開拓の機能がたくさんあります。

「もしや・・・」

と思って探してみると、あるではないですか

"Create a linear LRGB"とありますね。ウインドウもとても単純。単にL画像とRGB画像をそれぞれお指定してあげれば実行できます。さっそく、LinearFit後のL画像とRGB画像を指定して実行してみます。

おお、だいぶん良いようです。よーく見ると星の中心部がすこしシアンに寄っていますが、これくらいならのちの処理で何とかなります。

この方法は使えそうですね! でも一体、中ではどんな処理が行われているのでしょうか?

HSI空間でのLRGB合成

Pixinsightのスクリプト

     Prigram Files > Pixinsight > src > scripts

に保存されていて、テキストエディタで開けばその中身を見ることができます。このスクリプトは単純で何とか解読出来ました。どうやらRGB画像をHSI色空間に変換したあとにH(色相)、S(彩度)、I(明度)に分解し、I(明度)画像をL画像で置き換えることでLRGB合成を行っているようです。

重要なのはHSI空間におけるI(明度)が、R,G,Bの単純な平均として定義されていることです。モノクロカメラで得られるL画像も、R,G,Bのすべての波長帯をカバーするフィルターを通して得られているので、I(明度)の定義はL画像と合致しています。

蛇足:念のため確認

LinearLRGBのスクリプトが、たしかにHSI空間でのLRGB合成であることを確かめてみます。まず、ChannelExtractionを使って、RGB画像からH画像とS画像を取得します

Color Spaceを”HSI”に選んで、ChannelsにHとSiを指定してあげれば、目的の画像が得られます。

そうしたら、下記のようにChannelCombinationでHSI色空間を選んでおいて、うえのH, Siを指定したうえで、I画像をL画像で置き換えて合成します。

すると、先ほどのLinearLRGBスクリプトとまったく同じ画像が得られることを確認しました。

ちなみに、HSIの代わりにCIEL*a*b*を選ぶと、LRGB Combinationとまったく同じ画像が得られることも分かります。確かにLRGB Combinationは、L*a*b*色空間を利用しているようです。

結論です

HSI色空間を使うことで、リニアでも破綻しないLRGB合成を行うことができました。

ただし、L*a*b色空間で行われる通常のLRGB合成で得られた画像と比較すると、暗部のノイズはL*a*b色空間のLRGB合成のほうがHSI空間で実施したそれより、若干優れているようでした。この辺の理屈はまだ理解できていませんが、マスクをつかって両者の「いいとこどり」するとさらに良い結果が得られると思います。

 

うん、でも全体として理解度はまだ半分くらいで、もうすこし色空間の勉強が必要そうです。

*1:ちなみに解説には私の画像が使われています

*2:Lc画像がノンリニアであることの説明は、上記の蒼月さんの動画のこのあたりで説明されています